標籤:
總所周知,Java語言風格類似C和C++,繼承學習了C++語言的物件導向技術的核心,同時去除了C++語言的指標,改用引用(refrence)取代。那為什麼要去除指標呢,改用引用,引用與指標又有什麼區別呢?
1、指標是什嗎? 指標是C語言的靈魂,指標(變數)是儲存地址的變數,它實質是”間接定址“的抽象,即通過一個變數尋找所需要的地址。下面是一個簡單的C語言指標執行個體:
#include <stdio.h>#include <stdlib.h>int main(){ int a = 3, b = 4; swap(&a, &b); printf("a = %d \n", a); printf("b = %d ", b); return 0;}void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}
通過指標能夠方便並快速對變數進行底層操作,非常方便,使代碼非常簡潔,但是指標太靈活,太強大,很容易造成記憶體流失和產生off-the-end指標。利用指標編寫的程式也更容易隱含各式各樣的錯誤,同時程式的可讀性也會大打折扣。所以Java去除了指標,而採用更加安全可靠的引用。
2、引用 那引用是什嗎?如果說指標是對地址的抽象,那引用(refrence)是對同一性(identity)的抽象。不是同一層級的概念。引用是封裝了對象的地址,但它與指標還是有區別的,使用引用可以讓使用Java程式員能夠像操作基礎資料型別 (Elementary Data Type)一樣操作對象,引用是受限的,不能對引用進行地址運算,只能進行賦值操作。
Object o; //這裡是在堆棧中的建立的控制代碼(Handle)o = new Object(); //在堆中建立對象,並使控制代碼指向該對象
引用或控制代碼相當於電視機的遙控器,對遙控器操作,就能操作電視機,實際上,但我們按下”調小音量“,我們實際上操作的是遙控器,再有遙控器操作電視機,等價於直接操作電視機。當我們到處走走的話只需拿著遙控器即可,無需拿著電視機。引用是引用對象的遙控器,我們不能直接操作對象,只能通過引用進行操作。
個人感覺,Java中的引用是對對象的抽象,程式員使用引用就等價於使用對象,當然引用內部肯定包含了對象的地址。3、引用與指標的區別 C與C++中的指標,方便使用者快速對變數進行底層操作,指標能夠運算,通過指標能夠訪問指標指向的變數。 Java中的引用是對對象的抽象,Java的設計者讓使用者類似操作基礎資料型別 (Elementary Data Type)的方法操作引用從而間接操作對象,程式員無法獲得引用的值,無法對引用進行操作。只能進行賦值操作。綜上所述,Java中的引用可以看作受限的指標,該指標程式無法確定其值,也無法對指標進行運算。4、Java的值傳遞 Java的變數類型有兩種,基本類型和參考型別。 (1)基本類型的參數傳遞:基本類型的參數傳遞類似於C語言中的值傳遞。執行個體如下:
package com.cang.refrence; public class TestPrimitive { public static void main(String[] args) { int a = 3, b = 4; System. out.println( "Before swap the a and b: a = " + a + ",b = " + b); swap( a, b); System. out.println( "After swap the a and b: a = " + a + ",b = " + b ); } public static void swap( int a, int b) { int temp = a; a = b; b = temp; }}
運行結果:
記憶體抽象: (2)參考型別的參數傳遞
public class TestRefrence { public static void main(String[] args) { StringBuffer buffer= new StringBuffer( "colin"); SChange( buffer); System. out.println( buffer); } public static void SChange (StringBuffer str) { str= new StringBuffer( "huang"); } }
結果:colin
記憶體抽象: 如所示,傳遞引用時,將引用的副本傳遞給方法的參數,但由於在方法裡對該引用的拷貝進行賦值,所以該引用的拷貝指向其他對象,而不是原來的對象。
public class TestRefrence2 { public static void main(String[] args) { StringBuffer buffer= new StringBuffer( "colin"); SChange( buffer); System. out.println( buffer); } public static void SChange (StringBuffer str) { str.append( "huang"); } }
結果:colinhuang
記憶體抽象: 綜上所述,Java的方法傳遞只有值傳遞,基礎資料型別 (Elementary Data Type)傳遞是其值,而參考型別傳遞的是引用變數。
Java的引用