标签:编程 情况 生成 基本 结果 相同 基本数据类型 数据 oid
赋值使用操作符“=”。它的意思是“取右边的值(即右值),把它复制给左边(即左值)”。右值可以是任何常数、变量或者表达式(只要它能生成一个值就行)。但左值必须是一个明确的、已命名的变量。也就是说,必须有一个物理空间可以存储等号右边的值。
对基本数据类型的赋值是很简单的。基本数据类型存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方。
public class TestA{ public static void main(String[] args){ int a,b; b=9; a=b; System.out.println("1.a="+a+" "+"b="+b); a=10; System.out.println("2.a="+a+" "+"b="+b); } } /* *输出结果: *1.a=9 b=9 *2.a=10 b=9 */
上述代码,对基本数据类型使用a=b,那么b的内容就复制给了a。若接着又修改了a,而b根本不会受到这种修改的影响。但在对对象“赋值”的时候,情况却有所不同。
对一个对象进行赋值操作时,我们真正操作的是对象的引用。所以将一个对象赋值给另一个对象,实际是将“引用”从一个地方复制到另一个地方。这意味着假如对对象使用c=d,那么c和d都指向原本只有d指向的那个对象。
public class Person { int age; } public class TestB { public static void main(String[] args) { Person p1=new Person(); Person p2=new Person(); p1.age=10; p2.age=20; p1=p2; System.out.println("1.p1.age="+p1.age+" p2.age="+p2.age); p1.age=15; System.out.println("2.p1.age="+p1.age+" p2.age="+p2.age); } } /* * 输出结果: * 1.p1.age=20 p2.age=20 * 2.p1.age=15 p2.age=15 */
上述代码,对Person对象使用p1=p2,再对p1赋值时也改变了p2.这是由于p1和p2包含的是相同的引用,它们指向相同的对象。原本p1包含的对对象的引用,是指向一个值为10的对象。在对p1赋值的时候,这个引用被覆盖,也就是丢失了;而那个不再被引用的对象会由“垃圾回收器”自动清理。
标签:编程 情况 生成 基本 结果 相同 基本数据类型 数据 oid
原文地址:https://www.cnblogs.com/czbxdd/p/9031338.html