public class TestA {
TestA(){
System.out.println("P");
init();
}

void init() {
System.out.println("Q");
}

public static void main(String[] args) {
new TestB();
}
}class TestB extends TestA {
int i = 1;

TestB() {
super();
System.out.println(i + " ");
}

void init() {
i = 2;
}
}
写出执行结果

解决方案 »

  1.   

    我以为是 
    P
    Q
    1答案竟然是
    P
    1
    为什么没打印Q呢!
      

  2.   

    原来是Override了!
    i = 2;是赋值了,但是没有真是赋予TestB的i!
    谁来解析下!
      

  3.   

    1.方法的overwrite
    2.属性变量的初始化时序
    init方法被TestB的重写了 B调用的是自己的init方法
    在打印i时才初始化i=1 所以打印i 而不是2
      

  4.   

    TestB重写了TestA的init()方法 
    debug跟踪了一下执行了TestB 类中的init()方法
    继承陷阱真多
      

  5.   

    你debug一下,看看执行顺序就知道了执行顺序:new TestB();——〉super();-〉System.out.println("P");-〉init();-〉i = 2;-〉int i = 1; -〉System.out.println(i + " ");  
      

  6.   

    p
    11.执行 TestA构造函数中的System.out.println("P")
    2.执行TestB中的init()方法,执行的是重写的方法,又因为java中式值传递的,i值不变
    3.执行System.out.println(i + " ");
      

  7.   

    实例子类,即使TestB的构造方法中没有些super()同样要先实例父类构造方法,所以首先打印出“P”,接着调用init()方法,然而init()方法已被重写此时调用的是子类TestB中的init()方法,即我任何信息打出,同时在TestB的init()中给i重新赋值,但对于构造方法中仍然使用的是全局变量的i的默认值,int 赋值只是局部可用,然后是TestB的构造方法及打印出“1”
      

  8.   


    abstract class A1 {   
      int i=1;   
      public void printI() {   
        System.out.println("i="+i);   
      }   
    }   
      
    public class B1  extends A1{   
      int i=2;   
      public static void main(String[] args) {   
        B1 b=new B1();   
        b.printI();   
      }   
    }打印结果...
      

  9.   

    当一个对象被创建时,初始化是以下面的顺序完成的: 1. 设置成员的值为缺省的初始值 (0, false, null)2. 调用对象的构造方法 (但是还没有执行构造方法体)3. 设置父类成员变量4. 调用父类的构造方法5. 执行构造方法体
      

  10.   

    请问楼上,到底i在什么时候才赋给他程序员付给i的值啊
    难道在构造对象时,变量用的都是默认的初始值吗?程序员赋的值在new对象时不会付给变量(声明,这里的变量指的是类的属性,不是方法内的变量)
      

  11.   

    这题,我觉得,把super()去了,才比较有意思~~~
      

  12.   


    9楼正解1. super()注释掉不影响结果。2. i为1并不是因为init()的作用域小。而是因为init()在父类中调用。如果在super()和System.out.println之间加入一句:init(),则结果变成
    P
    2
    不信就试一下。
      

  13.   

    又做了实验:
    在TestB中的init()中的i前加int
    int i = 2;这样在super()和System.out.println之间加入一句:init(),则结果不会变成 


    了,还是
    P
    1
      

  14.   

    TestB 重写了 inti(),不打印任何东西,Q就不显示了。我认为答案是:P 1
      

  15.   

    [b]理解了对象创建的过程就行了!!!!!!在super()调用完成后,i的值的确变成了2,但是千万要记住:在调用完基类的构造方法后,子类才开始对自己的成员变量进行初始化,所以i被重新赋值为1,所以打印出来的自然就是1。[/b]
      

  16.   

    我的第一反应结果应该是 p p 1.
    当看到结果的时候我也有了一个疑问,当然是我学习中的不足之处。Java会自动在导出类构造器中插入对基类构造器的掉用,
    那为什么结果是p 1 呢,而不是 p p 1
      

  17.   

    程序运行时每个class文件都有一个方法表,子类覆盖的话,就要运行子类的。有些人可能会说父类构造子运行时子类还没有new 呢,其实只要你用new 关键字,虚拟机会事先完成好多动作,只不过咱看不到,这里就是,new之前虚拟机已经装载连接了,方法表已经有了。
      

  18.   


    abstract class A1 {
    int i = 1; A1(int i) {
    init(i);
    printI();
    } void init(int i) {
    this.i = i;
    } public void printI() {
    System.out.println("i=" + i);
    }
    }public class B1 extends A1 {
    int i = 2; B1() {
    super(5);
    } public void printI() {
    System.out.println("*i=" + i);
    } public static void main(String[] args) {
    B1 b = new B1(); b.printI();
    }
    }打印结果:
    *i=0
    *i=2