您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)Java中如何區(qū)分引用類型和原始類型,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
Java中區(qū)分引用類型和原始類型 (轉(zhuǎn))[@more@]
下表列出了原始類型以及它們的對象封裝類。
原始類型和封裝類
boolean Boolean char Character byte Byte short Short int Integer long Long float Float double Double
引用類型和原始類型的行為完全不同,并且它們具有不同的語義。例如,假定一個方法中有兩個局部變量,一個變量為 int
原始類型,另一個變量是對一個 Integer
對象的對象引用:
int i = 5; // 原始類型 Integer j = new Integer(10); // 對象引用
這兩個變量都存儲在局部變量表中,并且都是在 Java 操作數(shù)堆棧中操作的,但對它們的表示卻完全不同。(本文中以下部分將用通用術(shù)語堆棧代替操作數(shù)堆?;?em>局部變量表。)原始類型 int
和對象引用各占堆棧的 32 位。(要表示一個 int
或一個對象引用,Java 虛擬機實現(xiàn)至少需要使用 32 位存儲。)Integer
對象的堆棧項并不是對象本身,而是一個對象引用。
Java 中的所有對象都要通過對象引用訪問。對象引用是指向?qū)ο蟠鎯λ诙阎械哪硞€區(qū)域的指針。當(dāng)聲明一個原始類型時,就為類型本身聲明了存儲。
引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種類型的數(shù)據(jù)結(jié)構(gòu)存儲,當(dāng)引用類型和原始類型用作某個類的實例數(shù)據(jù)時所指定的缺省值。對象引用實例變量的缺省值為 null
,而原始類型實例變量的缺省值與它們的類型有關(guān)。
許多程序的代碼將同時包含原始類型以及它們的對象封裝。當(dāng)檢查它們是否相等時,同時使用這兩種類型并了解它們?nèi)绾握_相互作用和共存將成為問題。程序員必須了解這兩種類型是如何工作和相互作用的,以避免代碼出錯。
例如,不能對原始類型調(diào)用方法,但可以對對象調(diào)用方法:
int j = 5; j.hashCode(); // 錯誤 //... Integer i = new Integer(5); i.hashCode(); // 正確
使用原始類型無須調(diào)用 new
,也無須創(chuàng)建對象。這節(jié)省了時間和空間?;旌鲜褂迷碱愋秃蛯ο笠部赡軐?dǎo)致與賦值有關(guān)的意外結(jié)果??雌饋頉]有錯誤的代碼可能無法完成您希望做的工作。例如:
import java.awt.Point; class Assign { public static void main(String args[]) { int a = 1; int b = 2; Point x = new Point(0,0); Point y = new Point(1,1); //1 System.out.println("a is " + a); System.out.println("b is " + b); System.out.println("x is " + x); System.out.println("y is " + y); System.out.println("PerfoRming assignment and " + "setLocation..."); a = b; a++; x = y; //2 x.setLocation(5,5); //3 System.out.println("a is "+a); System.out.println("b is "+b); System.out.println("x is "+x); System.out.println("y is "+y); } }
這段代碼生成以下輸出:
a is 1 b is 2 x is java.awt.Point[x=0,y=0] y is java.awt.Point[x=1,y=1] Performing assignment and setLocation... a is 3 b is 2 x is java.awt.Point[x=5,y=5] y is java.awt.Point[x=5,y=5]
修改整數(shù) a
和 b
的結(jié)果沒什么意外的地方。b
的值被賦予整型變量 a
,結(jié)果 a
的值增加了 1。這一輸出反映了我們希望發(fā)生的情況。但是,令人感到意外的,是在賦值并調(diào)用 setLocation
之后 x
和 y
對象的輸出。我們在完成 x = y
賦值之后特意對 x
調(diào)用了 setLocation
,x
和 y
的值怎么會相同呢?我們畢竟將 y
賦予 x
,然后更改了 x
,這與我們對整數(shù) a
和 b
進行的操作沒什么不同。
這種混淆是由原始類型和對象的使用造成的。賦值對這兩種類型所起的作用沒什么不同。但它可能看起來所有不同。賦值使等號 (=) 左邊的值等于右邊的值。這一點對于原始類型(如前面的 int a
和 b
)是顯而易見的。對于非原始類型(如 Point
對象),賦值修改的是對象引用,而不是對象本身。因此,在語句x = y;之后,x
等于 y
。換句話說,因為 x
和 y
是對象引用,它們現(xiàn)在引用同一個對象。因此,對 x
所作的任何更改也會更改 y
。下
當(dāng)在 //3 處調(diào)用 setLocation
時,這一方法是對 x
引用的對象執(zhí)行的。因為 x
引用的 Point
對象也正是 y
所引用的對象。
因為 x
和 y
引用同一個對象,所以對 x
執(zhí)行的所有方法與對 y
執(zhí)行的方法都作用于同一個對象。
區(qū)分引用類型和原始類型并理解引用的語義是很重要的。若做不到這一點,則會使編寫的代碼無法完成預(yù)定工作。
看完上述內(nèi)容,你們對Java中如何區(qū)分引用類型和原始類型有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。