Java操作对象的基本方式之一——“别名”

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最初包含的引用被覆盖了,所以它最初指向的对象消失了,会被垃圾收集器清理)。这种现象通常称为“别名”。方法一可以避免别名的出现。

别名问题及其解决方法非常复杂,如果以后我能遇到相关问题或误区我会及时在本篇文章更新~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值