代码如下:
public class A
{
   public void run()
   {
       System.out.println("Run");
    }    //给问题2用的方法
   public void sleep()
   {
         System.out.println("Father Sleep.");
    }
}public class B extends A
{
   public void sleep()
   {
       System.out.println("Sleep");
    }
}public class Test
{
   public static void main(String[] args)
   {
       A aob = new B();       问题1:
       aob.sleep()提示没有sleep这个方法       问题2:按问题1的逻辑,输出应是Father Sleep,但是结果却是Sleep而不是Father Sleep.
       aob.sleep();
    }
}
还请高手不吝赐教,见笑了。

解决方案 »

  1.   

    这个涉及java的对象继承和类方法覆盖问题 public static void main(String[] args) {
      A aob = new A();
      aob.sleep();
      System.out.print(aob.getClass().toString());
      
      A aoc = new B();
      aoc.sleep();
      System.out.print(aoc.getClass().toString());
      
    }把类名打印出来,就能看到究竟哪个类被实例化了。java实际上内部做了类型转换
      

  2.   

    给A和B分别加上构造函数,就能看的更清楚了public class A {
      public void run()
      {
      System.out.println("Run");
      }   //给问题2用的方法
      public void sleep()
      {
      System.out.println("Father Sleep.");
      }
      
      public A(){
      
      System.out.println("I am A");
      }
    }public class B extends A {   public void sleep()
      {
      System.out.println("Sleep");
      }
      
      public B(){
      System.out.println("I am B");
      }}
      

  3.   

    仍有一个小问题,如何A类中没有sleep这个方法,A aob = new B(); aob为什么不能调用B类的sleep方法。
      

  4.   

    强制类型转换一下就可以调用了((B) aob).sleep();
      

  5.   

    强制我知道可以,我就是想知道, aob既然指向了堆中新建的B类实例,为何调用不到B类中的sleep方法。只能调用到B类中包含的A类的方法。
      

  6.   

    这里有实际类型和声明类型的区别
    虽然aob的实际类型是B,但因为aob的声明类型是A,所以只能调用A中的方法。
      

  7.   

    跟我的问题一样,不过我已经知道了
    A a=new B();
    A是父类 B是子类 父类里边就没有子类的方法么,怎么调用