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:

淺克隆的log

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