Java基础之运算符——对象赋值

2018-09-27  本文已影响0人  一生鎻愛

猜猜下面代码中第三行输出的t2.level是多少呢?

public class Tank {

    private int level;
    
    public static void main(String[] args) {
        Tank t1 = new Tank();
        Tank t2 = new Tank();
        t1.level = 9;
        t2.level = 19;
        System.out.println("t1.level=" + t1.level + ",t2.level="  + t2.level);
        t1 = t2;
        System.out.println("t1.level=" + t1.level + ",t2.level="  + t2.level);
        t1.level = 29;
        System.out.println("t1.level=" + t1.level + ",t2.level="  + t2.level);
    }

}

运行结果

t1.level=9,t2.level=19
t1.level=19,t2.level=19
t1.level=29,t2.level=29

我们期望是t1t2是相对独立的,但结果是我们修改了t1的值之后,t2的值也跟着变了,原因是t1 = t2这句话并不是将t2的值赋值给t1,而是将t2这个对象引用赋值给了t1,也就是说此时t1t2指向了相同的对象。
这种特殊现象通常称作别名现象,是java操作对象的一种基本方式,那么如何才能避免这个样的问题呢?

t1.level = t2.level;

这样就能保持两个对象的独立,而不是将t1t2绑定到相同的对象。
还有下面这种情况也属于别名问题

public class Letter {

    char c;
    
    static void f(Letter y) {
        y.c = 'z';
    }
    
    public static void main(String[] args) {
        Letter x = new Letter();
        x.c = 'a';
        System.out.println("x.c : " + x.c);
        f(x);
        System.out.println("x.c : " + x.c);
    }
}

运行结果

x.c : a
x.c : z

上一篇 下一篇

猜你喜欢

热点阅读