日期:2014-05-18  浏览次数:20645 次

为什么是这个结果

public class Test {
public static void main(String[] args) {
T t = new T3();
T1 t1 = new T3();
T2 t2 = new T3();
T3 t3 = new T3();
System.out.println(t.a);
System.out.println(t1.a);
System.out.println(t2.a);
System.out.println(t3.a);
System.out.println(((T) t).a);
System.out.println(((T1) t).a);
System.out.println(((T2) t).a);
System.out.println(((T3) t).a);
}
}
class T {
int a = 0;
}
class T1 extends T {
int a = 1;
}
class T2 extends T1 {
int a = 2;
}
class T3 extends T2 {
int a = 3;
}

为什么会输出这个结果呢?有没有人深究过?

------解决方案--------------------
其实Java继承中,成员变量(包括静态变量,实例变量,常量)没有覆盖(override)一说,应该叫隐藏(hidden)。override只针对方法来说的。
------解决方案--------------------
楼上说的是正确的。
楼主可以为T T1 T2 T3加上toString()方法。然后打印的时候,把t.a改为t.toString(),((T)t).a改为((T)t).toString(),以此类推。最后可以看到用toString()打印出来的值总是为3,因为toString被override了,所以调用toString()的时候,toString()里,a的值总是"new"后面那个类型(这里总是T3)里的值。
------解决方案--------------------
引用:
也就是说override只针对方法?


引用:
也就是说override只针对方法?


是的。。。而且只用于父子类之间。
------解决方案--------------------
按里氏替换来说,能用到父类的地方就可以用子类, 调用变量是父类的,调用方法是子类的。

向下转型的时候,只能调用父类有的方法,子类自己的方法不可以用。