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我的疑惑在于,强制转换后的对象调用的方法是子类的,而调用的属性为什么却是父类的

解决方案 »

  1.   

    父类中非private的属性或方法是会被子类继承的。
      

  2.   

    个人理解是,
    反过来想,b是TEST_B的引用变量,调用的是TEST_B的属性.
    而b.play()输出C是多态的理解.
    不知道对不对,请指教
      

  3.   

    我也不知道,不过最好不要把字段设成public,正规的java程序只会出现object.method()
      

  4.   

    看看马士兵的java讲解,你就会明白了.
      

  5.   


    System.out.println(((Test_C)b).i);结果为  6;
    也许是我基础太差不是很理解,希望别人能解答
      

  6.   

    其实这个最主要的考点还是 构造函数new 一个对象的时候,首先会call父类的构造函数,一层层网上,直至java.lang.Object,然后返回
    所以,会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就会被覆盖掉!