[Java] 多态相关的题目

本文深入探讨了面向对象编程中的多态概念,通过实例讲解了如何通过继承、方法重写及父类引用指向子类对象来实现多态。并讨论了多态带来的代码灵活性和扩展性的优点,以及无法直接访问子类特有方法的限制。最后,提供了动物类和猫类的代码示例,演示了多态的实际应用。


多态相关的题目

1. 问答题

1. 请用一句话描述出用代码怎样实现“多态”?
	1. 继承或实现(二选一)
	2. 方法重写
	3. 父类引用指向子类对象


2. 请写出多态的好处和弊端。
	好处:多态的好处是提高代码的灵活性、扩展性
	弊端:无法访问子类中特有的方法


3. 请写出多态的向下转型的意义。
	多态时,无法访问子类中特有的方法,要像使用子类中特有的方法,必须向下转型。

2. 编程题

  1. 有以下类定义:
    • 动物类:
    • 属性:名称、年龄、性别
    • 行为:吃饭(非抽象)
    • 猫类继承自动物
    • 行为:捉老鼠
  2. 要求
    • 请按要求在代码中定义上述类,并用多态的形式测试调用“吃饭”和“捉老鼠”的方法。

参考答案:

  • 动物类
/**
 * 动物
 */
public class Animal {
    //成员变量
    private String name;    //名称
    private int age;        //年龄
    private String gender;  //性别

    //空参构造
    public Animal() {
    }

    //全参构造
    public Animal(String name, int age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    //成员方法
    public void eat() {
        System.out.println("吃东西...");
    }

    //getter & setter 略
}
  • 猫类
/**
 * 猫 继承 动物类
 */
public class Cat extends Animal {

    //特有的方法
    public void catchMouse() {
        System.out.println("抓老鼠...");
    }
}
  • 测试类
public class Test {
    public static void main(String[] args) {
        //测试多态
        Animal animal = new Cat();
        animal.eat(); //可以调用

        //animal.catchMouse(); 无法调用子类中特有的方法
    }
}

原文链接:https://qwert.blog.csdn.net/article/details/105356202

### Java多态示例题目与练习 #### 题目背景 在Java编程中,多态是一种重要的面向对象特性,它允许程序以统一的方式来处理不同类型的对象。通过父类引用指向子类对象,可以实现灵活的方法调用机制[^1]。 --- #### 示例题目 1:动物叫声模拟 ##### 描述 定义一个`Animal`抽象类或接口,其中包含一个抽象方法`makeSound()`用于发出声音。创建两个具体子类`Dog`和`Cat`分别继承该抽象类并实现自己的发声逻辑。编写测试代码验证多态行为。 ##### 要求 1. `Animal` 类/接口应提供一个抽象方法`makeSound()`. 2. 子类`Dog` 和`Cat`需覆盖此方法。 3. 编写测试代码,使用`Animal`类型的变量来存储`Dog`和`Cat`的对象,并调用它们的`makeSound()`方法观察运行时的行为差异。 ##### 参考代码 ```java // 定义抽象类 Animal abstract class Animal { public abstract void makeSound(); } // Dog 实现 Animal 的 makeSound 方法 class Dog extends Animal { @Override public void makeSound() { System.out.println("汪汪"); } } // Cat 实现 Animal 的 makeSound 方法 class Cat extends Animal { @Override public void makeSound() { System.out.println("喵喵"); } } public class TestPolymorphism { public static void main(String[] args) { // 使用 Animal 引用指向具体的 Dog 和 Cat 对象 Animal animal1 = new Dog(); // 运行时类型为 Dog Animal animal2 = new Cat(); // 运行时类型为 Cat // 调用各自的 makeSound 方法 animal1.makeSound(); // 输出: 汪汪 animal2.makeSound(); // 输出: 喵喵 } } ``` --- #### 示例题目 2:员工工资计算 ##### 描述 设计一个`Employee`抽象类,派生出两个子类`FullTimeEmployee`(全职员工)和`PartTimeEmployee`(兼职员工)。每种员工有不同的薪资计算方式。利用多态性,在主函数中根据不同类型的员工实例化对象并计算他们的薪水。 ##### 要求 1. 抽象类`Employee`有一个名为`calculateSalary()`的抽象方法。 2. 子类各自实现`calculateSalary()`的具体算法。 3. 测试部分展示如何通过父类引用访问子类特有的功能。 ##### 参考代码 ```java // Employee 抽象类 abstract class Employee { protected String name; public Employee(String name) { this.name = name; } public abstract double calculateSalary(); } // FullTimeEmployee 子类 class FullTimeEmployee extends Employee { private double monthlySalary; public FullTimeEmployee(String name, double monthlySalary) { super(name); this.monthlySalary = monthlySalary; } @Override public double calculateSalary() { return monthlySalary; // 全职工资按月固定发放 } } // PartTimeEmployee 子类 class PartTimeEmployee extends Employee { private int hoursWorked; private double hourlyRate; public PartTimeEmployee(String name, int hoursWorked, double hourlyRate) { super(name); this.hoursWorked = hoursWorked; this.hourlyRate = hourlyRate; } @Override public double calculateSalary() { return hoursWorked * hourlyRate; // 兼职工资按小时计费 } } public class SalaryTest { public static void main(String[] args) { Employee emp1 = new FullTimeEmployee("张三", 8000); // 创建全职员工 Employee emp2 = new PartTimeEmployee("李四", 160, 50); // 创建兼职员工 System.out.println(emp1.name + " 的月薪:" + emp1.calculateSalary()); // 输出: 张三 的月薪:8000.0 System.out.println(emp2.name + " 的月薪:" + emp2.calculateSalary()); // 输出: 李四 的月薪:8000.0 } } ``` --- #### 示例题目 3:动物园管理系统 ##### 描述 构建一个简单的动物园管理系统的模型,其中包括多个种类的动物以及饲养员的功能扩展。重点在于理解如何通过多态简化重复代码结构。 ##### 要求 1. 设计一个通用的`Animal`接口,规定所有动物都必须具备`eat(String food)`方法。 2. 提供两种具体动物——`Tiger`和`Elephant`,分别实现进食的不同细节。 3. 添加一个`Keeper`类代表饲养员,能够接受任意一种动物作为参数并通过多态调用其`eat`方法。 4. 扩展思考:如果某些特定动物还有额外技能(如老虎会吼叫),该如何优雅地支持这些特殊能力? ##### 参考代码 ```java // 定义 Animal 接口 interface Animal { void eat(String food); } // Tiger 实现 Animal 接口 class Tiger implements Animal { @Override public void eat(String food) { System.out.println("老虎正在吃 " + food); } public void roar() { // 特定于老虎的能力 System.out.println("嗷呜~ 我是一只威风凛凛的老虎!"); } } // Elephant 实现 Animal 接口 class Elephant implements Animal { @Override public void eat(String food) { System.out.println("大象正在吃 " + food); } } // Keeper 类负责喂养各种动物 class Keeper { public void feed(Animal animal, String food) { animal.eat(food); // 利用多态自动适配不同类型动物 } } public class ZooSystem { public static void main(String[] args) { Animal tiger = new Tiger(); Animal elephant = new Elephant(); Keeper keeper = new Keeper(); // 喂食操作 keeper.feed(tiger, "肉"); // 输出: 老虎正在吃 肉 keeper.feed(elephant, "草料"); // 输出: 大象正在吃 草料 // 如果想让老虎吼叫,则需要强制转换回具体类型 ((Tiger)tiger).roar(); // 输出: 嗷呜~ 我是一只威风凛凛的老虎! } } ``` --- #### 总结说明 上述例子展示了Java中的多态应用技巧,包括但不限于: - **动态绑定**:父类引用调用子类方法的实际执行取决于实际对象类型; - **减少冗余代码**:借助共同超类型统一处理多种子类型; - **增强可维护性和灵活性**:新增加的子类无需修改原有业务逻辑即可融入系统[^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值