结论
- 创建子类后的调用顺序
- 父类静态代码块(注意静态代码块只有首次创建才会执行,之后创建均不执行)
- 子类静态代码块
- 父类非静态代码块
- 父类构造方法
- 子类非静态代码块
- 子类构造方法
- 构造器调用顺序
- 基类递归调用
- 成员构造器按声明顺序调用
- 该类构造器
- 多态
this.method(o) > super.method(o) > this.method((super)o) > super.method((super)o)
注意:如果某个方法是静态的,那么这个方法就不具有多态性。
案例
class A {
static{
System.out.println("A static");
}
{
System.out.println("A Non-static");
}
A(){ System.out.println("A Construct");}
public void fun(){ System.out.println("A Fun"); }
public void fun(A a){ System.out.println("A Fun(a)"); }
}
class B extends A{
static{
System.out.println("B static");
}
{
System.out.println("B Non-static");
}
B(){ System.out.println("B Construct");};
public void fun(){System.out.println("B Fun");}
public void fun(A a){ System.out.println("B Fun(a)"); }
}
class C extends B{
static{
System.out.println("C static");
}
{
System.out.println("C Non-static");
}
C(){ System.out.println("C Construct");};
//public void fun(){System.out.println("C Fun");}
//public void fun(A a){ System.out.println("C Fun(a)"); }
}
public class OrderOfClassInvoking {
public static void main(String args[]) {
A a = new B();
a.fun();
System.out.println("---------Cut Line----------");
A c = new C();
c.fun();
c.fun(a);
}
}
运行结果:
解释:
c.fun(a)
这里this
代表A
,因此到A类中寻找fun(A a)
, 同时由于B类覆盖了A类的fun(A a)
,因此输出B Fun(a)
。
练习
public class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
public class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
public class C extends B{
}
public class D extends B{
}
public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println("1--" + a1.show(b));
System.out.println("2--" + a1.show(c));
System.out.println("3--" + a1.show(d));
System.out.println("4--" + a2.show(b));
System.out.println("5--" + a2.show(c));
System.out.println("6--" + a2.show(d));
System.out.println("7--" + b.show(b));
System.out.println("8--" + b.show(c));
System.out.println("9--" + b.show(d));
}
}
输出:
1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D