日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
為你介紹Java中引用類型和原始類型的區(qū)別

Java提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型)。另外,Java 還為每個原始類型提供了封裝類(Wrapper)。如果需要一個整型變量,是使用基本的 int 型呢,還是使用 Integer 類的一個對象呢?如果需要聲明一個布爾類型,是使用基本的 boolean,還是使用 Boolean 類的一個對象呢?本文可幫助您作出決定。

下表列出了原始類型以及它們的對象封裝類。

原始類型 封裝類
boolean  Boolean
 char Character
byte  Byte
short  Short
int Integer

long  

Long
float Float
double  Double

引用類型和原始類型的行為完全不同,并且它們具有不同的語義。例如,假定一個方法中有兩個局部變量,一個變量為 int 原始類型,另一個變量是對一個 Integer 對象的對象引用:

 
 
  1. int i = 5; // 原始類型
  2. Integer j = new Integer(10); // 對象引用

這兩個變量都存儲在局部變量表中,并且都是在 Java 操作數(shù)堆棧中操作的,但對它們的表示卻完全不同。(本文中以下部分將用通用術(shù)語堆棧代替操作數(shù)堆棧或局部變量表。)原始類型 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)用方法:

 
 
  1. int j = 5;
  2. j.hashCode(); // 錯誤
  3. //。..
  4. Integer i = new Integer(5);
  5. i.hashCode(); // 正確

使用原始類型無須調(diào)用 new,也無須創(chuàng)建對象。這節(jié)省了時間和空間?;旌鲜褂迷碱愋秃蛯ο笠部赡軐?dǎo)致與賦值有關(guān)的意外結(jié)果??雌饋頉]有錯誤的代碼可能無法完成您希望做的工作。例如:

 
 
  1. import java.awt.Point;
  2. class Assign
  3. {
  4. public static void main(String args[])
  5. {
  6. int a = 1;
  7. int b = 2;
  8. Point x = new Point(0,0);
  9. Point y = new Point(1,1); //1
  10. System.out.println(“a is ” + a);
  11. System.out.println(“b is ” + b);
  12. System.out.println(“x is ” + x);
  13. System.out.println(“y is ” + y);
  14. System.out.println(“Performing assignment and ” +
  15. “setLocation.。.”);
  16. a = b;
  17. a++;
  18. x = y; //2
  19. x.setLocation(5,5); //3
  20. System.out.println(“a is ”+a);
  21. System.out.println(“b is ”+b);
  22. System.out.println(“x is ”+x);
  23. System.out.println(“y is ”+y);
  24. }
  25. }

這段代碼生成以下輸出:

 
 
  1. a is 1
  2. b is 2
  3. x is java.awt.Point[x=0,y=0]
  4. y is java.awt.Point[x=1,y=1]
  5. Performing assignment and setLocation.。.
  6. a is 3
  7. b is 2
  8. x is java.awt.Point[x=5,y=5]
  9. 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 進行的操作沒什么不同?!?/p>

這種混淆是由原始類型和對象的使用造成的。賦值對這兩種類型所起的作用沒什么不同。但它可能看起來所有不同。賦值使等號 (=) 左邊的值等于右邊的值。這一點對于原始類型(如前面的 int a 和 b)是顯而易見的。對于非原始類型(如 Point 對象),賦值修改的是對象引用,而不是對象本身。因此,在語句

 
 
  1. x = y;

之后,x 等于 y。換句話說,因為 x 和 y 是對象引用,它們現(xiàn)在引用同一個對象。因此,對 x 所作的任何更改也會更改 y。下面是 //1 處的代碼執(zhí)行以后的情況:

執(zhí)行 //2 處的賦值以后情況如下:

當(dāng)在 //3 處調(diào)用 setLocation 時,這一方法是對 x 引用的對象執(zhí)行的。因為 x 引用的 Point 對象也正是 y 所引用的對象,所以我們現(xiàn)在得到以下結(jié)果:

因為 x 和 y 引用同一個對象,所以對 x 執(zhí)行的所有方法與對 y 執(zhí)行的方法都作用于同一個對象。

區(qū)分引用類型和原始類型并理解引用的語義是很重要的。若做不到這一點,則會使編寫的代碼無法完成預(yù)定工作。

希望通過以上內(nèi)容的介紹,能夠給你帶來幫助。


分享名稱:為你介紹Java中引用類型和原始類型的區(qū)別
URL分享:http://m.5511xx.com/article/dheshpe.html