java引用类型与基本类型

上传人:宝路 文档编号:20923563 上传时间:2017-11-22 格式:DOC 页数:10 大小:215.35KB
返回 下载 相关 举报
java引用类型与基本类型_第1页
第1页 / 共10页
java引用类型与基本类型_第2页
第2页 / 共10页
java引用类型与基本类型_第3页
第3页 / 共10页
java引用类型与基本类型_第4页
第4页 / 共10页
java引用类型与基本类型_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《java引用类型与基本类型》由会员分享,可在线阅读,更多相关《java引用类型与基本类型(10页珍藏版)》请在金锄头文库上搜索。

1、java 引用类型与基本类型 2010-02-06 10:50:37| 分类: IT 技术|字号 订阅Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。另外, Java 还为每个原始类型提供了封装类(Wrapper)。如果需要一个整型变量,是使用基本的 int 型呢,还是使用 Integer 类的一个对象呢?如果需要声明一个布尔类型,是使用基本的 boolean,还是使用 Boolean 类的一个对象呢?本文可帮助您作出决定。下表列出了原始类型以及它们的对象封装类。原始类型 封装类=boolean Booleanchar Characterbyte Byteshort Short

2、int Integerlong Longfloat Floatdouble Double引用类型和原始类型的行为完全不同,并且它们具有不同的语义。例如,假定一个方法中有两个局部变量,一个变量为 int 原始类型,另一个变量是对一个 Integer 对象的对象引用:int i = 5; / 原始类型Integer j = new Integer(10); / 对象引用这两个变量都存储在局部变量表中,并且都是在 Java 操作数堆栈中操作的,但对它们的表示却完全不同。(本文中以下部分将用通用术语堆栈代替操作数堆栈或局部变量表。)原始类型 int 和对象引用各占堆栈的 32 位。(要表示一个 int

3、 或一个对象引用,Java 虚拟机实现至少需要使用 32 位存储。)Integer 对象的堆栈项并不是对象本身,而是一个对象引用。Java 中的所有对象都要通过对象引用访问。对象引用是指向对象存储所在堆中的某个区域的指针。当声明一个原始类型时,就为类型本身声明了存储。前面的两行代码表示如下:引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。许多程序的代码将同时包含原始类型以及它们的对象封装。当检查它们是否相

4、等时,同时使用这两种类型并了解它们如何正确相互作用和共存将成为问题。程序员必须了解这两种类型是如何工作和相互作用的,以避免代码出错。例如,不能对原始类型调用方法,但可以对对象调用方法:int j = 5;j.hashCode(); / 错误/.Integer i = new Integer(5);i.hashCode(); / 正确使用原始类型无须调用 new,也无须创建对象。这节省了时间和空间。混合使用原始类型和对象也可能导致与赋值有关的意外结果。看起来没有错误的代码可能无法完成您希望做的工作。例如:import java.awt.Point;class Assignpublic stati

5、c void main(String args)int a = 1;int b = 2;Point x = new Point(0,0);Point y = new Point(1,1); /1System.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; /2x.setLoca

6、tion(5,5); /3System.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 1b is 2x is java.awt.Pointx=0,y=0y is java.awt.Pointx=1,y=1Performing assignment and setLocation.a is 3b is 2x is java.awt.Pointx=5,y=5y is java.awt.Pointx=5,y

7、=5修改整数 a 和 b 的结果没什么意外的地方。b 的值被赋予整型变量 a,结果 a 的值增加了 1。这一输出反映了我们希望发生的情况。但是,令人感到意外的,是在赋值并调用 setLocation 之后 x 和 y 对象的输出。我们在完成 x = y 赋值之后特意对 x 调用了 setLocation,x 和 y 的值怎么会相同呢?我们毕竟将 y 赋予 x,然后更改了 x,这与我们对整数 a 和 b 进行的操作没什么不同。这种混淆是由原始类型和对象的使用造成的。赋值对这两种类型所起的作用没什么不同。但它可能看起来所有不同。赋值使等号 (=) 左边的值等于右边的值。这一点对于原始类型(如前面的

8、 int a 和 b)是显而易见的。对于非原始类型(如 Point 对象),赋值修改的是对象引用,而不是对象本身。因此,在语句x = y;之后,x 等于 y。换句话说,因为 x 和 y 是对象引用,它们现在引用同一个对象。因此,对 x 所作的任何更改也会更改 y。下面是 /1 处的代码执行以后的情况:执行 /2 处的赋值以后情况如下:当在 /3 处调用 setLocation 时,这一方法是对 x 引用的对象执行的。因为 x 引用的 Point 对象也正是 y 所引用的对象,所以我们现在得到以下结果:因为 x 和 y 引用同一个对象,所以对 x 执行的所有方法与对 y 执行的方法都作用于同一个

9、对象。区分引用类型和原始类型并理解引用的语义是很重要的。若做不到这一点,则会使编写的代码无法完成预定工作。 来源:考试大-计算机二级考试java 中的引用类型概念(2012-10-09 16:06:33)转 载 标签: java引用类型按值传递按引用传递杂谈分类: java1、什么是引用类型引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。 在 java 里面除去基本数据类型的其它类型都是引用数据类型,自己定义的 class 类都是引用类型,可以像基本类型一样使用。示例如下:public class MyDate private int day = 8

10、;private int month = 8;private int year = 2008;private MyDate(int day, int month, int year).public void print().public class TestMyDate public static void main(String args) /这个 today 变量就是一个引用类型的变量MyDate today = new MyDate(23, 7, 2008);2、引用类型的赋值在 java 编程语言中,用类的一个类型声明的变量被指定为引用类型,这是因为它正在引用一个非原始类型,这对赋值具

11、有重要的意义。如下代码:int x = 7;int y = x;String s = Hello;String t = s;四个变量被创建:两个原始类型 int 和两个引用类型 String。x 的值是 7,而这个值被复制到 y;x 和 y 是两个独立的变量且其中任何一个的进一步的变化都不对另外一个构成影响。至于变量 s 和 t,只有一个 String 对象存在,它包含了文本Hello,s 和 t 均引用这个单一个对象。如果将变量 t 重新定义为 t=World;则新的对象 World 被创建,而 t 引用这个对象。 3、按值传递和按引用传递的区别1)按值传递指的是在方法调用时,传递的参数是按

12、值的拷贝传递。示例如下:1. public class TempTest 2. private void test1(int a) 3. / 做点事情4. a+;5. 6. 7. public static void main(String args) 8. TempTest t = new TempTest();9. int a = 3;10. t.test1(a);/这里传递的参数 a 就是按值传递。11. System.out.printIn(main 方法中的 a= + a);12. 13. 按值传递的重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。第 9 行的a 和第 2 行

13、的 a 是两个变量,当改变第 2 行的 a 的值,第 9 行 a 的值是不变的,所以打印结果是 3。main 方法中的 a 为 3test1 方法中的 a 为 4我们把第 9 行的 a 称之为实参,第 2 行的 a 称之为形参;对于基本数据类型,形参数据的改变,不影响实参的数据。2)按引用传递指的是在方法调用时,传递的参数是按引用进行传递,其实传递的是引用的地址,也就是变量所对应的内存空间的地址。示例如下:1. public class TempTest 2. private void test1(A a) 3. a.age = 20;4. System.out.printIn(test1 方

14、法中的 age=+a.age);5. 6. public static void main(String args) 7. TempTest t = new TempTest();8. A a = new A();9. a.age = 10;10. t.test1(a);/ 这里传递的参数 a 就是按引用传递11. System.out.printIn(main 方法中的 age=+a.age);12. 13. 14. classA 15. public int age = 0;16. 运行结果如下:test1 方法中的 age = 20 main 方法中的 age = 20按引用传递的重要特点:传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间) 。要想正确理解按引用传递的过程,就必须学会理解内存分配的过程,内存分配示意图可以辅助我们去理解这个过程。用上面的例子来进行分析:(1) 、运行开始,运行第 8 行,创建了一个 A 的实例,内存分配示意图如下:main 方法中的 a (2) 、运行第 9 行,修改了 A 实例里面的 age 的值,内存分配示意图如下: main 方法中的 a (3) 、运行第 10 行,是把 main 方法中的变量 a 所引用的内存空间地址,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号