




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java引用类型与基本类型2010-02-06 10:50:37|分类:IT技术|字号订阅Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。另外,Java 还为每个原始类型提供了封装类(Wrapper)。如果需要一个整型变量,是使用基本的 int 型呢,还是使用 Integer 类的一个对象呢?如果需要声明一个布尔类型,是使用基本的 boolean,还是使用 Boolean 类的一个对象呢?本文可帮助您作出决定。下表列出了原始类型以及它们的对象封装类。原始类型 封装类=boolean Booleanchar Characterbyte Byteshort Shortint Integerlong Longfloat Floatdouble 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 Assignpublic static 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.setLocation(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=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中的引用类型概念 (2012-10-09 16:06:33)转载标签:java引用类型按值传递按引用传递杂谈分类:java1、什么是引用类型引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。示例如下:public class MyDate private int day = 8;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编程语言中,用类的一个类型声明的变量被指定为引用类型,这是因为它正在引用一个非原始类型,这对赋值具有重要的意义。如下代码: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)按值传递指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下: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行的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方法中的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 = 20main方法中的age = 20按引用传递的重要特点:传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。要想正确理解按引用传递的过程,就必须学会理解内存分配的过程,内存分配示意图可以辅助我们去理解这个过程。用上面的例子来进行分析:(1)、运行开始,运行第8行,创建了一个A的实例,内存分配示意图如下:main方法中的a(2)、运行第9行,修改了A实例里面的age的值,内存分配示意图如下:main方法中的a(3)、运行第10行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽,但它们指向了同一个A实例。内存分配示意图如下:(4)、运行第3行,为test1方法中的变量a指向A实例的age进行赋值,完成后形成新的内存示意图如下:此时A实例的age值的变化是由test1方法引起的。(5)、运行第4行,根据此时的内存示意图,输出test1方法中的age=20(6)、运行第11行,根据此时的内存示意图,输出main方法中的age=203)对上述例子的改变理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面的呢?方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:1.public class TempTest 2. private void test1(A a) 3. a = new A();/ 新加的一行4. a.age = 20;5. System.out.printIn(test1方法中的age=+a.age);6. 7. public static void main(String args) 8. TempTest t = new TempTest();9. A a = new A();10. a.age = 10;11. t.test1(a);/ 这里传递的参数a就是按引用传递12. System.out.printIn(main方法中的age=+a.age);13. 14. 15. classA 16.public int age = 0;17. 运行结果为:test1方法中的age=20main方法中的age=10实现了按引用传递的值传递前与传递后互不影响,还是使用内存示意图来理解一下:(1)、运行开始,运行第9行,创建了一个A实例,内存分配示意图如下:(2)、运行第10行,是修改A实例里面的age的值,运行后内存分配示意图如下:(3)、运行第11行,是把mian方法中的变量a所引用的内存地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。(4)、运行第3行,为test1方法中的变量a重新生成了新的A实例,完成后形成的新的内存示意图如下:(5)、运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成新的内存示意图如下:注意:这
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 严浩翔协议书婚姻
- 新冠工作协议书
- 财产约定协议书范本
- 股权对赌协议书
- 修理厂与单位合作协议书
- 代缴费协议书
- 销售战略合作协议书
- 修模费用协议书
- 怎么找三方协议书
- 饭店安全防火培训方案课件
- 2022英威腾MH600交流伺服驱动说明书手册
- 分期支付欠薪协议书范本
- 2025年中国药典培训试题及答案
- Q-JJJ 9002-2025 铁路建设项目安全穿透式管理实施指南
- 2025年高校教师资格证之高等教育法规题库(综合题)
- 2025至2030中国数字PCR(dPCR)和实时PCR(qPCR)行业发展趋势分析与未来投资战略咨询研究报告
- 《海堤生态化设计技术指南(T-CHES 139-2024)》知识培训
- 制药设备改造管理制度
- DB31/T 1013-2016城市轨道交通地下车站环境质量要求
- 2025-2030公务航空行业市场发展现状分析及竞争格局与投资价值研究报告
- 德普置业-湖南长沙美洲故事项目东区营销思路
评论
0/150
提交评论