前几天看到的贴子,当时以为自己会了,现在又具体分析总得自己没有理解,找了半天原贴没有找到,只好再把它贴出来,有劳高手了.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
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
2、抽象类A的构造器。
3、由抽象类A的构造器调用类B的print()方法,此时i还是默认值为0,所以打印0。
4、初始化类B中的实例变量i,i=10。
5、调用类B的构造器,实例变量i的值为100。
new B的时候先调用父类的构造函数。
父类的构造函数调用B类的printf方法。
打印i,然而i这是还没有被赋值(在父类构造函数执行完后才被赋值),
所以就打印出了0。
尤其是公司的笔试题 类似的特别多
楼主可以用debug一步步调试 看一看怎么走的啊
2. 初始化静态变量(如果是第一次引用该类).
3. 初始化成员变量.
4. 执行构造方法的正文代码.这是一个递归的过程,因此对于步骤1,也是要执行这些步骤的.当明白了这样一个执行顺序,就不难理解为什么有这个执行结果.另: 一般来说要避免写这样的代码,因为在变量未被全部初始化(类对象没有完整构造好)之前去调用对象的方法是很危险的动作,违反了java的编程原则.