在学习《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);
}
}