Skip to content

S02-10 面向对象-项目:零钱通

[TOC]

项目开发流程说明

化繁为简,分步实现:

  1. 显示菜单并支持选择
  2. 零钱通明细
  3. 收益入账
  4. 消费
  5. 退出

项目需求说明

使用 Java 开发零钱通项目,支持功能:

  • 收益入账
  • 消费
  • 查看明细
  • 退出系统

项目界面

image-20260204173313237

基本实现

零钱通菜单显示

image-20260204174749757

零钱通明细

image-20260204175013208

image-20260204175248445

image-20260204175504124

收益入账

image-20260204180200487

image-20260204180202429

消费

image-20260204180756585

优化

退出确认

退出确认:输入 4 退出时,提示"你确定要退出吗?y/n",需输入正确的 y/n

image-20260206110129772

金额校验

金额校验:收益入账和消费时,判断金额是否合理并提示

image-20260206111935676

image-20260206112116499

OOP 重构

面向对象重构

  • 封装功能PocketMoneySysOOP.java
  • main 方法PocketMoneySysApp.java

PocketMoneySysOOP

  1. 显示菜单并选择
  2. 零钱通明细
  3. 收益入账
  4. 消费
  5. 退出

【TODO:自己动手】

App

java
public class App {
    public static void main(String[] args) {
        // 创建 PocketMoneySysOOP 对象,调用相关方法完成功能
        PocketMoneySysOOP pocketMoneySys = new PocketMoneySysOOP();
        pocketMoneySys.mainMenu();
    }
}

本章作业

Homework01.java

定义 Person 类(name,age,job),初始化 3 个 Person 对象的数组,按 age 从大到小排序(使用冒泡排序)。

Homework02.java

写出四种访问修饰符和各自的访问权限。

Homework03.java

  1. 编写老师类 Teacher,属性:姓名name年龄age职称post基本工资salary
  2. 业务方法 introduce():输出教师信息
  3. 编写三个子类:
    • Professor(教授):工资级别 1.3
    • AssociateProfessor(副教授):工资级别 1.2
    • Lecturer(讲师):工资级别 1.1
  4. 子类重写 introduce() 方法
  5. 初始化老师对象,调用 introduce() 打印信息

Homework04.java

通过继承实现员工工资核算打印功能:

  • 父类:Employee(员工类)
  • 子类:Manager(部门经理)、Worker(普通员工)
  • 工资计算规则:
    1. 部门经理工资 = 1000 + 单日工资 × 天数 × 1.2(奖金+基本工资)
    2. 普通员工工资 = 单日工资 × 天数 × 1.0(基本工资)
  • 员工属性:姓名、单日工资、工作天数
  • 员工方法:打印工资(子类重写)
  • 初始化对象并调用打印工资方法

Homework05.java

设计继承体系:

  • 父类:Employee(员工类)
  • 子类:Worker(工人)、Peasant(农民)、Teacher(教师)、Scientist(科学家)、Waiter(服务生)
  • 工资规则:
    1. 工人、农民、服务生:只有基本工资 sal
    2. 教师:基本工资 + 课酬(classDay 天 × classSal 元/天)
    3. 科学家:基本工资 + 年终奖 bonus
  • 测试类:打印各类员工的全年工资

Homework06.java

已知 GrandFatherSon 在同一个包,分析父类和子类中通过 thissuper 可调用的属性和方法:

java
class Grand { // 超类
    String name = "AA";
    private int age = 100;
    public void g1() {}
}

class Father extends Grand { // 父类
    String id = "001";
    private double score;
    public void f1() {}
}

class Son extends Father { // 子类
    String name = "BB";
    public void g1() {}
    private void show() {
        // super 可访问哪些成员?
        // this 可访问哪些成员?
    }
}

Homework07.java

写出程序运行结果:

java
class Test { // 父类
    String name = "Rose";
    Test() {
        System.out.println("Test");
    }
    Test(String name) {
        this.name = name;
    }
    public void test() {
        System.out.println(super.name);
        System.out.println(this.name);
    }
}

class Demo extends Test { // 子类
    String name = "Jack";
    Demo() {
        super();
        System.out.println("Demo");
    }
    Demo(String s) {
        super(s);
    }
    public static void main(String[] args) {
        new Demo().test(); // 匿名对象
        new Demo("john").test(); // 匿名对象
    }
}

Homework08.java

扩展 BankAccount 类:

java
class BankAccount {
    private double balance; // 余额
    public BankAccount(double initialBalance) {
        this.balance = initialBalance;
    }
    // 存款
    public void deposit(double amount) {
        balance += amount;
    }
    // 取款
    public void withdraw(double amount) {
        balance -= amount;
    }
    // set 和 getBalance 方法...
}
  1. 扩展 CheckingAccount 类:每次存款和取款收取 1 美元手续费
  2. 扩展 SavingsAccount 类:
    • 每月产生利息(调用 earnMonthlyInterest 方法)
    • 每月 3 次免手续费的存款/取款
    • earnMonthlyInterest 方法中重置交易计数
  3. 体会重写的好处

Homework09.java

设计类:

  1. Point 类:xy 坐标(构造器提供)
  2. 子类 LabeledPoint:构造器接受标签值和 x,y 坐标(例:new LabeledPoint("Black",1929,230.07)

Homework10.java

编写 Doctor 类(name,age,job,gender,sal):

  1. 提供 getter/setter 方法
  2. 5 个参数的构造器
  3. 重写 Object 类的 equals 方法:判断属性是否完全相同
  4. 测试类中创建两个对象,判断是否相等

Homework11.java

写出对象向上转型和向下转型的代码,及可调用的方法:

java
class Person { // 父类
    public void run() {
        System.out.println("person run");
    }
    public void eat() {
        System.out.println("person eat");
    }
}

class Student extends Person { // 子类
    public void study() {
        System.out.println("student study.");
    }
    @Override
    public void run() {
        System.out.println("student run");
    }
}

Homework12.java

简述 ==equals 的区别:

名称概念用于基本数据类型用于引用类型
==比较运算符可以,判断值相等可以,判断对象地址是否相等
equalsObject 类的方法不可以默认判断地址相等;子类常重写为判断属性相等(如 StringInteger

Homework13.java

按要求实现类并打印效果:

打印效果

老师的信息:
姓名:张飞
年龄:30
性别:男
工龄:5
我承诺,我会认真教课。
张飞爱玩象棋

学生的信息:
姓名:小明
年龄:15
性别:男
学号:00023102
我承诺,我会好好学习。
小明爱玩足球。

需求

  1. Student 类:name,sex,age,stu_id,封装,构造器赋值
  2. Teacher 类:name,sex,age,work_age,封装,构造器赋值
  3. 抽取父类 Person,封装共同属性和方法
  4. Studentstudy() 方法:输出"我承诺,我会好好学习。"
  5. Teacherteach() 方法:输出"我承诺,我会认真教学。"
  6. 父子类共有 play() 方法(父类定义,子类重写):
    • 学生返回"xx 爱玩足球"
    • 老师返回"xx 爱玩象棋"
  7. 定义多态数组(2 个学生+2 个教师),按年龄从高到低排序
  8. 定义方法(形参为 Person 类型):调用学生的 study() 或教师的 teach()

Homework14.java

程序阅读题:执行 C c = new C(); 输出什么?

java
class A { // 超类
    public A() {
        System.out.println("我是A类");
    }
}

class B extends A { // 父类
    public B() {
        System.out.println("我是B类的无参构造");
    }
    public B(String name) {
        System.out.println(name + "我是B类的有参构造");
    }
}

class C extends B { // 子类
    public C() {
        this("hello");
        System.out.println("我是c类的无参构造");
    }
    public C(String name) {
        super("hahah");
        System.out.println("我是c类的有参构造");
    }
}

Homework15.java

  1. 什么是多态?
  2. 多态的具体体现(举例说明):
    • 方法多态(重载、重写)
    • 对象多态(编译类型与运行类型不一致)

Homework16.java

什么是 Java 的动态绑定机制?

  1. 调用对象方法时,方法与对象的内存地址/运行类型绑定
  2. 调用对象属性时,无动态绑定机制,哪里声明哪里使用