class A {
public int Avar;
public A() {
System.out.println("AAA");
doSomething();
}
public void doSomething() {
Avar = 1111;
System.out.println("A.doSomething()");
}
}
public class B extends A {
public int Bvar = 2222;
public B() {
System.out.println("BBB");
doSomething();
System.out.println("Avar=" + Avar);
}
public void doSomething() {
System.out.println("Bvar=" + Bvar);
}
public static void main(String[] args) {
new B();
}
}
講解: 順序是這樣得,首先生成B就得先生成A(沒有父,哪來子) 所以調用A的構造器,輸出AAA, 然后調用方法dosomething,!!! 注意:A的該方法被B覆蓋, 而你生成的是B的對象, 所以它調用B的方法, 由于BVAR目前沒有給定值, 所以自動初始化為0, 然后生成B對象, 先初始化變量BVAR, 然后調用構造器輸出BBB, 然后調用方法, 這時BVAR已初始化, 所以輸出BVAR=2222, 而對象A中變量AVAR由于沒有調用對象A的方法dosomething, 所以其值為0,則輸出0 全部輸出就如下:
|
?????
|
|
AAA
Bvar=0
BBB
Bvar=2222
Avar=0
注意:初始化順序,當繼承時,先生成超類對象,生成對象時,先生成靜態變量,然后是一般變量,然后調用構造器!當所以超類對象生成后,生成本對象,順序一樣! 當方法被覆蓋時,調用目前對象的方法!這得注意。
下面這個題目你能選對答案嗎?:
What will happen when you attempt to compile and run the following code?
class Base
{
int i = 99;
public void amethod()
{
System.out.println("Base.amethod()");
}
Base()
{
amethod();
}
}
public class Derived extends Base
{
int i = -1;
public static void main(String argv[])
{
Base b = new Derived();
System.out.println(b.i);
b.amethod();
}
public void amethod()
{
System.out.println("Derived.amethod()");
}
}
A. Derived.amethod()
-1
Derived.amethod()
B. Derived.amethod()
99
Derived.amethod()
C. 99
Derived.amethod()
D.
Compile time error