Java 高频面试题——多态性

简介: 就是一种事务的多种形态。什么是多态性?就是在创建对象的时候,左边声明的是一个变量,右边new的却是子类的对象,这就是多态性。也即:父类的引用指向子类的对象。假设Man是Person的子类:Person p = new Man()多态性的使用:有了对象的多态性以后,调用的是父类中声明的方法,执行的却是子类中重写父类的方法。

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)实现的。
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
24天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
63 14
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
22天前
|
Java 程序员 开发者
Java 中的多态性
Java中的多态性是面向对象编程的重要特性之一,允许一个接口或基类引用指向其不同子类的对象,实现“一种接口,多种方法”。通过方法重写和动态绑定,多态性提高了代码的灵活性和可扩展性。
54 3
|
1月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
29天前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
34 6
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
61 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
125 4
|
2月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
122 1
Java面试题之Java集合面试题 50道(带答案)