引用類型 由類型的實際值引用(類似于指針)表示的數據類型。如果為某個變量分配一個引用類型,則該變量將引用(或“指向”)原始值。不創建任何副本。引用類型包括類、接口、委托和裝箱值類型。
引用數據類型的概念
“引用”(reference)是c++的一種新的變量類型,是對C的一個重要補充。它的作用是為變量起一個別名。假如有一個變量a,想給它起一個別名,可以這樣寫:
int a;int &b=a;
這就表明了b是a的“引用”,即a的別名。經過這樣的聲明,使用a或b的作用相同,都代表同一變量。在上述引用中,&是“引用聲明符”,并不代表地址。
不要理解為“把a的值賦給b的地址”。引用類型的數據存儲在內存的堆中,而內存單元中只存放堆中對象的地址。聲明引用并不開辟內存單元,b和a都代表同一變量單元。
注意:在聲明引用變量類型時,必須同時使之初始化,即聲明它代表哪一變量。在聲明一個變量的引用之后,在本函數執行期間,該引用一直與其代表的變量相聯系
引用數據類型有哪幾種
Java提供了兩類數據類型:一種是基本類型(原始類型),一種是引用類型。
注意:
1、在基本數據類型中,除了boolean類型所占長度與平臺有關外,其他數據類型長度都是與平臺無關的。比如,int永遠占4個字節(1 Byte = 8 bit)。
2、void不是基本數據類型
在 Java 中基本類型只有八種,詳見 Java Language Specification 的 4.2 節:
http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2
另外,在 Java Language Specificaion 的第 14.8 節也提及 void 并不是一種類型:
http://java.sun.com/docs/books/jls/third_edition/html/statements.html#5989
為什么《Thinking in Java》等一些書籍都說,void是基本類型的一種呢?
來看void的包裝類java.lang.Void源碼:
package java.lang;
/**
* The Void class is an uninstantiable placeholder class to hold a
* reference to the Class object representing the Java keyword
* void.
*
* 翻譯:Void類是一個不可重復的占位符類,
* 用于保存對表示Java關鍵字void的Class對象的引用
**/
public final class Void { //final表明這個類是不允許被其他類繼承
/**
* The Class object representing the pseudo-type corresponding to
* the keyword void.
* 翻譯:Class對象表示對應于關鍵字void的偽類型。
*/
public static final Class《Void》 TYPE = Class.getPrimitiveClass(“void”);
/*
* The Void class cannot be instantiated.
* 翻譯:Void類不能被實例化。
*/
private Void() {}
}
1234567891011121314151617181920212223242526
再看getPrimitiveClass()方法的源碼:
/*
* Return the Virtual Machine‘s Class object for the named
* primitive type.
* 翻譯:返回指定基本類型的虛擬機的Class對象。
*/
static native Class getPrimitiveClass(String name);123456
“Ctrl+Alt+H”查看調用getPrimitiveClass()方法的所有類,確實是“Byte、Boolean、Short、Character、Integer、Long、Float、Double、Void”一共9個包裝類,由此猜測把void也歸到基本數據類型的說法可能來源于此。
3、基本數據類型的默認值僅在作為類中屬性時生效
在方法內部必須先對基本數據類型變量賦值后才能使用,否則編譯不通過。Demo如下:
public class DefaultValueTest {
static int intA;
static boolean blnA;
public static void main(String[] args) {
int intB;
boolean blnB;
System.out.println(intA); //輸出0
System.out.println(blnA); //輸出false
//System.out.println(intB); //編譯不通過
//System.out.println(blnB); //編譯不通過
}
}12345678910111213
在程序中如果某些數據可能會返回空值,那么用包裝類比較好。比如當結果為空時,轉換為int會發生異常,而轉換為Integer則不會,因為對象可以為null。此時建議用包裝類,雖然會犧牲一些轉換效率,但可以避免持久化數據時產生的一些異常。
- 引用數據類型
引用類型(reference type)指向一個對象,不是原始值,指向對象的變量是引用變量。
在java里面除去基本數據類型的其它類型都是引用數據類型,自己定義的class類都是引用類型,可以像基本類型一樣使用。
引用類型常見的有:String,StringBuffer,ArrayList,HashSet,HashMap等。
String也屬于引用數據類型:
String a = “china”;
String b =a; // 則a、b都指向常量池的“china”。
String a = new String(“china”);
String b =a; //則a、b都指向堆中的“china”。
String a = new String(“china”);
String b =a;
a = a.substring(0,1); //則b指向棧中的“china”,a指向新的對象“c”。12345678
如果要對比兩個對象是否相同,則需要使用equals()方法,但有一點需要注意:equals()方法的默認行為是比較引用。如果是你自己寫的類,你應該為它重寫equals()來比較對象的內容。大多數Java類庫都實現了比較對象內容的equals()方法。
- 兩種類型對比
最后,基本數據類型和引用數據類型的一些對比如下:
評論
查看更多