下面的程序是自己为了搞清继承时方法调用写的,可是运行结果和我想的不一样
问题1  为什么a.run()运行调用B类的run()方法?
问题2  既然a调用B类的方法,为什么a.go()会发生编译错误public class Myinherit 
{
     public static void main(String args[])
       {
          A a = new A();
 B b = new B();
 a = b;
 a.run();
 //a.go();

 //b.go();
        }
}
//
class A
  {
void run()
{
System.out.print("this is A\n");
}   }//class B extends A{
void run()
         {
System.out.print("this is B\n");
}
void go(){
System.out.print("this is b.go\n");
}
}

解决方案 »

  1.   

    B类重写了A类的run方法,
    go是B的方法,A当然不能调用
      

  2.   

    B类重写了A类的run方法,
    那为什么a不调用A的run()方法呢?
      

  3.   

    这就是JAVA的特性啊.Object o  = new Integer(10);
    System.out.println(o.toString());Object类里也要toString方法,但是它就是调用具体的类的访问.方法覆盖,
      

  4.   

    楼上几个说的对的 JAVA的特性。。其实蛮好玩的
      

  5.   

    楼主的这个问题问得真好啊,我也去试了下,开始也很困惑,最后查了点资料,终于明白了。
    A a = new A();
    B b = new B();
    a = b;
    相当于这一句 A a= new B();
    其实就是基类引用指向子类对象。
    既然B是A的子类,那么当你new B()时会先调用A类的构造函数再调用B的构造函数,相当于new一个B的时候在B的内部new了一个A,B重写run方法其实就是修改了自己里面的A。
    基类引用指向子类对象时,即 A a= new B();这个a只能访问B里面的那个A,不能访问其它的属性或方法。
    其实就是将类B当成类A来用。
    例如可以把狗当成动物来用。
      

  6.   

    “既然B是A的子类,那么当你new B()时会先调用A类的构造函数再调用B的构造函数,相当于new一个B的时候在B的内部new了一个A,B重写run方法其实就是修改了自己里面的A。”谢谢诶,你讲的很好,可是,我也知道创建B类的时候先调用A的构造函数,只是run()又不在构造函数里面
      

  7.   

    第一个叫做动态编译,即可以父类引用一个子类变量的时候,调用子类重写了的父类函数。
    第二个因为父类没有go函数,则父类引用子类对象时,子类对象向上转型,go函数已经丢了 相当于
      

  8.   

    编译时通过了A a;运行时JVM发现它确实是一个B类的对象,所以只能执行子类里面在父类相对应的方法,内容是子类里面定义的内容。