引用類型 由類型的實際值引用(類似於指針)表示的數據類型。如果為某個變量分配一個引用類型,則該變量將引用(或「指向」)原始值。不創建任何副本。引用類型包括類、接口、委託和裝箱值類型。
「引用」(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()方法。
- 兩種類型對比
最後,基本數據類型和引用數據類型的一些對比如下:
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容圖片侵權或者其他問題,請聯繫本站作侵刪。 侵權投訴