Polymorphism and inheritance order JAVA call

 java中的多态

    有两种多态的机制:编译时多态、运行时多态

      1、方法的重载:重载是指同一类中有多个同名的方法,但这些方法有着不同的参数。,因此在编译时就可以确定到底调用哪个方法,它是一种编译时多态。

      2、方法的覆盖:子类可以覆盖父类的方法,因此同样的方法会在父类中与子类中有着不同的表现形式。在java语言中,基类的引用变量不仅可以指向基类的实例对象,也可以指向子类的实例对象,同样,接口中的引用变量也可以指向其实现类的实例对象。  

JAVA 运行继承重载的方法先后顺序

      1、程序首先保证的是编译不能出错,所以,方法调用以引用类型为准,引用调用方法的优先级:
  this.show(object) > super.show(object) > this.show(super(object))
 
      2、运行阶段的调用规则是,变量和静态方法优先按引用类型来调用,
 其余方法优先按实例类型来调用!
 
public class A {
    public void show(A a){
        System.out.println("A & A");
    }

    public void show(D d){
        System.out.println("A & D");
    }
}
/**
 * @program: 
 * @description:
 * @author: Mr.ZY
 * @create: 2019-07-04 22:54
 * B 继续与A 并且重写A的一个show方法 show(A obj)
 **/
public class B extends A{
    public void show(B obj){
        System.out.println ("B & B");
    }
    //重写父类方法
    public void show(A obj){
        System.out.println ("B & A");
    }


}

 

public class C extends B {
}
public class D extends B{
}

 

Here is the code execution

public class TestMain {

    public static void main(String [] args){
        /**
         * 程序首先保证的是编译不能出错,所以,方法调用以引用类型为准,引用调用方法的优先级:
         * this.show(object) > super.show(object) > this.show(super(object))
         *
         * 运行阶段的调用规则是,变量和静态方法优先按引用类型来调用,
         * 其余方法优先按实例类型来调用!
         */

        A a1 = new A();//实列是A,引用也是A
        A a2 = new B();//实列是B,继承了A ,引用是A
        B b = new B();//实列是B,继承了A,引用是B
        C c = new C();//实列是C,继承了B
        D d = new D();//实列是D,继承了B
        a1.show(b);//a1 b是继承的A, 输出结果为A & A
        a1.show(c);//c是继承的b b又是继承的A, 输出结果为 A & A
        a1.show(d);/** 参照“其余方法优先按实例类型来调用”
                       a1的实列是A,重载方法有第一继承人,所以这里输出的是 A & D
                        */
        a2.show(b);/**实列是B 这里一般会认为调用的是B & B 其实是错误的,
                      因为这里this.show(object) > super.show(object) > this.show(super(object))
                      的顺序,最后调用的this.show(super(object)).所以这里是
                      this.show(A a). 因为B是继承于A  所以显示 B & A
                    */
        a2.show(c); //实列是B, c继承B,B又继承A,原理同上. 所以输出的是 B & A
        a2.show(d); /** 实列是B, A的引用,那么会先查找实列B中是否有 show(D d)的实现
                        当B类中的实现没有,则会从A类中找,刚好A类中有这个方法的实现,
                        所以这里输出的是: A & D
                    */
    }
}

 

Released six original articles · won praise 0 · views 10000 +

Guess you like

Origin blog.csdn.net/zhang199563/article/details/94768922
Recommended