我是靠谱客的博主 兴奋芝麻,最近开发中收集的这篇文章主要介绍Java子类继承父类调用顺序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

结论

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子类继承父类调用顺序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部