概述
结论
1、创建子类后的调用顺序
- 父类静态代码块(注意静态代码块只有首次创建才会执行,之后创建均不执行)
- 子类静态代码块
- 父类非静态代码块
- 父类构造方法
- 子类非静态代码块
- 子类构造方法
2、构造器调用顺序
- 基类递归调用
- 成员构造器按声明顺序调用
- 该类构造器
3、多态
this.method(o) > super.method(o) > this.method((super)o) >
super.method((super)o)
注意:如果某个方法是静态的,那么这个方法就不具有多态性。
案例
public class LambdaDemo {
public static void main(String args[]) {
A a = new B();
a.fun();
System.out.println("---------分割线----------");
A c = new C();
c.fun();
c.fun(a);
}
}
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)"); }
}
运行结果:
A static
B static
A Non-static
A Construct
B Non-static
B Construct
B Fun
---------分割线----------
C static
A Non-static
A Construct
B Non-static
B Construct
C Non-static
C Construct
B Fun
B 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
最后
以上就是兴奋芝麻为你收集整理的Java子类继承父类调用顺序的全部内容,希望文章能够帮你解决Java子类继承父类调用顺序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复