java指標與引用(轉載)

來源:互聯網
上載者:User

標籤:

 1 大家都知道java和C#中沒有指標這個概念。但是也導致了編程中常常忽略了對象與引用的區別,難道java真的沒有指標嗎?控制代碼是什嗎?變數地址在哪裡?沒有地址是不可能的,關鍵是java中如何避免了指標這個概念。 2 java中記憶體的分配方式有兩種,一種是在堆中分配,一種是在堆棧中分配,所有new出來的對象都是在堆中分配的,函數中參數的傳遞是在棧中分配的。通常情況下堆的記憶體可以很大,比如32位作業系統中的虛擬記憶體都可以被堆所使用(當記憶體緊張的時候甚至硬碟都可以是堆的儲存空間),而堆棧的記憶體配置是有限的。 3  4 這和c++中記憶體配置差不多。java中有幾種基本類型如int,float,double,char,byte等,他們不是對象,除此之外一切都是對象,所有的對象都是在堆上分配的。但好像在C#中這些都有封裝好的一些方法,應該算是對象。 5  6 java中對象數組是什麼,和c++類似,是控制代碼數組或者叫指標數組,裡面儲存的是每個元素的地址。和c++中不同,java沒有操作符重載和拷貝建構函式(如果不瞭解這些也沒有關係),因此當建立對象或者對已經建立的對象賦值時(注意是對象,不是基本類型):Object a=new Object 和Object a=b(b是Object的子類型或者同類型)時,進行的是對象地址的傳遞並複製。這就是所說的控制代碼的傳遞和賦值。 7  8 控制代碼裡儲存的就是對象的地址,控制代碼就是指標,只不過是你無法得到的地址,java就是通過這一點巧妙的將指標隱藏起來。當對象作為參數傳遞到方法中時,傳遞的就是對象的地址,而行參中儲存的是實參地址的副本(這就是最關鍵的地方,也是值傳遞,值傳遞就是將實參的值的副本作為行參) 9 如:10 public class Example{11 12 int i=0;13 14 }15 16 public class A{17 18 public int i=0;19 20 public Example add0(Example e)21 22 {23 24 e.i++;25 26 return e;27 28 }29 30 31 32 public void add1(Example e)33 34 {35 36 e.i++;37 38 }39 public void modify0(Example e)40 41 {42 43 Example b=e;//將e行參對象的地址賦給控制代碼b44 45 b.i++;//也同時修改了e.i和實參的值46 47 }48 49 50 51 public void modify1(Example e)52 53 {54 55 e=new Example();56 57 e.i++;58 59 }60 61 public static void main(String[] args)62 63 {64 65 Example ex=new Example();66 67 A a=new A();68 69 a=a.add0(ex);//等價於a.add0(ex),無需傳回值,因為通過傳遞的對象地址(控制代碼),直接修改了ex中i的值70 71 a.add1(ex);//add0,add1都在其中的方法體中直接修改了ex.i的值,因此add0的傳回值有點多餘72 73 a.modify0(ex);//對ex所產生的影響同add174 75 a.modify1(ex);//對ex沒有產生任何影響(而且這就是等價於什麼也沒有做).76 這可能會讓一部分人搞不清了。為什麼呢?因為是對象地址的副本"值傳遞",在modify1中e=new Example();實際上e僅僅是儲存ex對象地址的副本的一個控制代碼,當對e賦值時僅僅是對堆棧中e的賦值(對ex指標副本的變數e賦值),而並沒有改變ex的控制代碼的指向,當方法調用完畢堆棧彈出,e就將要被記憶體回收,沒有任何用處。當然你可以將它作為傳回值,這就是另外一回事了。77 78 }79 80 }81 如果你能明白這個原理,可以避免一些潛在的邏輯錯誤,如:對象在方法中被改動了,可能你還不知道!記住c++在這一點上和java有很大的不同,c++預設的是值傳遞,行參會按照位複製實參(如果用指標或者引用就和java很類似了),在方法中作為參數傳遞對象,java更象是c++中傳遞引用,當然還是有區別的,那就是c++中對象的引用不可再賦值為另一個對象。

 

java指標與引用(轉載)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.