S02-10 面向对象-项目:零钱通
[TOC]
项目开发流程说明
化繁为简,分步实现:
- 显示菜单并支持选择
- 零钱通明细
- 收益入账
- 消费
- 退出
项目需求说明
使用 Java 开发零钱通项目,支持功能:
- 收益入账
- 消费
- 查看明细
- 退出系统
项目界面

基本实现
零钱通菜单显示

零钱通明细



收益入账


消费

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

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


OOP 重构
面向对象重构:
- 封装功能:
PocketMoneySysOOP.java - main 方法:
PocketMoneySysApp.java
PocketMoneySysOOP
- 显示菜单并选择
- 零钱通明细
- 收益入账
- 消费
- 退出
【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
- 编写老师类
Teacher,属性:姓名name、年龄age、职称post、基本工资salary - 业务方法
introduce():输出教师信息 - 编写三个子类:
Professor(教授):工资级别 1.3AssociateProfessor(副教授):工资级别 1.2Lecturer(讲师):工资级别 1.1
- 子类重写
introduce()方法 - 初始化老师对象,调用
introduce()打印信息
Homework04.java
通过继承实现员工工资核算打印功能:
- 父类:
Employee(员工类) - 子类:
Manager(部门经理)、Worker(普通员工) - 工资计算规则:
- 部门经理工资 = 1000 + 单日工资 × 天数 × 1.2(奖金+基本工资)
- 普通员工工资 = 单日工资 × 天数 × 1.0(基本工资)
- 员工属性:姓名、单日工资、工作天数
- 员工方法:打印工资(子类重写)
- 初始化对象并调用打印工资方法
Homework05.java
设计继承体系:
- 父类:
Employee(员工类) - 子类:
Worker(工人)、Peasant(农民)、Teacher(教师)、Scientist(科学家)、Waiter(服务生) - 工资规则:
- 工人、农民、服务生:只有基本工资
sal - 教师:基本工资 + 课酬(
classDay天 ×classSal元/天) - 科学家:基本工资 + 年终奖
bonus
- 工人、农民、服务生:只有基本工资
- 测试类:打印各类员工的全年工资
Homework06.java
已知 Grand、Father、Son 在同一个包,分析父类和子类中通过 this 和 super 可调用的属性和方法:
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 方法...
}- 扩展
CheckingAccount类:每次存款和取款收取 1 美元手续费 - 扩展
SavingsAccount类:- 每月产生利息(调用
earnMonthlyInterest方法) - 每月 3 次免手续费的存款/取款
earnMonthlyInterest方法中重置交易计数
- 每月产生利息(调用
- 体会重写的好处
Homework09.java
设计类:
Point类:x和y坐标(构造器提供)- 子类
LabeledPoint:构造器接受标签值和x,y坐标(例:new LabeledPoint("Black",1929,230.07))
Homework10.java
编写 Doctor 类(name,age,job,gender,sal):
- 提供 getter/setter 方法
- 5 个参数的构造器
- 重写
Object类的equals方法:判断属性是否完全相同 - 测试类中创建两个对象,判断是否相等
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 的区别:
| 名称 | 概念 | 用于基本数据类型 | 用于引用类型 |
|---|---|---|---|
== | 比较运算符 | 可以,判断值相等 | 可以,判断对象地址是否相等 |
equals | Object 类的方法 | 不可以 | 默认判断地址相等;子类常重写为判断属性相等(如 String、Integer) |
Homework13.java
按要求实现类并打印效果:
打印效果
老师的信息:
姓名:张飞
年龄:30
性别:男
工龄:5
我承诺,我会认真教课。
张飞爱玩象棋
学生的信息:
姓名:小明
年龄:15
性别:男
学号:00023102
我承诺,我会好好学习。
小明爱玩足球。需求
Student类:name,sex,age,stu_id,封装,构造器赋值Teacher类:name,sex,age,work_age,封装,构造器赋值- 抽取父类
Person,封装共同属性和方法 Student有study()方法:输出"我承诺,我会好好学习。"Teacher有teach()方法:输出"我承诺,我会认真教学。"- 父子类共有
play()方法(父类定义,子类重写):- 学生返回"xx 爱玩足球"
- 老师返回"xx 爱玩象棋"
- 定义多态数组(2 个学生+2 个教师),按年龄从高到低排序
- 定义方法(形参为
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
- 什么是多态?
- 多态的具体体现(举例说明):
- 方法多态(重载、重写)
- 对象多态(编译类型与运行类型不一致)
Homework16.java
什么是 Java 的动态绑定机制?
- 调用对象方法时,方法与对象的内存地址/运行类型绑定
- 调用对象属性时,无动态绑定机制,哪里声明哪里使用