Java的多态

2020-04-26  本文已影响0人  大红豆小薏米
  1. 哪些函数能够调用,取决于reference的类型
  2. 对于被override 的函数,调用哪个版本,取决于object的类型
  3. 如果非要调用reference 没有的类型,可以强制类型转换成object的类型
class A{
    public String show(D obj){
        return "A and D";
    }
    public String show(A obj){
        return "A and A";
    }
}

class B extends A{
    public String show(B obj){
        return "B and B";
    }
    public String show(A obj){
        return "B and A";
    }
    // 继承的一个隐形的函数
    //public String show(D obj){
    //    return "A and D";
    //}
}

class C extends B{}
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));
        // "A and A", 因为reference A可以自动匹配b
        
        System.out.println("2-"+a1.show(c));
        // "A and A", 同理
        
        System.out.println("3-"+a1.show(d));
        // "A and D", 就近匹配
        
        System.out.println("4-"+a2.show(b));
        // "B and A", 因为reference是A,匹配的是public String show(A obj), 但是这个在B里被重写,所以是"B and A"
        
        System.out.println("5-"+a2.show(c));
        // "B and A", 同理
        
        System.out.println("6-"+a2.show(d));
        // "A and D"
        
        System.out.println("7-"+b.show(b));
        // "B and B"
        
        System.out.println("8-"+b.show(c));
        // "B and B"
        
        System.out.println("9-"+b.show(d));
        // "A and D", B里面有三个函数的
    }
}
上一篇下一篇

猜你喜欢

热点阅读