`

Java中区分引用类型和原始类型

阅读更多

转自:

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 执行的方法都作用于同一个对象。

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

分享到:
评论

相关推荐

    CSDN.rar_简繁体_股票 java

    区分引用类型和原始类型 Java中的两个特殊变量this和super Java中利用散列表实现股票行情的查询 Java中文问题详解 Vector在Java编程中的应用 编写高级应用程序1 编写高级应用程序2 实现 Swing 的 JTables 和 ...

    JAVA面试题最全集

    9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet技术 1.描述JSP和Servlet的区别、共同点、各自应用的范围 2.在Web开发中...

    java 面试题 总结

    Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型封装类 booleanBoolean charCharacter byte...

    Java面试宝典-经典

    43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...

    Java面试宝典2010版

    43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...

    程序员考试刷题-Java:Java

    区分对象引用变量和原始变量 知道如何读取或写入对象字段 解释对象的生命周期(创建、“通过重新分配取消引用”和垃圾收集) 开发使用 Boolean、Double 和 Integer 等包装类的代码 使用运算符和决策结构 使用 Java ...

    java面试题大全(2012版)

    43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...

    最新Java面试宝典pdf版

    43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...

    Java面试笔试资料大全

    43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...

    java面试宝典2012

    43、Java中的异常处理机制的简单原理和应用。 30 44、请写出你最常见到的5个runtime exception。 31 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...

    JAVA面试宝典2010

    43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...

    超级有影响力霸气的Java面试题大全文档

     Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。 原始类型 封装类 boolean Boolean char Character ...

    java面试宝典2012版.pdf

    43、Java中的异常处理机制的简单原理和应用。 44、请写出你最常见到的5个runtime exception。 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗...

    Java面试宝典2012新版

    43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...

    Java面试宝典2012版

    43、Java中的异常处理机制的简单原理和应用。 28 44、请写出你最常见到的5个runtime exception。 28 45、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出...

    oca-preparacao-alura:这个项目是练习基本的Java。 为我准备Oracle认证助理Java程序员测试

    区分对象引用变量和原始变量 知道如何读写对象字段 解释对象的生命周期(创建,“通过重新分配取消引用”和垃圾回收) 开发使用包装器类(例如Boolean,Double和Integer)的代码 声明,实例化,初始化和使用一维...

    kotlin学习项目案例

    3. 扩展函数与属性(Extension Functions & Properties):Kotlin 允许你对已有类型进行扩展,添加新的函数和属性,而无需修改原始类型的定义。这为编写灵活、可复用的代码提供了便利。 4. 数据类(Data Classes)...

Global site tag (gtag.js) - Google Analytics