快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡亰平台9411小游戏:区分引用类型和原始类型



Java 供给两种不合的类型:引用类型和原始类型(或内置类型)。别的,Java 还为每个原始类型供给了封装类(Wrapper)。假如必要一个整型变量,是应用基础的 int 型呢,照样应用 Integer 类的一个工具呢?假如必要声明一个布尔类型,是应用基础的 boolean,照样应用 Boolean 类的一个工具呢?本文可赞助您作出抉择。

下表列出了原始类型以及它们的工具封装类。

原始类型和封装类 原始类型 封装类

boolean Boolean

char Character

byte Byte

short Short

int Integer

long Long

float Float

double Double

引用类型和原始类型的行径完全澳门新葡亰平台9411小游戏不合,并且它们具有不合的语义。例如,假定一个措施中有两个局部变量,一个变量为 int 原始类型,另一个变量是对一个 Integer 工具的工具引用:

int i = 5;// 原始类型

Integer j = new Integer(10);// 工具引用

这两个变量都存储在局部变量表中,并且都是在 Java 操作数客栈中操作的,但对它们的表示却完澳门新葡亰平台9411小游戏全不合。(本文中以下部分将用通用术语客栈代替操作数客栈或局部变量表。)原始类型 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 调用了 setL澳门新葡亰平台9411小游戏ocation,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 工具也恰澳门新葡亰平台9411小游戏是 y 所引用的工具,以是我们现在获得以下结果:

由于 x 和 y 引用同一个工具,以是对 x 履行的所有措施与对 y 履行的措施都感化于同一个工具。

区分引用类型和原始类型并理解引用的语义是很紧张的。若做不到这一点,则会使编写的代码无法完成预定事情。

作者简介

Peter Haggar 是 IBM 的高档软件工程师。他今朝正在钻研新兴的 Java 和因特网技巧,并且是 IBM 实时 Java 参考实现的项目主持人。他有富厚的编程履历,从事过开拓对象、类库和操作系统等方面的事情。在许多行业研讨会上,他也常常就 Java 和其他技巧作技巧性谈话。他于 1987 年在纽约得到 Clarkson 大年夜学谋略机科学学士学位。可以经由过程 hagg澳门新葡亰平台9411小游戏ar@us.ibm.com 与他联系。

您可能还会对下面的文章感兴趣: