Java中的别名现象

在学习《Java编程思想中》遇到一个有意思的问题:别名现象,特此记录下来。

/**
 * 基本类型数据和引用类型数据= 赋值测试
 * 
 * @author 淡写
 *
 */
public class Tank {
	int level;

	public static void main(String[] args) {
        Tank t1= new Tank();
        Tank t2= new Tank();
        t1.level=9;
        t2.level=48;
        //t1.level=t2.level 直接操作对象内的属性容易导致混乱,违背了良好的面向对象程序设计的原则,请注意
        System.out.println(t1.level+","+t2.level);
        t1=t2;
        System.out.println(t1.level+","+t2.level);
        t1.level=27;
        System.out.println(t1.level+","+t2.level);
        t2.level=34;
        System.out.println(t1.level+","+t2.level);
        //将一个对象赋值给另外一个对象, 是实际是将t2引用的地址复制给t1 之前t1引用的地址将无效,因为它的地址为t2的了,而t1废弃的地址 将由jvm中的Gc来回收
	}
}
public class Letter {
    char c;
}
/**
 * 方法调用中的别名问题
 * 
 * @author 淡写
 *
 */
public class PassObject {
	static void f(Letter y) {
		y.c = 'z';
	}
	int a;
	/*
	 * 说说我这里的理解,Letter对象中c属性 他的访问修饰符为默认,在同包类,那么我们可以在这个类访问到这个属性,而f方法是将参数y的c值 变成z
	 * 但是实际上传递过来的是参数的引用,从而导致我们new出来的x对象中的c属性的值变成z
	 * 显然PassObject中的f()方法可以直接修改Letter的属性,这么做,会导致对象的属性容易混乱,显然我们在设计程序中不想出现这样的结果
	 * static修饰的方法中只能操作这个类中的static属性或者其他static方法
	 */
	public static void main(String[] args) {
		// a=3; 这样写是错误的
		Letter x = new Letter();
		x.c = 'a';
		System.out.println(x.c);
		f(x);
		System.out.println(x.c);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值