美文网首页
Java多态

Java多态

作者: 面包石头 | 来源:发表于2017-09-14 15:34 被阅读10次

    1.基于继承

    • 覆盖
      子类覆盖父类的方法,实现多态
    • 抽象
      子类实现父类的抽象方法,实现多态
      abstract 不能与private、static、final或native并列修饰同一个方法

    2.基于接口

    接口里面所有的变量都是public static final
    所有方法都是public abstract,public abstract可以省略
    不能有非abstract方法和非public变量,否则会报错,

    3.案例

    摘自http://www.cnblogs.com/chenssy/p/3372798.html

    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
    

    我来理解下4、5和9:

    • a2.show(b)
      A a2 = new B();a2.show(b);
      调用的是a2的方法,因为a2向上转型为A,那么show只能调用类A的方法,A里有参数为A和D两种,所以a2.show(b)对应于A.show(B)对应于A.show(A),由于多态性,最终调用的是B.show(A)即B and A。

    • a2.show(c)
      A a2 = new B();a2.show(c);
      调用的是a2的方法,因为a2向上转型为A,那么show只能调用类A的方法,A里参数有A和D两种,所以a2.show(b)对应于A.show(C)对应于A.show(B)对应于A.show(A),由于多态性,最终调用的是B.show(A)即B and A.

    • b.show(d)
      B b = new B();D d = new D();b.show(d);
      由于B是A的子类,那么B可以继承A的所有非private方法,当然A的show(D)也在内,所以,就直接调用的是A.show(D)即A and D.

    相关文章

      网友评论

          本文标题:Java多态

          本文链接:https://www.haomeiwen.com/subject/udrdsxtx.html