有三个类,Untitled1,Untitled2,Untitled3,依次继承。代码如下。
package c05;class Untitled1 {
static {
System.out.println("one's static block");
} Untitled1() {
System.out.println("one's constructor");
} int i = aa();
int aa() {
System.out.println("one's aa()");
return 1;
}
}
--------------------------
package c05;public class Untitled2
extends Untitled1 { static {
System.out.println("two's static block");
} Untitled2() {
System.out.println("two's constructor");
} int i = aa();
int aa() {
System.out.println("two's aa()");
return 2;
} public static void main(String[] args) {
new Untitled1();
System.out.println("*******");
new Untitled2();
System.out.println("*******");
new Untitled3();
System.out.println("*******");
System.out.println("");
}}
-----------------------------
package c05;public class Untitled3
extends Untitled2 {
static {
System.out.println("three's static block");
} Untitled3() {
System.out.println("three's constructor");
} int i = aa();
int aa() {
System.out.println("three's aa()");
return 3;
} public static void main(String[] args) {
new Untitled1();
System.out.println("*******");
new Untitled2();
System.out.println("*******");
new Untitled3();
System.out.println("*******");
System.out.println("");
}
}
-------------------------
Untitled3的运行结果如下:
one's static blocktwo's static blockthree's static blockone's aa()one's constructor*******two's aa()one's constructortwo's aa()two's constructor*******three's aa()one's constructorthree's aa()two's constructorthree's aa()three's constructor*******
--------------------------
问题:在new Untitled2()时,为什么不是
one's aa()one's constructortwo's aa()two's constructor
在new Untitled3() 时,为什么不是
three's aa()one's constructorthree's aa()two's constructorthree's aa()three's constructor
package c05;class Untitled1 {
static {
System.out.println("one's static block");
} Untitled1() {
System.out.println("one's constructor");
} int i = aa();
int aa() {
System.out.println("one's aa()");
return 1;
}
}
--------------------------
package c05;public class Untitled2
extends Untitled1 { static {
System.out.println("two's static block");
} Untitled2() {
System.out.println("two's constructor");
} int i = aa();
int aa() {
System.out.println("two's aa()");
return 2;
} public static void main(String[] args) {
new Untitled1();
System.out.println("*******");
new Untitled2();
System.out.println("*******");
new Untitled3();
System.out.println("*******");
System.out.println("");
}}
-----------------------------
package c05;public class Untitled3
extends Untitled2 {
static {
System.out.println("three's static block");
} Untitled3() {
System.out.println("three's constructor");
} int i = aa();
int aa() {
System.out.println("three's aa()");
return 3;
} public static void main(String[] args) {
new Untitled1();
System.out.println("*******");
new Untitled2();
System.out.println("*******");
new Untitled3();
System.out.println("*******");
System.out.println("");
}
}
-------------------------
Untitled3的运行结果如下:
one's static blocktwo's static blockthree's static blockone's aa()one's constructor*******two's aa()one's constructortwo's aa()two's constructor*******three's aa()one's constructorthree's aa()two's constructorthree's aa()three's constructor*******
--------------------------
问题:在new Untitled2()时,为什么不是
one's aa()one's constructortwo's aa()two's constructor
在new Untitled3() 时,为什么不是
three's aa()one's constructorthree's aa()two's constructorthree's aa()three's constructor
但是在Untitle2.main()方法执行时候,首先载入Untitled1.class,Untitled1.class
后开始执行new Untitled1()时,此刻Untitled1.aa()方法已经被Untitled2.aa() override,但执行的结果为什么是
one's aa()one's constructor 而不是 two's aa()one's constructor我知道这种理解错了,但是却不知道怎么转过这个弯,希望大侠指正。
//这里到下一句输出都是创建了一个Untitled1对象的,但是父类却调用了子类
//Untitled2的int aa()方法,所以输出是two's aa()不是one's aa()
one's constructor///这里当然是调用父类的构造器啦!!two's aa() ///呵呵,这个输出是你想到的,但是要创建完父类对象,之后才创建子类的对象two's constructor*******three's aa()one's constructorthree's aa()two's constructorthree's aa()three's constructor//这里一个new Untitled3()竟然输出这么多,也是因为创建3需要创建2
//的对象,同理创建2的对象需要1的对象。只是你奇怪的是为什么他们都是调用了 Untitled3 的aa()方法,而不是各自的aa方法。确实这是奇怪的,所以你编程时应该小心注意这个。《java编程思想》中有提到这个问题,但是也不是很详细,你可以看看。*******
感谢 yqj2065(严千钧)
接帖,希望日后再多多指点。