转自:
http://blog.csdn.net/asp911/archive/2006/02/10/595852.aspx
下表列出了原始类型以及它们的对象封装类。
原始类型和封装类 原始类型 封装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
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.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中的两个特殊变量this和super Java中利用散列表实现股票行情的查询 Java中文问题详解 Vector在Java编程中的应用 编写高级应用程序1 编写高级应用程序2 实现 Swing 的 JTables 和 ...
这意味着如果原对象和复制的对象中包含引用类型的成员变量,那么这些成员变量指向的是同一个实例。改变复制对象中的成员变量会影响原对象中的对应成员变量。浅复制适用于那些所有成员变量都是基本数据类型或者都是不...
Java 基础知识是一门庞大的知识体系,本文档对 Java 基础知识进行了系统性的总结和提炼,从标识符和关键字开始,到基本数据类型、数据类型的转换、原始类型和引用类型的区别等方面进行了详细的介绍。 一、标识符和...
Java中的参数传递有两种方式:基本类型的值传递和引用类型的引用传递。对于基本类型(如`int`),传递的是值的副本;而对于引用类型(如`StringBuffer`),传递的是引用的副本。这意味着对于引用类型的参数,如果在...
然而,对于非原始类型,如果我们要比较的是对象的内容而不是引用,就需要重写`equals()`方法。`equals()`方法默认继承自`Object`类,其行为与`==`相同,但在自定义类中,我们通常需要根据业务逻辑覆盖它以实现具体的...
Java中的JVM基础可以分为两大类,即基本类型和引用类型。基本类型的变量保存原始值,而引用类型的变量保存引用值。基本类型包括byte、short、int、long、char、float、double、Boolean、returnAddress等,引用类型...
Java中的数据类型分为两大类:基本数据类型和引用数据类型。 1. **基本数据类型**: - **整型**:包括byte(1字节,-128到127)、short(2字节,-32,768到32,767)、int(4字节,-2^31到2^31-1)、long(8字节,-2...
- **类型的种类和值**:概述了Java中的不同类型的分类,包括原始类型和引用类型。 - **原始类型和值**:详细介绍了Java中的原始类型(如整型、浮点型和布尔型)及其相应的操作。 - **整型类型和值**:解释了整型...
### Java的传值与传引用详解 ...综上所述,理解Java中的传值与传引用的概念,需要区分简单类型和对象类型的不同处理方式,并且明确传递的是值的副本还是引用的副本。这对于编写高效、正确的Java程序非常重要。
在类型系统方面,Java提供了更丰富的数据类型,包括原始类型(如byte、short、int、long、float、double)和引用类型(如类、接口和数组)。Java强制要求在使用变量前先声明其类型,这有助于编译器检查类型匹配并...
在数据类型方面,JVM规范区分了原始类型和引用类型。原始类型包括了整型、浮点型、返回地址类型、布尔类型等,而引用类型则指向对象的引用,例如类实例、数组。JVM在执行字节码时会使用这些数据类型,对它们进行相应...
Java的基本数据类型中,int类型用于存储整数,double类型用于存储双精度浮点数,byte类型用于存储较小的整数,char类型用于存储单个字符。 Java中的运算符也被广泛使用,包括算术运算符、比较运算符、逻辑运算符等...
在Java编程语言中,关于参数传递的方式存在两种基本类型:按值传递和按引用传递。这两种方式直接影响着程序的执行逻辑以及对象的状态变化。对于初学者来说,理解和区分这两种传递方式是非常重要的。本文将详细介绍...
数组属于引用类型,数组可以看成是一个对象,数组中的每一个元素相当于该对象的成员变量,因为数组本身就是对象,Java 中对象是存放在堆中的,因此数组无论保存原始类型还是其他类型,数组对象本身都是在堆中。...
”为了回答这个问题,我们先要理解Java中的基本数据类型和引用数据类型的差异。 在Java中,基本类型包括`int`、`double`、`char`、`byte`等,它们在被传递到方法时,会创建一个新的副本。举个例子: ```java ...
this关键字在Java中用于指代当前对象,可以在构造方法和实例方法中使用,帮助区分实例变量和局部变量。 Java提供了基本类型对应的包装类,如Integer对应int,这些包装类提供了额外的操作,如自动装箱和拆箱。Java的...
在Java中,`static`关键字用于声明类级别的变量和方法,它们与类相关而不是类的实例。`static`方法不能被覆盖,因为它们在编译时就已经绑定,而覆盖(Overriding)是基于运行时动态绑定的。同时,`static`方法不能...
总之,理解Java的参数传递机制,关键是要区分对象的引用和对象的内容。无论将Java的参数传递称为"值传递"还是"引用传递",重要的是要明白对象的引用不会改变,但对象的内容可以在方法中被修改。这种机制使得Java的...
此外,Java还区分了原始类型(如int)和引用类型(如Integer),两者在内存分配、默认值、操作方式等方面有所不同。Integer是int的包装类,提供了更多的方法和功能。 String与StringBuffer的主要区别在于,String是...
3. **this本质**:`this`关键字在Java中表示当前对象的引用,它常用于区分成员变量和局部变量,或者在构造方法中调用其他构造方法。 4. **OOTest**:OOTest可能是指对象和类(Object-Oriented Testing)的测试,...