java传值问题.
Java傳遞參數(shù)只有一種 :值傳遞 而沒有引用傳遞
一般根據(jù)傳遞類型來分類 可以分為 值類型數(shù)據(jù) 和 引用數(shù)據(jù)類型
值類型是原始數(shù)據(jù)類型 包括 int,byte,char short long,boolean,float,double
引用類型就是一般的class類 當(dāng)然也包括原始數(shù)據(jù)的封裝類型 比如int的
封裝類型為Integer
?
比如對象的引用關(guān)系是這樣的
?
List list=new ArrayList();
?
如上一段代碼會產(chǎn)生兩個對象 :引用對象(存在于棧中),實例對象(存在于堆中)
引用對象的地址指向了實例化對象的地址,
如果方法調(diào)用中傳入的是引用對象才屬于真正的引用傳遞?
一般情況下 舉個例子:
?
?
public class TestJava {
public static void add(TestJava java){
java=new TestJava();
}
public static void main(String[] args) {
TestJava java=null;
add(java);
System.out.println(java);
}
}
?
輸出結(jié)果 null
?
其實可以這么去理解:
調(diào)用方法時 同時也會產(chǎn)生一個引用對象,產(chǎn)生的新引用對象 同時也指向?qū)嵗龑ο?public static void add(TestJava java) 相當(dāng)于該方法中的TestJava java
在方法中 新的引用地址指向了一個新創(chuàng)建的對象 ,而舊的
java=new TestJava();? 里面的java 還是指向的null對象? 所以方法傳遞的時候 實際是傳遞實例化對象和創(chuàng)建了一個新的引用,而不是舊的引用對象的傳遞所以不屬于 引用傳遞
?
?
?
?看下面的例子?
?
public class TestJava {
String name=null;
public static void add(TestJava java1){
java1.name="liaomin";
}
public static void main(String[] args) {
? TestJava java=new TestJava();
java.name="huqun";
add(java);
System.out.println(java);
}
}
?
輸出結(jié)果 liaomin
?
上面的例子 可以進一步確認(rèn)上面的觀點
?
TestJava java=new TestJava();
創(chuàng)建了一個引用對象 和一有個實例化對象
引用對象指向了 實例對象
?
public static void add(TestJava java1)
創(chuàng)建了一個新引用對象
add(java);
調(diào)用的時候 同時java1引用對象指向了實例化對象
java1.name="liaomin";
改變了 java1的值 實際上是改變了實例化對象的值
?
Java引用對象也是指向了 實例化對象 所以他的值
也會改變
?
如果覺得理由在不充分 在在看下面的例子?
?
?
?看下面的例子?
?
public class TestJava {
String name=null;
public static void add(TestJava java1){
Java1=new TestJava();
java1.name="liaomin";
}
public static void main(String[] args) {
? TestJava java=new TestJava();
java.name="huqun";
add(java);
System.out.println(java);
}
}
?
輸出結(jié)果 huqun;
?
?
?TestJava java=new TestJava();
創(chuàng)建了一個引用對象java 和一有個實例化對象 new TestJava()
引用對象指向了 實例對象
?
public static void add(TestJava java1)
創(chuàng)建了一個新引用對象
add(java);
調(diào)用的時候 同時java1引用對象指向了實例化對象
Java1=new TestJava();
Java1指向了 新創(chuàng)建的實例化對象
java1.name="liaomin";
改變了 java1的值 實際上是改變了新實例化對象的值,而不是改變
的舊的實例化對象 因為他指向了別人
?
原Java引用對象也是指向的是以前實例化對象 所以他的值
不會改變
?
?
?
常量類型的引用
?
public class TestJava {
??? public static void add(Integer inte){
?????? inte=2;
??? }
??? public static void main(String[] args) {
?????? Integer in=new Integer(1);
?????? add(in);
?????? System.out.println(in);
??? }
}
?
任何原始數(shù)據(jù)類型及原始數(shù)據(jù)類型的封裝類 作為參數(shù)傳遞時
無論怎么在方法中修改都不會影響原始的值 ,因為在傳遞時
傳遞的對象的常量值 而不是 地址了 所以不會改變,可以理解
為實例化對象在堆內(nèi)存中儲存的常量值 而不是地址
?
比如 Integer it=new Integer(3);
棧內(nèi)存中放的是 it地址 對內(nèi)存中放的是 3
It地址指向的是3
?
?
看一下 String 的 問題
?
public class TestJava {
?
??? public static void main(String[] args) {
?????? String a="234";
?????? String b=new String("234");
?????? String c="234";
?????? System.out.println(a==b);
?????? System.out.println(c==b);
?????? System.out.println(a==c);
??? }
}
?
?
a="234";?
b=”234”
a==b比較地址? 地址絕對是一樣的 比較的是實例化對象的地址 而不是引用的地址
?
b=”234”是 首先去查看一下 堆內(nèi)存中是否有 “234”這個常量 如果有 則指向該地址
沒有就創(chuàng)建一片地址
?
C=new String(“234”) 很明顯重新開辟了一片心地址? 和上面的都不相等
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/liaomin416100569/archive/2009/12/03/9332113.html
總結(jié)
- 上一篇: 【刺客信条奥德赛】拾荒者海岸神教成员在哪
- 下一篇: String类的构造与析构相关处理