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