首頁 >Java >java教程 >Java中引用型別和原始型別有哪些區別

Java中引用型別和原始型別有哪些區別

王林
王林轉載
2023-05-04 16:34:061660瀏覽

下表列出了原始類型以及它們的物件封裝類別。

LongfloatFloat#double Double
原始型別 封裝類別
#boolean  Boolean
# char Character
#byte  Byte
#short  Short
int Integer

long  

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

int i = 5; // 原始类型  Integer j = new Integer(10); // 对象引用
這兩個變數都儲存在局部變數表中,而且都是在Java 操作數堆疊中操作的,但對它們的表示卻完全不同。 (本文中以下部分將以通用術語堆疊取代操作數堆疊或局部變數表。)原始類型 int 和物件引用各佔堆疊的 32 位元。 (要表示一個 int 或一個物件引用,Java 虛擬機器實作至少需要使用 32 位元儲存。)Integer 物件的堆疊項目並不是物件本身,而是一個物件參考。

Java 中的所有物件都要透過物件參考存取。物件引用是指向物件儲存所在堆中的某個區域的指標。當聲明一個原始類型時,就為類型本身聲明了儲存。

引用類型和原始類型具有不同的特徵和用法,它們包括:大小和速度問題,這種類型以哪種類型的資料結構存儲,當引用類型和原始類型用作某個類別的實例資料時所指定的預設值。物件引用實例變數的預設值為 null,而原始類型實例變數的缺省值與它們的類型有關。

許多程式的程式碼將同時包含原始類型以及它們的物件封裝。當檢查它們是否相等時,同時使用這兩種類型並了解它們如何正確相互作用和共存將成為問題。程式設計師必須了解這兩種類型是如何運作和相互作用的,以避免程式碼出錯。

例如,不能對原始類型呼叫方法,但可以對物件呼叫方法:

int j = 5;  j.hashCode(); // 错误  //。..  Integer i = new Integer(5);  i.hashCode(); // 正确
使用原始類型無須呼叫 new,也無須建立物件。這節省了時間和空間。混合使用原始類型和物件也可能導致與賦值有關的意外結果。看起來沒有錯誤的程式碼可能無法完成您希望做的工作。例如:

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]
修改整數 a 和 b 的結果沒什麼意外的地方。 b 的值被賦予整數變數 a,結果 a 的值增加了 1。這一輸出反映了我們希望發生的情況。但是,令人感到意外的,是在賦值並調用 setLocation之後 x 和 y 物件的輸出。我們在完成 x = y 賦值之後刻意對 x 呼叫了 setLocation,x 和 y 的值怎麼會相同呢?我們畢竟將 y 賦予 x,然後更改了 x,這與我們對整數 a 和 b 進行的操作沒什麼不同。 

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

x = y;
之後,x 等於 y。換句話說,因為 x 和 y 是物件引用,它們現在引用同一個物件。因此,對 x 所做的任何更改也會更改 y。下面是//1 處的程式碼執行以後的情況:

執行//2 處的賦值以後情況如下:

當在//3 處呼叫setLocation 時,這個方法是對x 引用的物件執行的。因為x 引用的Point 物件也正是y 所引用的對象,所以我們現在得到以下結果:######因為x 和y 引用同一個對象,所以對x 執行的所有方法與對y 執行的方法都作用於同一個物件。 ######區分引用類型和原始類型並理解引用的語義是很重要的。若做不到這一點,則會使編寫的程式碼無法完成預定工作。 ###

以上是Java中引用型別和原始型別有哪些區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除