3:面向对象、封装继承与多态
在这一任务中你将从“定义一个类”逐步走到“用类去建模一个真实问题”。如果说前两题更偏语法和流程控制,那么这一题更偏工程思维:如何组织代码、隐藏实现细节、复用已有逻辑,以及设计可扩展的结构😸
- Task 1、Task 2、Task 5 较为基础。
- Task 3、Task 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 类
然后完成下面的问题:
- 为 Person 类添加构造方法,并实现“复制对象”的效果。
- 请说明你的构造方法是否用到了 this,如果用了,它在这里起什么作用。
- 在 main 方法中创建至少一个 Person 对象,并给对象赋值。
- 请用自己的话解释“类”和“对象”的关系。
Task 2. 访问修饰符、实例成员与静态成员(必做)
Section titled “Task 2. 访问修饰符、实例成员与静态成员(必做)”一个类不仅有字段和方法,还涉及“谁可以访问它”“它属于对象还是属于类”。
请继续围绕 Person 类完成下面的练习:
- 为字段和方法补上你认为合适的访问修饰符。
- 尝试在以下位置访问它们,并总结访问范围:
- 当前类内部
- 同一个包下的其他类
- 不同包下的类
- 说明 public、private、protected、默认访问权限分别代表什么。
- 给 Person 增加一个静态变量,例如“当前已创建对象数量”。
- 再增加一个静态方法,并解释:
- 为什么静态方法可以直接通过类名调用
- 为什么实例方法通常需要先创建对象
这一问重点不是把定义背下来,而是你能否通过实验总结出访问控制和静态成员的行为差异。
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 + "。"); }}请完成以下内容:
- 创建 Penguin 和 Mouse 两个子类,并继承 Animal。
- 使用 super 调用父类构造方法。
- 尝试在子类中重写至少一个父类方法,体现不同对象的行为差异。
- 解释:为什么 Java 不支持类的多继承?
如果你能说清“多继承会带来什么问题”,例如菱形继承冲突,那会更好。
Task 4. 多态与抽象设计(推荐完成)
Section titled “Task 4. 多态与抽象设计(推荐完成)”请对几何图形进行建模,并完成圆形、三角形、矩形的周长和面积计算。
要求:
- 至少用一种面向对象方式完成。
- 你可以选择:
- 抽象类方案
- 接口方案
- 如果两种方案都完成,请说明它们各自适合什么场景。
建议你至少体现以下几点:
- 统一的调用方式
- 不同图形对同一行为的不同实现
- 使用 @Override 重写方法
如果你已经理解了多态,可以进一步演示:把多种图形放进同一个集合里,循环调用它们的面积或周长方法。
Task 5. 封装与接口设计(必做)
Section titled “Task 5. 封装与接口设计(必做)”封装不是简单地“把字段改成 private”,而是把对象的内部状态保护起来,并通过合理接口对外提供能力。
请先说明 public、private 等关键字在封装中的作用,再完成下面这段代码:
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; }}建议你至少考虑这些规则:
- 金额不能是负数或零。
- 取款和转账前需要校验密码。
- 余额不能被外部代码随意直接修改。
- 敏感信息不应该被完整暴露出去。
这一问想看的是:你是否能把“封装”真正落到接口设计上。
请至少提交以下内容:
- Person 相关代码与说明。
- 访问修饰符和静态成员的实验结论。
- BankAccount 的完整实现。
如果你完成了继承、多态建模,也请一并提交运行结果。尤其欢迎你附上:
- 你的类图思路
- 你在设计时做过的取舍
- 你觉得自己写得还不够好的地方
本题提交方式
Section titled “本题提交方式”出题人联系方式
Section titled “出题人联系方式”出题人:
coco
QQ:3916627528