package cn.lxh;public class Test_B {
public int i = 5;
public Test_B(){
System.out.println("Test_B");
}
public void play(){
System.out.println("this is Test_B");
}
}package cn.lxh;public class Test_C extends Test_B {
public int i = 6;
public Test_C(){
System.out.println("Test_C");
}
public void play(){
System.out.println("this is Test_C");
}
}package cn.lxh;public class Test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub Test_B b =new Test_C();
b.play();
System.out.println(b.i);
}
}答案是:
Test_B
Test_C
this is Test_C
5我的疑惑在于,强制转换后的对象调用的方法是子类的,而调用的属性为什么却是父类的
public int i = 5;
public Test_B(){
System.out.println("Test_B");
}
public void play(){
System.out.println("this is Test_B");
}
}package cn.lxh;public class Test_C extends Test_B {
public int i = 6;
public Test_C(){
System.out.println("Test_C");
}
public void play(){
System.out.println("this is Test_C");
}
}package cn.lxh;public class Test { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub Test_B b =new Test_C();
b.play();
System.out.println(b.i);
}
}答案是:
Test_B
Test_C
this is Test_C
5我的疑惑在于,强制转换后的对象调用的方法是子类的,而调用的属性为什么却是父类的
反过来想,b是TEST_B的引用变量,调用的是TEST_B的属性.
而b.play()输出C是多态的理解.
不知道对不对,请指教
System.out.println(((Test_C)b).i);结果为 6;
也许是我基础太差不是很理解,希望别人能解答
所以,会show:
Test_B
Test_C Test_B b = new Test_C();
这个事实上 是一个 安全向下转型的机制
所以 Object reference b是指向Test_C的
所以会show
this is Test_C最后的b.i ,其主要原因当然是因为 i是public
所以被继承下来,所以子类的i就会被覆盖掉!