Java中地址的理解
阿新 • • 發佈:2019-02-18
以前不是很懂就寫下了這篇文章
今天學習Python時才發現,賦值引用中出現的問題就是Java中的淺拷貝和深拷貝問題
找到一篇講解很全面的文章
---------------------------原文分隔符------------------------------------
java中沒有指標,但卻有地址和引用的概念。在這個地方栽了不少次。
先上一個小例子
import java.util.Iterator; import java.util.LinkedList; import java.util.Queue; public class Helloworld { static class hello{ public int x; } public static void main(String[] args) { Queue<hello> a =new LinkedList<>(); hello n = new hello(); n.x=100; a.add(n); //新增n hello c = new hello(); c=n; a.add(c); //新增c c.x=0; //修改c a.add(n); //再新增n System.out.println(a.size()+"\n"); Iterator<hello> it =a.iterator(); while(it.hasNext()) { System.out.println(it.next().x); } } }
3
0
0
0
從上面的小例子可以看出來
1.在c加入佇列後,改變c的值,佇列裡的值也跟著改變了。
2.把n賦值給c後,更改c的值,n的值也改變了。
理解:
1.java裡是有類似指標的概念的,佇列其實不是真實存在,而是用連結串列把佇列裡的資料鏈接起來,更改原始資料實際就改變了佇列裡的資料。
2.java裡如果把一個物件完整的賦值給另一物件,實際上他們會使用同一塊地址。
上個圖理解一下
如果近對物件中某一屬性更改,而不是整個物件賦值,那麼就不會發生引用
上程式碼
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
public class Helloworld {
static class hello{
public int x;
}
public static void main(String[] args) {
Queue<hello> a =new LinkedList<>();
hello n = new hello();
n.x=100;
a.add(n); //新增n
hello c = new hello();
c.x=n.x; //僅對物件更改。
a.add(c); //新增c
c.x=0; //修改c
a.add(n); //再新增n
System.out.println(a.size()+"\n");
Iterator<hello> it =a.iterator();
while(it.hasNext()) {
System.out.println(it.next().x);
}
}
}
3
100
0
100