Java必须掌握的多态中调用成员的特点-(含面试大厂题含源码)

本文主要是介绍Java必须掌握的多态中调用成员的特点-(含面试大厂题含源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Java中,多态是面向对象编程的核心概念之一,它允许对象采取多种形式。多态的实现主要依靠继承和接口。在面向对象的设计中,多态性允许一个接口使用不同的实例,提高了代码的可重用性和可扩展性。

针对大厂面试题,我们可以设计一个关于Java多态中成员(特别是方法)调用的特点的问题。这个问题不仅考察了应聘者对多态概念的理解,还考察了对Java中方法重载和重写规则的掌握。

面试题

考虑以下Java代码:

class Animal {public void eat() {System.out.println("Animal is eating");}
}class Dog extends Animal {@Overridepublic void eat() {System.out.println("Dog is eating");}public void bark() {System.out.println("Dog is barking");}
}public class TestPolymorphism {public static void main(String[] args) {Animal myAnimal = new Dog();myAnimal.eat();// myAnimal.bark(); // 行A}
}
  1. 当执行myAnimal.eat();时,输出结果是什么?为什么?
  2. 如果取消注释行A (// myAnimal.bark();),会发生什么?解释为什么会这样。
  3. 如何能够使myAnimal调用bark方法,同时保留多态性的特性?提供代码示例。

答案

  1. 输出结果是"Dog is eating"。这是因为myAnimal虽然被声明为Animal类型,但实际指向的是Dog类的实例。在Java中,调用的是实际对象的方法(即Dogeat方法),这是多态性的表现。
  2. 取消注释行A后,代码将无法编译通过。这是因为编译器检查myAnimal的引用类型Animal,而Animal类中没有定义bark方法。即使myAnimal实际指向一个Dog对象,由于在编译时只能调用引用类型中声明的方法,因此编译器不允许这种调用。
  3. 要调用bark方法,我们需要将myAnimal的引用类型转换为Dog,这样就可以调用Dog类特有的方法了,同时还保持了对象的多态性。示例如下:
if (myAnimal instanceof Dog) {((Dog)myAnimal).bark();
}

这段代码首先检查myAnimal是否真的是一个Dog实例,如果是,就将其向下转型为Dog类型并调用bark方法。这种方式既利用了多态性,也确保了类型安全。以下是针对Java多态概念的三个面试题目,每个题目都附带了源码示例和相关问题。这些题目旨在测试应聘者对Java多态、方法重写、接口实现以及类型转换的理解和应用能能力。

面试题1: 方法重写与运行时多态

class Bird {public void sing() {System.out.println("Bird is singing");}
}class Sparrow extends Bird {@Overridepublic void sing() {System.out.println("Sparrow is singing");}
}public class PolymorphismExample {public static void main(String[] args) {Bird myBird = new Sparrow();myBird.sing();}
}

问题: 执行myBird.sing();时,输出结果是什么?解释为什么会这样。

答案: 输出结果是"Sparrow is singing"。这是因为myBird虽然被声明为Bird类型,但实际上它引用的是Sparrow的一个实例。在Java中,这种情况下会调用实际对象(即Sparrow对象)的方法,这是多态性的体现。

面试题2: 接口实现与多态

interface Swimmable {void swim();
}class Fish implements Swimmable {public void swim() {System.out.println("Fish is swimming");}
}class Duck extends Bird implements Swimmable {public void swim() {System.out.println("Duck is swimming");}@Overridepublic void sing() {System.out.println("Duck is singing");}
}public class InterfacePolymorphism {public static void main(String[] args) {Swimmable mySwimmable = new Duck();mySwimmable.swim();// ((Bird)mySwimmable).sing(); // 行B}
}

问题:

  1. 执行mySwimmable.swim();时,输出结果是什么?为什么?
  2. 如果取消注释行B (// ((Bird)mySwimmable).sing();),执行该行代码时输出结果是什么?解释原因。

答案:

  1. 输出结果是"Duck is swimming"。因为mySwimmable引用的是Duck类的一个实例,该实例实现了Swimmable接口的swim方法。
  2. 执行((Bird)mySwimmable).sing();后,输出结果是"Duck is singing"。因为mySwimmable实际上指向的是一个Duck对象,通过向下转型为Bird类型,可以调用Duck类重写的sing方法。

面试题3: 抽象类、多态和方法重载

abstract class Shape {abstract void draw();
}class Circle extends Shape {void draw() {System.out.println("Drawing Circle");}// 方法重载void draw(String color) {System.out.println("Drawing Circle with color " + color);}
}public class AbstractClassExample {public static void main(String[] args) {Shape myShape = new Circle();myShape.draw();// ((Circle)myShape).draw("Red"); // 行C}
}

问题:

  1. 执行myShape.draw();时,输出结果是什么?解释为什么。
  2. 如果取消注释行C (// ((Circle)myShape).draw("Red");),执行该行代码时输出结果是什么?解释原因。

答案:

  1. 输出结果是"Drawing Circle"。这是因为myShape虽然被声明为Shape类型,但实际上引用的是Circle类的一个实例。在运行时,会调用实际对象的draw方法,即Circle类中的draw方法。
  2. 取消注释并执行行C后,输出结果是"Drawing Circle with color Red"。通过将myShape向下转型为Circle类型,可以调用重载的draw方法,传入字符串参数进行绘制。这体现了多态性以及方法重载的概念。

这篇关于Java必须掌握的多态中调用成员的特点-(含面试大厂题含源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786019

相关文章

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Python调用LibreOffice处理自动化文档的完整指南

《Python调用LibreOffice处理自动化文档的完整指南》在数字化转型的浪潮中,文档处理自动化已成为提升效率的关键,LibreOffice作为开源办公软件的佼佼者,其命令行功能结合Python... 目录引言一、环境搭建:三步构建自动化基石1. 安装LibreOffice与python2. 验证安装

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security