Java 高频面试题——多态性
谈谈你对多态性的理解
- 就是一种事务的多种形态。
- 什么是多态性?就是在创建对象的时候,左边声明的是一个变量,右边new的却是子类的对象,这就是多态性。也即:父类的引用指向子类的对象。假设Man是Person的子类:Person p = new Man()
- 多态性的使用:有了对象的多态性以后,调用的是父类中声明的方法,执行的却是子类中重写父类的方法。
- 多态性使用的前提:继承性和方法的重写。
- 多态性使用的好处:使得代码具有了通用性。
多态是编译时行为还是运行时行为?
- 运行时行为
- 代码验证:
import java.util.Random; //创建一个新的随机数生成器。 //证明如下: class Animal { protected void eat() { System.out.println("动物吃食物"); } } class Cat extends Animal { protected void eat() { System.out.println("猫吃鱼"); } } class Dog extends Animal { protected void eat() { System.out.println("狗吃骨头"); } } class Sheep extends Animal { protected void eat() { System.out.println("羊吃草"); } } public class Test { public static Animal getInstance(int key){ //该方法返回的是一个Animal类的实例化的对象 switch(key){ case 0 : return new Dog(); case 1 : return new Cat(); default : return new Sheep(); } } public static void main(String[] args) { int key = new Random().nextInt(3) //返回int随机数,每个值在[0,3)之间。 System.out.println(key); Animal animal = getInstance(key);//调用getInstance()方法返回一个Animal类的对象 animal.eat(); }
编译时的多态性与运行时的多态性有什么区别,他们的实现方法有什么不同?
- 多态从实现的角度可以划为两类:编译时多态和运行时多态。
- 编译时的多态性:就是在程序编译的时候,也就是生成解决方案的时候就决定要实现什么操作。
- 运行时的多态性:就是指直到系统运行时,才根据实际情况决定实现何种操作。
- 多态实现形式不同:编译时的多态是通过静态连编来实现的;运行时的多态是用动态连编来实现的。
- 多态性通过方式不同:编译时的多态性主要是通过函数重载和运算符重载来实现的;运行时的多态性主要是通过虚函数来实现的。
扩展资料:
- 静态多态性又称编译时的多态性。静态多态性的函数调用速度快、效率高但缺乏灵活性,在程序运行前就应决定执行的函数和方法。
- 动态多态性的特点是:不在编译时确定调用的是哪个函数,而是在程序运行过程中才动态地确定操作所针对的对象。又称运行时的多态性。动态多态性是通过虚函数(virtual function)实现的。