跳转到内容

3:面向对象、封装继承与多态

后端Banner

在这一任务中你将从“定义一个类”逐步走到“用类去建模一个真实问题”。如果说前两题更偏语法和流程控制,那么这一题更偏工程思维:如何组织代码、隐藏实现细节、复用已有逻辑,以及设计可扩展的结构😸

  • Task 1Task 2Task 5 较为基础。
  • Task 3Task 4 更能体现你的抽象能力和建模能力。
  • 回答时请尽量说明:你为什么这样设计,而不是只给最后一份代码。

Task 1. 类、对象与构造方法(必做)

Section titled “Task 1. 类、对象与构造方法(必做)”

先来看一个简单的 Person 类:

public class Person {
private String name;
private int age;
private int sex;
private void eat() {
System.out.println(name + "正在吃东西");
}
private void sleep() {
}
private void dadoudou() {
}
}

请你创建一个 Java 项目,其中至少包含:

  • 一个主类,里面有 main 方法作为程序入口
  • 一个 Person

然后完成下面的问题:

  1. Person 类添加构造方法,并实现“复制对象”的效果。
  2. 请说明你的构造方法是否用到了 this,如果用了,它在这里起什么作用。
  3. main 方法中创建至少一个 Person 对象,并给对象赋值。
  4. 请用自己的话解释“类”和“对象”的关系。

Task 2. 访问修饰符、实例成员与静态成员(必做)

Section titled “Task 2. 访问修饰符、实例成员与静态成员(必做)”

一个类不仅有字段和方法,还涉及“谁可以访问它”“它属于对象还是属于类”。

请继续围绕 Person 类完成下面的练习:

  1. 为字段和方法补上你认为合适的访问修饰符。
  2. 尝试在以下位置访问它们,并总结访问范围:
    • 当前类内部
    • 同一个包下的其他类
    • 不同包下的类
  3. 说明 publicprivateprotected、默认访问权限分别代表什么。
  4. Person 增加一个静态变量,例如“当前已创建对象数量”。
  5. 再增加一个静态方法,并解释:
    • 为什么静态方法可以直接通过类名调用
    • 为什么实例方法通常需要先创建对象

这一问重点不是把定义背下来,而是你能否通过实验总结出访问控制和静态成员的行为差异。

Task 3. 继承与代码复用(推荐完成)

Section titled “Task 3. 继承与代码复用(推荐完成)”

继承是面向对象建模的重要方式之一。下面给出一个父类:

public class Animal {
private String name;
private int id;
public Animal(String myName, int myId) {
name = myName;
id = myId;
}
public void eat() {
System.out.println(name + "正在吃");
}
public void sleep() {
System.out.println(name + "正在睡");
}
public void introduction() {
System.out.println("大家好!我是" + id + "" + name + "");
}
}

请完成以下内容:

  1. 创建 PenguinMouse 两个子类,并继承 Animal
  2. 使用 super 调用父类构造方法。
  3. 尝试在子类中重写至少一个父类方法,体现不同对象的行为差异。
  4. 解释:为什么 Java 不支持类的多继承?

如果你能说清“多继承会带来什么问题”,例如菱形继承冲突,那会更好。

Task 4. 多态与抽象设计(推荐完成)

Section titled “Task 4. 多态与抽象设计(推荐完成)”

请对几何图形进行建模,并完成圆形、三角形、矩形的周长和面积计算。

要求:

  1. 至少用一种面向对象方式完成。
  2. 你可以选择:
    • 抽象类方案
    • 接口方案
  3. 如果两种方案都完成,请说明它们各自适合什么场景。

建议你至少体现以下几点:

  • 统一的调用方式
  • 不同图形对同一行为的不同实现
  • 使用 @Override 重写方法

如果你已经理解了多态,可以进一步演示:把多种图形放进同一个集合里,循环调用它们的面积或周长方法。

封装不是简单地“把字段改成 private”,而是把对象的内部状态保护起来,并通过合理接口对外提供能力。

请先说明 publicprivate 等关键字在封装中的作用,再完成下面这段代码:

public class BankAccount {
// TODO: 修改属性的可见性
String accountNumber;
String accountHolder;
double balance;
String password;
BankAccount(String accountNumber, String accountHolder, double initialBalance, String password) {
// TODO
}
void deposit(double amount) {
// TODO
}
boolean withdraw(double amount, String inputPassword) {
// TODO
}
boolean transfer(BankAccount recipient, double amount, String inputPassword) {
// TODO
}
double getBalance() {
// TODO
}
String getAccountInfo() {
// TODO
}
// 只需修改可见性
boolean validatePassword(String inputPassword) {
return true;
}
// 只需修改可见性
boolean validateAmount(double amount) {
return true;
}
}

建议你至少考虑这些规则:

  1. 金额不能是负数或零。
  2. 取款和转账前需要校验密码。
  3. 余额不能被外部代码随意直接修改。
  4. 敏感信息不应该被完整暴露出去。

这一问想看的是:你是否能把“封装”真正落到接口设计上。

请至少提交以下内容:

  1. Person 相关代码与说明。
  2. 访问修饰符和静态成员的实验结论。
  3. BankAccount 的完整实现。

如果你完成了继承、多态建模,也请一并提交运行结果。尤其欢迎你附上:

  • 你的类图思路
  • 你在设计时做过的取舍
  • 你觉得自己写得还不够好的地方

提交点这里

出题人:出题人头像  coco

QQ:3916627528

邮箱:3916627528@qq.com