Java 高频面试题——多态性

117 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

谈谈你对多态性的理解

  • 就是一种事务的多种形态。
  • 什么是多态性?就是在创建对象的时候,左边声明的是一个变量,右边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 1return new Cat();
          defaultreturn 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)实现的。