java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。另外,Java 還為每個原始類型提供了封裝類(Wrapper)。假如需要一個整型變量,是使用基本的 int 型呢,還是使用 Integer 類的一個對象呢?假如需要聲明一個布爾類型,是使用基本的 boolean,還是使用Boolean 類的一個對象呢?本文可幫助您作出決定。
下面列出了原始類型以及它們的對象封裝類。
原始類型封裝類
booleanBoolean
char Character
byte Byte
shortShort
intInteger
long Long
floatFloat
double Double
引用類型和原始類型的行為完全不同,并且它們具有不同的語義。例如,假定一個方法中有兩個局部變量,一個變量為 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. 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);
}
}
新聞熱點
疑難解答