class C extends B
{
int i = 1;
C(int i){
this.i = i;
System.out.println("C() 's i is "+i);
}
void run(){
System.out.println("C.run()  i is "+i);
}
public static void main(String[] args) 
{

C c = new C(10);

}
}abstract class B
{
B(){
System.out.println("B() before run()");
run();
System.out.println("B() after run()");
}
 abstract void run();
}大家事先预测一下打印内容,再自己编译运行一下,看看结果是不是一样,测试基本功!

解决方案 »

  1.   

    B() before run()
    C.run()  i is 1
    B() after run()
    C() 's i is 10
      

  2.   

    B() before run()
    C.run() i is 0
    B() after run()
    C() 's i is 10
      

  3.   

    要想得到
    B() before run()
    C.run() i is 1
    B() after run()
    C() 's i is 10
    定义i时用static修饰符
      

  4.   

    C.run() i is 0    @-@...怎么是0 啊...
      

  5.   

    B() before run()
    C.run() i is 0
    B() after run()
    C() 's i is 10
    加固一下
      

  6.   

    用10初始化i并且调用c的构造方法输出
    c()'s i is 10
      

  7.   

    作为B的子类C在对象实例化的时候会隐式的调用父类的构造函数。所以第一行是:
    B() before run()
    此时子类C的对象在内存中分配了地址但没有进赋值,还都是默认的初始值。而且在子类C的构造方法C(int i)中参数i覆盖了之前定义的int i;所以此时输出的i是0.即第二行:
    C.run() i is 0
    顺序执行第三行
    B() after run()
    此时隐式调用完父类的构造函数,继续执行子类自身的构造函数,C(10)给对象的i赋值为10.
    C() 's i is 10
    理解的不好的地方请高手指正!谢谢!