關(guān)于Android的克隆模式和Java中的參數(shù)傳遞問題

Java中的參數(shù)傳遞
問:當(dāng)一個對象被當(dāng)作參數(shù)傳遞到一個方法后,
此方法可改變這個對象的屬性,
并可返回變化后的結(jié)果,
那么這里到底是值傳遞還是引用傳遞?
答: 是值傳遞。 Java 編程語言只有 值傳遞參數(shù)。所以是值傳遞.

問 : 傳遞一個對象和傳遞一個原始類型有什么不同?
答 : 當(dāng)一個對象實例作為一個參數(shù)被傳遞到方法中時,參數(shù)的值 就是 該對象的引用一個副本。
指向同一個對象,對象的內(nèi)容可以在被調(diào)用的方法中改變,
但對象的引用(不是引用的副本)是永遠(yuǎn)不會改變的。

Java參數(shù),不管是原始類型還是引用類型,
傳遞的都是副本(有另外一種說法是傳值,但是說傳副本更好理解吧,傳值通常是相對傳址而言)。

如果參數(shù)類型是原始類型,那么傳過來的就是這個參數(shù)的一個副本,也就是這個原始參數(shù)的值,
這個跟之 前所談的傳值是一樣的。如果在函數(shù)中改變了副本的值不會改變原始的值.
  
如果參數(shù)類型是引用類型,那么傳過來的就是這個引用參數(shù)的副本,這個副本存放的是參數(shù)的地址
如果在函數(shù)中沒有改變這個副本的地址,而是改變了地址中的 值,
那么在函數(shù)內(nèi)的改變會影響到傳入的參數(shù)。
如果在函數(shù)中改變了副本的地址,如new一個,那么副本就指向了一個新的地址,
此時傳入的參數(shù)還是指向原來的 地址,所以不會改變參數(shù)的值。

簡單來說 如果參數(shù)是一個類那么值傳遞 傳的值就是引用參數(shù)的副本 這個副本存放的是參數(shù)地址
如果是基礎(chǔ)類型那個這個副本就是原始的參數(shù)

那么Android的克隆模式

public class Teacher implements Cloneable {
    public String name;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class Student implements Cloneable {
    public String name;
    public String ID;
    public int age;

    public Teacher teacher;
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

private void text() {
        Student student = new Student();
        student.name = "65654";
        student.age = 20;
        student.ID = "9494";
        student.teacher= new Teacher();
        student.teacher.name = "kkk";
        Student student1 = null;
        try {
            student1 = (Student) student.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        student1.name = "55555";
        student1.ID = "100";
        try {
            student1.teacher = (Teacher) student.teacher.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        student1.teacher.name = "8704";
        setStudent(student1);
        student1.name = "text123";
    }

    private void setStudent (Student student) {
        student.ID = "setStudent";
    }


上面用的是深克隆模式 就是Student里面的Teacher類在復(fù)制的時候也是用了克隆模式的
反之淺克隆就是Teacher不用克隆模式就ok了
用的克隆模式的參數(shù)在內(nèi)存中指向的地址是不一樣的 所以克隆出來的類和之前的類除去名字一樣其他事沒有任何關(guān)系的
深克隆的log:


圖片.png

淺克隆的log


圖片.png

可以看到淺克隆的teacher地址是一樣的 是沒有被克隆的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容