加拿大华人论坛 加拿大生活信息java变量的赋值与传递
在加拿大
java变量的赋值与传递http://article.pchome.net/187777.html 类型:转载 作者: 未知 来源 : 中国IT实验室 责编:宝良 时间:2007-03-11 数据类型 java[FONT=宋体]的数据类型有两类:[/FONT] l PrimitiveType([FONT=宋体]简单类型[/FONT]) l ReferenceType([FONT=宋体]引用类型[/FONT]) 1.1 PrimitiveType([FONT=宋体]简单类型[/FONT]) [FONT=宋体](参考:[/FONT]langspec-3.0/typesValues.html#4.2[FONT=宋体])[/FONT] PrimitiveType[FONT=宋体]的分类如下所示:[/FONT] l PrimitiveType: NumericType boolean l NumericType: IntegralType FloatingPointType l IntegralType: one of byte short int long char l FloatingPointType: one of float double PrimitiveType[FONT=宋体]是[/FONT]java[FONT=宋体]预定义的类型,并且使用保留字命名。比如[/FONT]int[FONT=宋体]、[/FONT]long[FONT=宋体]、[/FONT]float[FONT=宋体]等。由此看来其包装类不算[/FONT]PrimitiveType[FONT=宋体]。[/FONT] 1.2 ReferenceType([FONT=宋体]引用类型[/FONT]) [FONT=宋体](参考:[/FONT]langspec-3.0/typesValues.html#4.3[FONT=宋体])[/FONT] ReferenceType[FONT=宋体]有三种类型:类、接口、和数组。[/FONT] 2. [FONT=黑体]变量[/FONT] [FONT=宋体](参考:[/FONT]langspec-3.0/typesValues.html#4.12[FONT=宋体])[/FONT] A variable is a storage location and has an associated type, sometimes called its compile-time type, that is either a primitive type (§4.2) or a reference type (§4.3). [FONT=宋体]变量是关联于特定类型的存储单元,所关联的类型有时叫做变量的编译时类型,即,既可以是简单类型也可以是引用类型。[/FONT] 2.1 [FONT=宋体]简单类型变量[/FONT] A variable of a primitive type always holds a value of that exact primitive type. [FONT=宋体]简单类型的变量总是执持简单类型的值。[/FONT] 2.2 [FONT=宋体]引用类型变量[/FONT] A variable of a class type T can hold a null reference or a reference to an instance of class T or of any class that is a subclass of T. A variable of an interface type can hold a null reference or a reference to any instance of any class that implements the interface. [FONT=宋体]类型是[/FONT]T[FONT=宋体]的类的变量可以执持[/FONT]null[FONT=宋体]引用,或者类[/FONT]T[FONT=宋体]及其子类的实例引用。接口类型的变量可以执持[/FONT]null[FONT=宋体]引用,或者任何实现该接口的类的实例引用。[/FONT] [FONT=宋体]注:与[/FONT]langspec2.0[FONT=宋体]不同的是,[/FONT]3.0[FONT=宋体]引入了泛型的概念,其中有[/FONT]Type Variable[FONT=宋体]的概念,上面的[/FONT]T[FONT=宋体]就是一个[/FONT]Type Variable[FONT=宋体]。[/FONT] 3.[FONT=黑体]赋值与传递[/FONT] [FONT=宋体]如上所述,可以得出下面结论:[/FONT] 1) [FONT=宋体]对于简单类型变量的赋值是按值传递。就是说直接把数值存放到变量的存储单元里。[/FONT] 2) [FONT=宋体]对于引用类型的变量,赋值是把原对象的引用(可以理解为入口地址),存放在变量的存储单元里。[/FONT] 3.1 [FONT=宋体]对象的赋值[/FONT] [FONT=宋体]简单类型的赋值很容易理解,这里仅讨论对象的赋值。所有引用类型的实例就是我们常说的对象。[/FONT] [FONT=宋体]可以这样说,除了[/FONT]null[FONT=宋体]以外,任何变量的初始赋值都是分两步:[/FONT] 1) [FONT=宋体]创建对象实例[/FONT] 2) [FONT=宋体]把对象实例的引用赋值给变量。[/FONT] [FONT=宋体]比如:[/FONT] Object o1 = new Object(); 3.2 [FONT=宋体]传递[/FONT] [FONT=宋体] 传递是通过变量之间的赋值实现的。在以前的回贴中我说过这样一句话,单纯从变量的角度看,变量之间的赋值是值传递。现在我解释一下我的观点。[/FONT] [FONT=宋体]先举一个例子:[/FONT] // java[FONT=宋体]中所有的类的基类默认为[/FONT]Object[FONT=宋体],在此不赘述。[/FONT] class Object1 {} class Object2 {} Object o1, o2; o1 = new Object1(); o2 = o1; o2 = new Object2(); [FONT=宋体]这时候,[/FONT]o1[FONT=宋体]的类型是什么?是[/FONT]Object1[FONT=宋体]还是[/FONT]Object2[FONT=宋体]?正确答案是[/FONT]Object1[FONT=宋体]。[/FONT] [FONT=宋体]再举一个例子:[/FONT] class Word { String word; public Word(String word){ this.word = word; } public void print(){ System.out.println(word); } } Word o1, o2; o1 = new Word("Every Day"); o2 = o1; o2 = new Word("Every Night!"); w1.print(); [FONT=宋体]会出现什么结果?[/FONT]"Every Day" [FONT=宋体]还是[/FONT] "Every Night!"[FONT=宋体]?仍然是[/FONT]"Every Day"[FONT=宋体]。[/FONT] [FONT=宋体] 这里面有一个很多人特别是初学者忽视了的观点[/FONT] [FONT=宋体]??[/FONT] [FONT=宋体]变量可以引用对象,但变量不是对象。什么是对象?对象初始化之后,会占用一块内存空间,严格意义上讲,这段内存空间才是对象。对象创建于数据段,而变量存在于代码段;对象的入口地址是不可预知的,所以程序只能通过变量来访问对象。[/FONT] [FONT=宋体]回到我们的问题上来,第一句[/FONT] o1 = new Word("Every Day"); [FONT=宋体]首先创建一个[/FONT]Word[FONT=宋体]实例,即对象,然后把“引用”赋值给[/FONT]o1[FONT=宋体]。[/FONT] [FONT=宋体]第二句[/FONT] o2 = o1; o1[FONT=宋体]把对象的引用赋值给[/FONT]o2[FONT=宋体],注意赋的值是对象的引用而不是[/FONT]o1[FONT=宋体]自身的引用。所以,在的三句[/FONT] o2 = new Word("Every Night!"); [FONT=宋体]就是又创建一个新对象,再把新对象的引用赋值给[/FONT]o2[FONT=宋体]。[/FONT] [FONT=宋体]因为[/FONT]o1[FONT=宋体]和[/FONT] o2[FONT=宋体]之间是值传,所以,对[/FONT]o2[FONT=宋体]的改变丝毫不会影响到[/FONT]o1[FONT=宋体]。[/FONT] [FONT=宋体]也有一种情况好像是影响到了[/FONT]o1[FONT=宋体],我们继续上面的例子,给[/FONT]Word[FONT=宋体]增加一个方法[/FONT] class Word { String word; public Word(String word){ this.word = word; } public void print(){ System.out.println(word); } public void setWord(String word){ this.word = word; } } Word o1, o2; o1 = new Word("Every Day"); o2 = o1; o2.set Word("Every Night!"); o1.print(); [FONT=宋体]这时的结果是[/FONT]"Every Night!"[FONT=宋体]。[/FONT] [FONT=宋体]那么,这是改变了[/FONT]o1[FONT=宋体]吗?从严格意义上讲,不是。因为[/FONT]o1[FONT=宋体]只是保存对象的引用,执行之后,[/FONT]o1[FONT=宋体]还是持有该对象的引用。所以,[/FONT]o1[FONT=宋体]没变,变的是[/FONT]o1[FONT=宋体]所引用的对象。[/FONT] 3.3 final[FONT=宋体]变量能改变吗?[/FONT] [FONT=宋体]好了,我再出道题目:[/FONT] final Word o3 = new Word("Every Day!"); o3.setWord("Every Night!"); [FONT=宋体]能通过编译吗?对于[/FONT]final[FONT=宋体]的定义大家都知道,[/FONT]o3[FONT=宋体]是相当于一个常量,既然是常量,怎么能再改变呢?[/FONT] [FONT=宋体]答案是肯定的,能。道理我想大家也明白,这里不罗嗦了。[/FONT] 3.4 [FONT=宋体]包装类的赋值与传递[/FONT] [FONT=宋体] 以前看过文章说,对于[/FONT]java[FONT=宋体]基本类型及其包装类采用值传递,对于对象采用引用传递。从[/FONT]langspec[FONT=宋体]看,首先包装类不是[/FONT]PrimitiveType[FONT=宋体],那就只能是[/FONT]ReferenceType[FONT=宋体],而[/FONT]ReferenceType[FONT=宋体]的变量保存的是引用。既然保存的是引用,也就无从传递数值。那么,这两个观点矛盾吗?[/FONT] [FONT=宋体] 首先,肯定是[/FONT]langspec[FONT=宋体]正确。[/FONT] [FONT=宋体]其次,虽然前一观点在原理上有错误,但却不影响正常使用。[/FONT] [FONT=宋体] 为什么会出现这种情况?这是因为这些包装类具有一个简单类型的特征,即,不可改变。以[/FONT]String[FONT=宋体]为例,看一下[/FONT]API Specification[FONT=宋体],不会找到能够改变[/FONT]String[FONT=宋体]对象的方法。任何输出上的改变都是重建新的[/FONT]String[FONT=宋体]对象,而不是在原对象基础上改变。改变的是变量的内容,即,不同对象的引用。[/FONT] [FONT=宋体][/FONT] [FONT=宋体][/FONT]
评论
退役请请请请请请请请请请请请请请请请请不要给我发短信提问....不要逼我麻烦先看这里:配偶及小孩团聚资料 整理帖http://forum.iask.ca/showthread.php?t=59279java变量的赋值与传递 http://article.pchome.net/187777.html [FONT=宋体]......[/FONT] [FONT=宋体]这时候,[/FONT]o1[FONT=宋体]的类型是什么?是[/FONT]Object1[FONT=宋体]还是[/FONT]Object2[FONT=宋体]?正确答案是[/FONT]Object1[FONT=宋体]。[/FONT][FONT=宋体]再举一个例子:[/FONT]class Word {String word;public Word(String word){this.word = word;}public void print(){System.out.println(word);}}Word o1, o2;o1 = new Word("Every Day");o2 = o1;o2 = new Word("Every Night!");w1.print();[FONT=宋体]会出现什么结果?[/FONT]"Every Day" [FONT=宋体]还是[/FONT] "Every Night!"[FONT=宋体]?仍然是[/FONT]"Every Day"[FONT=宋体]。[/FONT][FONT=宋体]这里面有一个很多人特别是初学者忽视了的观点[/FONT] [FONT=宋体]??[/FONT] [FONT=宋体]变量可以引用对象,但变量不是对象。什么是对象?对象初始化之后,会占用一块内存空间,严格意义上讲,这段内存空间才是对象。对象创建于数据段,而变量存在于代码段;对象的入口地址是不可预知的,所以程序只能通过变量来访问对象。[/FONT]点击展开...作者此处信口开河了 应该是:对象创建于堆(heap),变量存在于数据段(for global or static variables)或堆栈(for automatic variables). 代码段是read-only的,只能存代码。
评论
http://www.canadameet.com/bbs/showthread.php?t=72803回复: java变量的赋值与传递LZ,就几句话的事没那么麻烦吧值传递只有JAVA的八种基本类型和STRING类,其他的都是值引用
评论
回复: java变量的赋值与传递LZ,就几句话的事没那么麻烦吧值传递只有JAVA的八种基本类型和STRING类,其他的都是值引用点击展开...你说的这一段肯定是错误的。STRING类型, 还有主类型的包装类, 比如Integer,Float,Long, 还有BigDecimal 等,与其他的类相比,本来都是一样的,但是其内含的值都是不能变化的, 每个对其运算,都不会改变原对象的值,只要改变了,一定是产生一个新的对象。因此,实质上,他们和其他类,数组,或者说值引用是一样的,只是由于其内部的特有机制,表象不同罢了。
评论
退役请请请请请请请请请请请请请请请请请不要给我发短信提问....不要逼我麻烦先看这里:配偶及小孩团聚资料 整理帖http://forum.iask.ca/showthread.php?t=59279回复: java变量的赋值与传递1)对于简单类型变量的赋值是按值传递。就是说直接把数值存放到变量的存储单元里。2)对于引用类型的变量,赋值是把原对象的引用(可以理解为入口地址),存放在变量的存储单元里。这个说的我是非常赞同的。简单类型变量, 比如:int i;i=6;i 在初始化的时候,就被初始化为0; 第二行,就变成6了。而 User u;u= new User("Zhang San");u= new User("Li Si");i 在初始化的时候,就被初始化为null;第二行, 实际上实际是有若干个步骤:1 分配一个内存空间,2 按照构造方法初始化Zhang San。3 将上面的内存空间的地址,赋值给u,替换掉原来的null;第三行,User "Zhang San" 并没有变化,1 分配一个内存空间,2 按照构造方法初始化Li Si。3 将上面的内存空间的地址,赋值给u,替换掉原来的Zhang San的地址引用;4 是另外的事情,后来有垃圾回收机制,销毁Zhang San那一块地址空间。
评论
退役请请请请请请请请请请请请请请请请请不要给我发短信提问....不要逼我麻烦先看这里:配偶及小孩团聚资料 整理帖http://forum.iask.ca/showthread.php?t=592791)对于简单类型变量的赋值是按值传递。就是说直接把数值存放到变量的存储单元里。2)对于引用类型的变量,赋值是把原对象的引用(可以理解为入口地址),存放在变量的存储单元里。这个说的我是非常赞同的。简单类型变量, 比如:int i;i=6;i 在初始化的时候,就被初始化为0; 第二行,就变成6了。而 User u;u= new User("Zhang San");u= new User("Li Si");i 在初始化的时候,就被初始化为null;第二行, 实际上实际是有若干个步骤:1 分配一个内存空间,2 按照构造方法初始化Zhang San。3 将上面的内存空间的地址,赋值给u,替换掉原来的null;第三行,User "Zhang San" 并没有变化,1 分配一个内存空间,2 按照构造方法初始化Li Si。3 将上面的内存空间的地址,赋值给u,替换掉原来的Zhang San的地址引用;4 是另外的事情,后来有垃圾回收机制,销毁Zhang San那一块地址空间。点击展开...那更确切的说,如果一个类被定义为FINAL了,那对的引用就是值引用
评论
回复: java变量的赋值与传递那更确切的说,如果一个类被定义为FINAL了,那对的引用就是值引用点击展开...错! 和FINAL没有任何关系
·生活百科 我养公鸡两年了,今天收到投诉
·生活百科 200ML蜂胶糖浆可以装在两个100ML空瓶里带上飞机吗?