Java为对象赋值是一个很有意思的过程,接下来你将看到它与其他编程语言的不同之处:
当我们操作一个对象时,真正操作的其实是这个对象的引用,所以请思考:有两个不同的对象,其引用分别为A和B,如果我想要让A的值等于B的值,有几种方法并且它们产生的结果一样吗?下面这个示例将演示这种行为:
//Assignment.java
//使用对象赋值
class Student{
int ages;
}
public class Assignment{
public static void main(String[] args){
Student stu1 = new Student();
Student stu2 = new Student();
stu1.ages = 10;
stu2.ages = 20;
System.out.println("1: stu1.ages: " + stu1.ages + ", stu2.ages: " + stu2.ages);
//first method
stu1.ages = stu2.ages;
System.out.println("2: stu1.ages: " + stu1.ages + ", stu2.ages: " + stu2.ages);
stu1.ages = 15;
System.out.println("3: stu1.ages: " + stu1.ages + ", stu2.ages: " + stu2.ages);
//second method
stu1 = stu2;
System.out.println("4: stu1.ages: " + stu1.ages + ", stu2.ages: " + stu2.ages);
stu1.ages = 30;
System.out.println("5: stu1.ages: " + stu1.ages + ", stu2.ages: " + stu2.ages);
}
}
/*输出
1: stu1.ages: 10, stu2.ages: 20
2: stu1.ages: 20, stu2.ages: 20
3: stu1.ages: 15, stu2.ages: 20
4: stu1.ages: 20, stu2.ages: 20
5: stu1.ages: 30, stu2.ages: 30
*/
第一种方法与其他编程语言相似,它保持了两个对象彼此独立,而不是丢弃一个对象。但是这种直接操作对象内部的字段违背了Java的设计原则。
第二种方法则很有意思,在将stu2赋值给stu1后,又修改了stu1。由于赋值操作的是引用,修改stu1的同时也改变了stu2!这是因为它们指向了相同对象而不是彼此独立(stu1最初包含的引用被覆盖了,所以它最初指向的对象消失了,会被垃圾收集器清理)。这种现象通常称为“别名”。方法一可以避免别名的出现。
别名问题及其解决方法非常复杂,如果以后我能遇到相关问题或误区我会及时在本篇文章更新~