1. 深入理解Java中四種創(chuàng)建對(duì)象的方式

        共 8567字,需瀏覽 18分鐘

         ·

        2021-12-27 14:03

        上一篇:Intellij IDEA 神級(jí)插件!效率提升 10 倍!

        作者:六尺帳篷
        鏈接:https://www.jianshu.com/p/7584b028cbda


        調(diào)用new語句創(chuàng)建對(duì)象

        // 使用java語言的關(guān)鍵字 new 創(chuàng)建對(duì)象,初始化對(duì)象數(shù)據(jù) 
            MyObject mo = new MyObject() ; 


        調(diào)用對(duì)象的clone()方法

        MyObject anotherObject = new MyObject();
        MyObject object = anotherObject.clone();
        使用 clone()方法克隆一個(gè)對(duì)象的步驟:
        1.被克隆的類要實(shí)現(xiàn) Cloneable 接口。
        2.被克隆的類要重寫 clone()方法。
        原型模式主要用于對(duì)象的復(fù)制,實(shí)現(xiàn)一個(gè)接口(實(shí)現(xiàn) Cloneable 接口),重寫一個(gè)方法(重寫 Object 類中的 clone 方法),即完成了原型模式。
        原型模式中的拷貝分為"淺拷貝"和"深拷貝":
        (Object 類的 clone 方法只會(huì)拷貝對(duì)象中的基本數(shù)據(jù)類型的值,對(duì)于數(shù)組、容器對(duì)象、引用對(duì)象等都不會(huì)拷貝,這就是淺拷貝。如果要實(shí)現(xiàn)深拷貝,必須將原型模式中的數(shù)組、容器對(duì)象、引用對(duì)象等另行拷貝。)

        原型模式的優(yōu)點(diǎn)。

        原型模式的使用場(chǎng)景。

        因?yàn)橐陨蟽?yōu)點(diǎn),所以在需要重復(fù)地創(chuàng)建相似對(duì)象時(shí)可以考慮使用原型模式。
        比如需要在一個(gè)循環(huán)體內(nèi)創(chuàng)建對(duì)象,假如對(duì)象創(chuàng)建過程比較復(fù)雜或者循環(huán)次數(shù)很多的話,使用原型模式不但可以簡(jiǎn)化創(chuàng)建過程,而且可以使系統(tǒng)的整體性能提高很多。


        運(yùn)用反射手段創(chuàng)建對(duì)象

        我們先介紹一下反射:

        反射的定義

        哪里用到反射機(jī)制?

        jdbc 中有一行代碼:Class.forName('com.mysql.jdbc.Driver.class');//加載 MySql 的驅(qū)動(dòng)類。這就是反射, 現(xiàn)在很多框架都用到反射機(jī)制, hibernate, struts 都是用反射機(jī)制實(shí)現(xiàn)的。搜索公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師回復(fù)“2T”,送你一份驚喜禮包。

        反射的實(shí)現(xiàn)方式

        在 Java 中實(shí)現(xiàn)反射最重要的一步, 也是第一步就是獲取 Class 對(duì)象, 得到Class 對(duì)象后可以通過該對(duì)象調(diào)用相應(yīng)的方法來獲取該類中的屬性、方法以及調(diào)用該類中的方法。
        有 4 種方法可以得到 Class 對(duì)象:

        實(shí)現(xiàn) Java 反射的類

        注意:Class類是Java反射中最重要的一個(gè)功能類,所有獲取對(duì)象的信息(包
        括:方法/屬性/構(gòu)造方法/訪問權(quán)限)都需要它來實(shí)現(xiàn)。

        反射機(jī)制的優(yōu)缺點(diǎn)

        優(yōu)點(diǎn):

        缺點(diǎn):


        運(yùn)用反序列化手段

        序列化與反序列化

        Java序列化是指把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過程;而Java反序列化是指把字節(jié)序列恢復(fù)為Java對(duì)象的過程。

        為什么需要序列化與反序列化

        我們知道,當(dāng)兩個(gè)進(jìn)程進(jìn)行遠(yuǎn)程通信時(shí),可以相互發(fā)送各種類型的數(shù)據(jù),包括文本、圖片、音頻、視頻等, 而這些數(shù)據(jù)都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。那么當(dāng)兩個(gè)Java進(jìn)程進(jìn)行通信時(shí),能否實(shí)現(xiàn)進(jìn)程間的對(duì)象傳送呢?答案是可以的。如何做到呢?這就需要Java序列化與反序列化了。換句話說,一方面,發(fā)送方需要把這個(gè)Java對(duì)象轉(zhuǎn)換為字節(jié)序列,然后在網(wǎng)絡(luò)上傳送;另一方面,接收方需要從字節(jié)序列中恢復(fù)出Java對(duì)象。基本原理和網(wǎng)絡(luò)通信是一致的,通過特殊的編碼方式:寫入數(shù)據(jù)將對(duì)象以及其內(nèi)部數(shù)據(jù)編碼,存在在數(shù)組或者文件里面然后發(fā)送到目的地后,在進(jìn)行解碼,讀出數(shù)據(jù)。OK到此顯示出來為我們所用即可。
        當(dāng)我們明晰了為什么需要Java序列化和反序列化后,我們很自然地會(huì)想Java序列化的好處。其好處一是實(shí)現(xiàn)了數(shù)據(jù)的持久化,通過序列化可以把數(shù)據(jù)永久地保存到硬盤上(通常存放在文件里),二是,利用序列化實(shí)現(xiàn)遠(yuǎn)程通信,即在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列。

        對(duì)象序列化

        import java.io.FileInputStream;
        import java.io.FileNotFoundException;
        import java.io.FileOutputStream;
        import java.io.IOException;
        import java.io.ObjectInputStream;
        import java.io.ObjectOutputStream;

        /*
         * 序列化流:把對(duì)象按照流一樣的方式存入文本或者在網(wǎng)絡(luò)中傳輸;  對(duì)象 ---> 流 :ObjectOutputStream
         * 反序列化流:把文本文件中的流對(duì)象數(shù)據(jù)或者網(wǎng)絡(luò)中的流對(duì)象數(shù)據(jù)還原成對(duì)象。   流---> 對(duì)象 :ObjectInputStream
         */

        public class ObjectStreamDemo {
            public static void main(String[] args) throws IOException {
                // 序列化數(shù)據(jù)其實(shí)就是把對(duì)象寫到文本文件
                //write();
                read();
            }

            private static void read() throws IOException {
                // 創(chuàng)建反序列化流對(duì)象
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
                        "a.txt"));
                // 讀取,還原對(duì)象
                try {
                    Person p = (Person) ois.readObject();
                    System.out.println(p.toString());
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                ois.close();
            }

            private static void write() throws IOException {
                // 創(chuàng)建序列化流對(duì)象
                // public ObjectOutputStream(OutputStream out)
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
                        "a.txt"));
                // 創(chuàng)建對(duì)象
                Person p = new Person("java"20);
                oos.writeObject(p);
                // 釋放資源
                oos.close();
            }
        }
        import java.io.Serializable;

        /*
         * NotSerializableException為序列化異常,
         * 該類需要實(shí)現(xiàn)一個(gè)接口:Serializable序列化接口,該接口中并沒有任何方法,僅僅作為標(biāo)識(shí)。
         * 類似于此的沒有方法的接口是標(biāo)記接口
         * 
         * !!!每一次去修改該類的時(shí)候都會(huì)生成一個(gè)新的序列化標(biāo)識(shí)的值!,需要重新新,重新讀,這是基本方法。
         * 想辦法來固定該類的標(biāo)識(shí)ID,人為設(shè)定。這樣即使再次修改類的內(nèi)容,只要ID固定了就可以保證,在讀取的時(shí)候一直是匹配的。
         * 增加 generated serial version ID,在類里面直接點(diǎn)擊黃色即可,增加一個(gè)變化的ID值
         */


        /*
         * 當(dāng)有的成員變量不需要被序列化時(shí):如何解決。
         * 方法使用transient關(guān)鍵字聲明不需要序列化的成員變量
         */

        public class Person implements Serializable{

            /**
             * serialVersionUID
             */

            private static final long serialVersionUID = -9164765814868887767L;

            private String name;
            private transient int age;

            public Person() {
                super();
            }

            public Person(String name, int age) {
                super();
                this.name = name;
                this.age = age;
            }

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public int getAge() {
                return age;
            }

            public void setAge(int age) {
                this.age = age;
            }

            @Override
            public String toString() {
                return "Person [name=" + name + ", age=" + age + "]";
            }

        }


        感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。

            · END ·
        最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。


        正文結(jié)束


        推薦閱讀 ↓↓↓

        1.心態(tài)崩了!稅前2萬4,到手1萬4,年終獎(jiǎng)扣稅方式1月1日起施行~

        2.深圳一普通中學(xué)老師工資單曝光,秒殺程序員,網(wǎng)友:敢問是哪個(gè)學(xué)校畢業(yè)的?

        3.從零開始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

        4.程序員一般可以從什么平臺(tái)接私活?

        5.清華大學(xué):2021 元宇宙研究報(bào)告!

        6.為什么國(guó)內(nèi) 996 干不過國(guó)外的 955呢?

        7.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!

        8.15張圖看懂瞎忙和高效的區(qū)別!

        瀏覽 37
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 天天操熟女| 日韩三级视频在线观看 | 国产精品久久久久久久久免费丝袜 | 操逼的视频网站 | 一级全黄45分钟免费看 |