public class Son extends Father{
  public static final int aaa = 555;
  
  public Son(){
    super();
  }
  public int getAAA(){
    return 666;
  }
public static void main(String[] args) {
  Son son = new Son();
  System.out.println(son.aaa);
  System.out.println(son.getAAA());
  System.out.println(((Father)son).aaa);
  System.out.println(((Father)son).getAAA());
  }
}class Father {
  public static final int aaa = 111;
  public Father() {
    System.out.println(aaa);
    System.out.println(getAAA());
  }
  public int getAAA(){
    return 222;
  }
}
/* 正确答案为:
111
666
555
666
111
666
为什么不是
111
222
555
666
111
222
也就是为什么Father类的getAAA()方法从未被调用过?
*/

解决方案 »

  1.   

    多态的实现,是通过父类或接口对象变量可以引用子类(实现类)的对象实例,
    调用该对象变量的方法,执行的时候它会找到它的引用实例(son)并调用的对应的方法,
    而不是父类的方法
      

  2.   

    从没注意过的问题。
    呵呵
    111
    222//666解释多态。在进一步讲为子类的构造函数是最后被夹在的,也就是先前子类的其他成员已被进行了加载。
    555
    666
    111 //这个地方其实比较麻烦我想了一下我这样子理解的。类名.X()==引用.X效果是一样的。在强制转换后,就理解成父类名字.X打印的结果所以是111.
    222//还是多态。你可以是这样子想以下Father f=new Son();f.getAAA()会掉哪个我想你清楚了吧。 
      

  3.   

    夹在==加载:也就是类的初始化。classLoad
      

  4.   

    111
    666
    //这两个数由Father得构造函数给出
      public Father() {
        System.out.println(aaa);
        System.out.println(getAAA());
      }
    其中System.out.println(aaa)是打印出Father的aaa,因为域访问不存在多态
    而System.out.println(getAAA())的getAAA()调用的是son的getAAA(),多态,在构造函数中同样存在555
    666
    这两个好理解
    System.out.println(son.aaa);
    System.out.println(son.getAAA());
    打印的就是Son的aaa和getAAA()返回值111
    666
    这两个数其实跟最开始两个的道理一样
    System.out.println(((Father)son).aaa) 由于upcast为Father,访问的域是Father的,不存在多态
    System.out.println(((Father)son).getAAA()) 即使upcast了,多态仍然存在,调用的仍然是son.getAAA()
      

  5.   

    调用Father的getAAA(),请(new Father()).getAAA();