当前位置: 技术问答>java相关
急问题:一个关于类继承的概念问题,它的执行顺序百思不得其解
来源: 互联网 发布时间:2015-03-05
本文导语: 下面的程序中类B继承了类A,它们分别有自己的构造函数,执行后的结果想不明白(已列在程序下面),请教高手其中的道理和程序执行的顺序,谢谢。 class A { public int Avar; public A() { System.err.println("AAA...
下面的程序中类B继承了类A,它们分别有自己的构造函数,执行后的结果想不明白(已列在程序下面),请教高手其中的道理和程序执行的顺序,谢谢。
class A {
public int Avar;
public A() {
System.err.println("AAA");
doSomething();
}
public void doSomething() {
Avar = 1111;
System.err.println("A.doSomething()");
}
}
public class B extends A {
public int Bvar = 2222;
public B() {
System.err.println("BBB");
doSomething();
System.err.println("Avar="+Avar);
}
public void doSomething() {
System.err.println("Bvar="+Bvar);
}
public static void main(String[] args) {
new B();
}
}
结果:
AAA
Bvar=0
BBB
Bvar=2222
Avar=0
class A {
public int Avar;
public A() {
System.err.println("AAA");
doSomething();
}
public void doSomething() {
Avar = 1111;
System.err.println("A.doSomething()");
}
}
public class B extends A {
public int Bvar = 2222;
public B() {
System.err.println("BBB");
doSomething();
System.err.println("Avar="+Avar);
}
public void doSomething() {
System.err.println("Bvar="+Bvar);
}
public static void main(String[] args) {
new B();
}
}
结果:
AAA
Bvar=0
BBB
Bvar=2222
Avar=0
|
1.在类加载的时候会执行静态程序块(这里没有)
2。new B()的时候先执行父类的构造函数 A(), 所以:AAA
3。B中的doSomething()覆盖了父类方法,因而在A()中的doSomething()调用的是B()中的方法,取的变量还是A的,缺省值 = 0
4。执行B(),剩下的明白了吧!A.doSomething()一直没有运行
2。new B()的时候先执行父类的构造函数 A(), 所以:AAA
3。B中的doSomething()覆盖了父类方法,因而在A()中的doSomething()调用的是B()中的方法,取的变量还是A的,缺省值 = 0
4。执行B(),剩下的明白了吧!A.doSomething()一直没有运行
|
请仔细研读
if you call "new Class()":
First, the memory for the complete object is allocated and the default
values for the instance variables are assigned(0 or null).
Second, the top-level constructor is called and follows these steps
recursively down the inheritance tree:
1. Bind constructor parameters
2. If explicit this(), call recursively and then skip to step 5
3. Call recursively the implicit or explicit super(...), except for
Object because Object has no parent class
4. Execute explicit instance variable initializers
5. Execute body of current constructor
if you call "new Class()":
First, the memory for the complete object is allocated and the default
values for the instance variables are assigned(0 or null).
Second, the top-level constructor is called and follows these steps
recursively down the inheritance tree:
1. Bind constructor parameters
2. If explicit this(), call recursively and then skip to step 5
3. Call recursively the implicit or explicit super(...), except for
Object because Object has no parent class
4. Execute explicit instance variable initializers
5. Execute body of current constructor
|
问过好多次了
文档中心有类似文章
文档中心有类似文章