What will happen when you attempt to compile and run the following code?
class Base{
int i = 99;
public void amethod(){
        System.out.println("Base.amethod()");
}
Base() {
amethod();
}
} class Derived extends Base{
int i = -1; public static void main(String argv[]){
Base b = new Derived();
         System.out.println(b.i);
b.amethod();
} public void amethod(){
                  System.out.println(i);
System.out.println("Derived.amethod()");
         }
}运行结果:
0
Derived.amethod()
99
-1
Derived.amethod()我的问题:
1.Base()调用Derived里重载后的amothod方法,怎么回事?
2.”构造器是静态绑定的“是什么意思?

解决方案 »

  1.   

    java的继承体系中,方法都是后期绑定(动态绑定),就是说,你new了什么对象,就会调用这个对象的方法,而不是父类的方法,所以Base b = new Derived();后,b.amethod()会唤起Derived的amethod。
    但构造函数是不可继承的,他是前期(静态)绑定,也就是说,你Base b = new Derived();这句话,如果Derived没有显式声明一个无参构造器,那么它的父类的构造器就被调用。这里也就是调用Base()。而在Base()里,又调用amethod(),这次是Derived的了(后期绑定)。
    这个题还有个陷阱是那个0,这涉及到类的初始化问题,int i = -1;这个赋值是发生在构造函数调用之后进行的,在这之前,它被置为0,所以这里会打印出一个0。具体可看think in java 2nd(侯捷译)217页,或原英文版305页。
      

  2.   

    还有一点要澄清,虽然构造函数不可继承,但是子类的默认构造函数(如果你没有显式地写一个的话)会调用父类的构造函数。也就是说,上面的Derived相当于有一个构造器如下:
    Dirived(){
        super();
    }
      

  3.   

    Base b = new Derived();
    ----------------------------
    会产生什么样结果?先产生一个Derived对象,然后复制给b reference(仅仅是个reference).当我们产生Derived对象时,会先初始化i,然后调用构造函数,调用构造函数的时候,因为它时继承自Base的时候,所以会调用Base的构造函数,有了Base()的运行,运行amethod()方法,关键就在这里,不管怎么说,b ref里面总归是Derived的对象,就是后期绑定,鉴于面向对象就是发送消息给对象的原则,它肯定知道调用Dervied的amethod()方法的.所以输出了:
    0
    Derived.amethod()
    -------------------------------------------
      

  4.   

    1.Base()调用Derived里重载后的amothod方法,怎么回事?
    2.”构造器是静态绑定的“是什么意思?
    ===================================典型的考察你的继承"上溯造型"知识
    1.这里最终调用的是Derivde.amethod();
    2.所谓静态绑定就是程序运行前初始化,动态就是程序运行中初始化(又称后期绑定);
    这些基本的东西在Thinking in Java 里都有的,好象在第六/七章中,建议楼主阅读!