java传值问题.
Java傳遞參數只有一種 :值傳遞 而沒有引用傳遞
一般根據傳遞類型來分類 可以分為 值類型數據 和 引用數據類型
值類型是原始數據類型 包括 int,byte,char short long,boolean,float,double
引用類型就是一般的class類 當然也包括原始數據的封裝類型 比如int的
封裝類型為Integer
?
比如對象的引用關系是這樣的
?
List list=new ArrayList();
?
如上一段代碼會產生兩個對象 :引用對象(存在于棧中),實例對象(存在于堆中)
引用對象的地址指向了實例化對象的地址,
如果方法調用中傳入的是引用對象才屬于真正的引用傳遞?
一般情況下 舉個例子:
?
?
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);
}
}
?
輸出結果 null
?
其實可以這么去理解:
調用方法時 同時也會產生一個引用對象,產生的新引用對象 同時也指向實例對象 public static void add(TestJava java) 相當于該方法中的TestJava java
在方法中 新的引用地址指向了一個新創建的對象 ,而舊的
java=new TestJava();? 里面的java 還是指向的null對象? 所以方法傳遞的時候 實際是傳遞實例化對象和創建了一個新的引用,而不是舊的引用對象的傳遞所以不屬于 引用傳遞
?
?
?
?看下面的例子?
?
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);
}
}
?
輸出結果 liaomin
?
上面的例子 可以進一步確認上面的觀點
?
TestJava java=new TestJava();
創建了一個引用對象 和一有個實例化對象
引用對象指向了 實例對象
?
public static void add(TestJava java1)
創建了一個新引用對象
add(java);
調用的時候 同時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);
}
}
?
輸出結果 huqun;
?
?
?TestJava java=new TestJava();
創建了一個引用對象java 和一有個實例化對象 new TestJava()
引用對象指向了 實例對象
?
public static void add(TestJava java1)
創建了一個新引用對象
add(java);
調用的時候 同時java1引用對象指向了實例化對象
Java1=new TestJava();
Java1指向了 新創建的實例化對象
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);
??? }
}
?
任何原始數據類型及原始數據類型的封裝類 作為參數傳遞時
無論怎么在方法中修改都不會影響原始的值 ,因為在傳遞時
傳遞的對象的常量值 而不是 地址了 所以不會改變,可以理解
為實例化對象在堆內存中儲存的常量值 而不是地址
?
比如 Integer it=new Integer(3);
棧內存中放的是 it地址 對內存中放的是 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”是 首先去查看一下 堆內存中是否有 “234”這個常量 如果有 則指向該地址
沒有就創建一片地址
?
C=new String(“234”) 很明顯重新開辟了一片心地址? 和上面的都不相等
?
?
?
?
?
轉載于:https://www.cnblogs.com/liaomin416100569/archive/2009/12/03/9332113.html
總結
- 上一篇: 【刺客信条奥德赛】拾荒者海岸神教成员在哪
- 下一篇: 拔罐减肥多少钱啊?