自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為你介紹Java中引用類(lèi)型和原始類(lèi)型的區(qū)別

開(kāi)發(fā) 后端
本文介紹的是java中的兩種類(lèi)型,分別是引用類(lèi)型和原始類(lèi)型,希望對(duì)你有幫助,一起來(lái)看。

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

下表列出了原始類(lèi)型以及它們的對(duì)象封裝類(lèi)。

原始類(lèi)型 封裝類(lèi)
boolean  Boolean
 char Character
byte  Byte
short  Short
int Integer

long  

Long
float Float
double  Double

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

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

 

這兩個(gè)變量都存儲(chǔ)在局部變量表中,并且都是在 Java 操作數(shù)堆棧中操作的,但對(duì)它們的表示卻完全不同。(本文中以下部分將用通用術(shù)語(yǔ)堆棧代替操作數(shù)堆棧或局部變量表。)原始類(lèi)型 int 和對(duì)象引用各占堆棧的 32 位。(要表示一個(gè) int 或一個(gè)對(duì)象引用,Java 虛擬機(jī)實(shí)現(xiàn)至少需要使用 32 位存儲(chǔ)。)Integer 對(duì)象的堆棧項(xiàng)并不是對(duì)象本身,而是一個(gè)對(duì)象引用。

Java 中的所有對(duì)象都要通過(guò)對(duì)象引用訪問(wèn)。對(duì)象引用是指向?qū)ο蟠鎯?chǔ)所在堆中的某個(gè)區(qū)域的指針。當(dāng)聲明一個(gè)原始類(lèi)型時(shí),就為類(lèi)型本身聲明了存儲(chǔ)。

引用類(lèi)型和原始類(lèi)型具有不同的特征和用法,它們包括:大小和速度問(wèn)題,這種類(lèi)型以哪種類(lèi)型的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),當(dāng)引用類(lèi)型和原始類(lèi)型用作某個(gè)類(lèi)的實(shí)例數(shù)據(jù)時(shí)所指定的缺省值。對(duì)象引用實(shí)例變量的缺省值為 null,而原始類(lèi)型實(shí)例變量的缺省值與它們的類(lèi)型有關(guān)。

許多程序的代碼將同時(shí)包含原始類(lèi)型以及它們的對(duì)象封裝。當(dāng)檢查它們是否相等時(shí),同時(shí)使用這兩種類(lèi)型并了解它們?nèi)绾握_相互作用和共存將成為問(wèn)題。程序員必須了解這兩種類(lèi)型是如何工作和相互作用的,以避免代碼出錯(cuò)。

例如,不能對(duì)原始類(lèi)型調(diào)用方法,但可以對(duì)對(duì)象調(diào)用方法:

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

 

使用原始類(lèi)型無(wú)須調(diào)用 new,也無(wú)須創(chuàng)建對(duì)象。這節(jié)省了時(shí)間和空間?;旌鲜褂迷碱?lèi)型和對(duì)象也可能導(dǎo)致與賦值有關(guān)的意外結(jié)果??雌饋?lái)沒(méi)有錯(cuò)誤的代碼可能無(wú)法完成您希望做的工作。例如:

  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(11); //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. }  

 

這段代碼生成以下輸出:

  1. a is 1  
  2. b is 2  
  3. x is java.awt.Point[x=0y=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=5y=5] 

 

修改整數(shù) a 和 b 的結(jié)果沒(méi)什么意外的地方。b 的值被賦予整型變量 a,結(jié)果 a 的值增加了 1。這一輸出反映了我們希望發(fā)生的情況。但是,令人感到意外的,是在賦值并調(diào)用 setLocation之后 x 和 y 對(duì)象的輸出。我們?cè)谕瓿?x = y 賦值之后特意對(duì) x 調(diào)用了 setLocation,x 和 y 的值怎么會(huì)相同呢?我們畢竟將 y 賦予 x,然后更改了 x,這與我們對(duì)整數(shù) a 和 b 進(jìn)行的操作沒(méi)什么不同?!?/p>

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

  1. x = y; 

 

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

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

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

因?yàn)?x 和 y 引用同一個(gè)對(duì)象,所以對(duì) x 執(zhí)行的所有方法與對(duì) y 執(zhí)行的方法都作用于同一個(gè)對(duì)象。

區(qū)分引用類(lèi)型和原始類(lèi)型并理解引用的語(yǔ)義是很重要的。若做不到這一點(diǎn),則會(huì)使編寫(xiě)的代碼無(wú)法完成預(yù)定工作。

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

責(zé)任編輯:于鐵 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2017-02-27 08:34:09

JavaScript數(shù)據(jù)引用

2009-08-03 17:51:43

C#引用類(lèi)型

2009-10-10 09:53:07

.NET值類(lèi)型

2013-05-23 17:21:16

C#

2011-07-11 15:02:54

枚舉

2009-10-22 18:41:49

CLR VIA C#教

2009-08-19 16:39:44

C#值類(lèi)型C#引用類(lèi)型

2009-08-26 14:05:19

C#值類(lèi)型和引用類(lèi)型

2024-05-20 08:58:13

Java引用類(lèi)型垃圾回收器

2021-08-27 07:47:06

引用類(lèi)型

2021-11-29 18:02:05

VMware磁盤(pán)存儲(chǔ)

2009-07-22 09:43:30

Scala類(lèi)型

2009-08-03 14:54:23

值類(lèi)型C#

2010-03-18 14:02:37

Python空對(duì)象整理

2016-08-18 14:13:55

JavaScript基本數(shù)據(jù)引用數(shù)據(jù)

2009-06-08 18:05:00

Java進(jìn)階引用

2009-08-27 16:39:26

C# String類(lèi)型

2011-07-21 14:45:13

java

2021-09-02 15:24:25

Prisma JavaScript 類(lèi)型安全

2011-06-08 13:03:52

C#值類(lèi)型引用類(lèi)型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)