Java 子类继承父类调用顺序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiujiangluck/article/details/86537088

结论

  1. 创建子类后的调用顺序
    • 父类静态代码块(注意静态代码块只有首次创建才会执行,之后创建均不执行)
    • 子类静态代码块
    • 父类非静态代码块
    • 父类构造方法
    • 子类非静态代码块
    • 子类构造方法
  2. 构造器调用顺序
    • 基类递归调用
    • 成员构造器按声明顺序调用
    • 该类构造器
  3. 多态
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

猜你喜欢

转载自blog.csdn.net/jiujiangluck/article/details/86537088