前几天看到的贴子,当时以为自己会了,现在又具体分析总得自己没有理解,找了半天原贴没有找到,只好再把它贴出来,有劳高手了.package b;abstract class A {
public A() {
this.print();
} public abstract void print();
// byte a[][];//byte [][]a书写都可以}class B extends A {
private int i = 10; public B(int i) {
this.i = i;
} public void print() {
System.out.println(this.i);
}
};public class Demo {
public static void main(String artgs[]) {
new B(100);
}
}不能理解此程序的执行结果,当时还以为是class B 中private倒的鬼,后来把它去掉程序仍然运行为0

解决方案 »

  1.   

    1、创建对象B,给对象B分配内存空间,并将所有实例变量初始化为默认值(这里类B中的实例变量i的默认值为0)。
    2、抽象类A的构造器。
    3、由抽象类A的构造器调用类B的print()方法,此时i还是默认值为0,所以打印0。
    4、初始化类B中的实例变量i,i=10。
    5、调用类B的构造器,实例变量i的值为100。
      

  2.   

    类的实例化过程。
    new B的时候先调用父类的构造函数。
    父类的构造函数调用B类的printf方法。
    打印i,然而i这是还没有被赋值(在父类构造函数执行完后才被赋值),
    所以就打印出了0。
      

  3.   

    这个确实 一个不小心 就会搞错了
    尤其是公司的笔试题 类似的特别多
    楼主可以用debug一步步调试 看一看怎么走的啊 
      

  4.   

    关键是要搞清楚构造方法的执行:1. 调用父类构造方法.
    2. 初始化静态变量(如果是第一次引用该类).
    3. 初始化成员变量.
    4. 执行构造方法的正文代码.这是一个递归的过程,因此对于步骤1,也是要执行这些步骤的.当明白了这样一个执行顺序,就不难理解为什么有这个执行结果.另: 一般来说要避免写这样的代码,因为在变量未被全部初始化(类对象没有完整构造好)之前去调用对象的方法是很危险的动作,违反了java的编程原则.
      

  5.   

    这个只打印10吧貌似先调用a的构造函数public a{this.print();}a作为父类  调用b中的print()此时i是10 所以打印10   之后在调用a的构造函数 对i赋值为100 但是print()不会自动打印  所以只打印10