面试系列(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 多态

    多态的好处:减少代码的耦合(例如在接口的实现中,分离做什么和怎么做)提高代码可维护性(父类引用指向子类对象,子类可...

  • Java笔记

    Java基础 Java面试通关要点 1.面向对象的特征 封装 继承 多态 封装继承多态 2.final,final...

  • 面经一

    目的: 总结下面试时遇到的问题,并附上自己的答案. 1 Java基础 1.1 Java的继承,多态。 以及多态...

  • 重识Java多态

    今天面试被问到了Java多态的知识点 面试官: 了解多态吗,说一说你对多态的理解我:balabala..面试官:知...

  • 面试题总结

    Android && Java面试题 1. 面向对象思想。 2. java的三大特性。 封装、继承、多态。 3. ...

  • 【2】进大厂必须掌握的面试题-Java面试-面向对象

    Java面试问题-面向对象 Q1。什么是多态? 多态被简要描述为“一个接口,许多实现”。多态性是能够在不同上下文中...

  • java多态面试题

    java多态性 多态分两种: (1) 编译时多态(设计时多态):方法重载。 (2) 运行时多态:JAVA运...

  • java多态面试题

    java多态性 多态分两种: (1) 编译时多态(设计时多态):方法重载。 (2) 运行时多态:JAVA运行时...

  • Java面试系列1

    1.静态变量和实例变量的区别? 静态变量也称作类变量,由static修饰,如:static int s; s就是静...

  • Java 多态

    1、Java 多态分类 1)编译时多态:方法重载。2)运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决...

网友评论

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

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