设有2个类:Fruit和Apple,其中Apple是Fruit的子类。现遇到这样一个问题,百思不得其解,望高手指点:
class Fruit{
   int i=1111;
   void outMessage() {
       ...
       System.out.println("where is Fruit!");
   }
}
class Apple extends Fruit {
   int i=2222;
   void outMessage() {
       ...
       System.out.println("where is Apple!");
   }
}
class ....{
   .......
   Apple redApple=new Apple();
   Fruit aFruit=redApple;
   System.out.println("aFruit's content have:"+aFruit.i+aFruit.outMessage());
}
结果是aFruit.i输出的是父类中的i值,而aFruit.outMessage()输出的是子类中的值。真是见鬼了!

解决方案 »

  1.   

    首先,这不是重载,而是覆盖。Apple redApple=new Apple();这句话就说明父类的outMessage()方法已经被覆盖了。所以打出来的是子类的值。Fruit aFruit=redApple;这句话是向上转型。aFruit.i这句话的意思是访问Fruit类的对象aFruit的成员变量i,所以打出来的是1111,而Apple的成员变量i并非是Fruit的成员变量。
      

  2.   

    void outMessage(String message)才是重载
      

  3.   

    自己和自己找麻烦!
    输出没错,
    因为Fruit aFruit=redApple;(aFruit是基类类型)
    所以aFruit.i=1111;
    对于aFruit.outMessage();java中默认为动态联编,所以调用子类的函数outMessage()