面试系列(1) Java 多态

作者: kevenZheng | 来源:发表于2019-01-03 17:47 被阅读16次

    多态的好处:
    减少代码的耦合(例如在接口的实现中,分离做什么和怎么做)
    提高代码可维护性(父类引用指向子类对象,子类可随意扩展)
    增强父类功能(子类重写父类方法)

    面向对象三大特性:封装、继承、多态

    多态存在的条件:要有继承、要有重写、父类引用指向子类对象

    实现多态的技术称为:动态绑定,是指在程序运行期间,根据引用对象的实际类型,决定调用相应的方法

    在编译阶段就已经能够确定调用哪个方法的方式,我们称之为静态绑定

    除了被 static 修饰的静态方法,被 private 修饰的私有方法和被 final 修饰的不可被子类重写的方法 都会被编译成 invokestatic 指令,另外所有类的初始化方法 <init> <clinit> 也会被编译成 invokestatic 方法。JVM 会通过静态绑定的方式,顺序执行这些方法。

    此处引用多态的一个例子:

    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");
        }
    }
    class C extends B{
    }
    class D extends
    B{
    }
    public class Test1 {
        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 a1 = new A(); 分析,这是创建了一个普通的对象,所以 a1 可以调用方法 1 和 2,至于具体调用哪个方法,这个在编译器就已经决定了,就是上文所述的静态绑定机制。
    所以 1、2、3 的输出分别是
    A and A
    A and A
    A and D

    2、 A a2 = new B(); 则涉及到了多态,B 是向上转型,父类引用指向子类对象,这样可以增加灵活性和可扩展性(但有个缺点:向上转型不能调用子类中有而父类中没有的方法),方法四 对于方法二是重写,所以 a2 可以调用方法一和方法四。
    所以 4、5、6 输出为
    4--B and A
    5--B and A
    6--A and D

    3、B b = new B(); b 为正常的对象创建,B 继承自 A ,所以 b 可以调用方法一、三、四,所以 7、8、9 的输出为
    7--B and B
    8--B and B
    9--A and D

    相关文章

      网友评论

        本文标题:面试系列(1) Java 多态

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