0.需求
编写带有接口和抽象类的标准JavaBean类
我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。为了出国交流,跟乒乓球相关的人员都需要学习英语。
请用所有知识分析,在这个案例中,哪些是具体类,哪些是抽象类,哪些是接口?
乒乓球运动员:姓名,年龄,学打乒乓球,说英语
篮球运动员:姓名,年龄,学打篮球
乒乓球教练:姓名,年龄,教打乒乓球,说英语
篮球教练:姓名,年龄,教打篮球
需求分析见下图:

1.项目结构(包:demo4)

demo4/
├── Person.java // 抽象基类:所有人员共性(姓名、年龄)
├── Athlete.java // 抽象类:运动员(需实现 study 方法)
├── Coach.java // 抽象类:教练(需实现 teach 方法)
├── English.java // 接口:说英语能力
├── PingPangAthlete.java // 具体类:乒乓球运动员(实现 English)
├── PingPangCoach.java // 具体类:乒乓球教练(实现 English)
├── BasketballAthlete.java // 具体类:篮球运动员
├── BasketballCoach.java // 具体类:篮球教练
└── Test.java // 测试类
2.完整代码
2.1 Person.java ------ 抽象基类(标准 JavaBean)
java
package demo4;
// 抽象类 Person:定义所有人员的共性属性(姓名、年龄)
// 由于现实中不存在"纯人员"实例,故设为 abstract
public abstract class Person {
// 私有成员变量(符合 JavaBean 封装原则)
private String name;
private int age;
// 无参构造方法(JavaBean 规范要求)
public Person() {
}
// 有参构造方法:用于初始化姓名和年龄
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 标准 getter 和 setter 方法(JavaBean 规范)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.2 Athlete.java ------ 运动员抽象类
java
package demo4;
// 抽象类 Athlete:继承自 Person,表示"运动员"身份
// 所有运动员都必须实现 study() 方法(学习具体项目技术)
public abstract class Athlete extends Person {
// 无参构造
public Athlete() {
}
// 有参构造:调用父类构造器初始化共性字段
public Athlete(String name, int age) {
super(name, age);
}
// 抽象方法:不同项目的运动员学习内容不同,由子类具体实现
public abstract void study();
}
2.3 Coach.java ------ 教练抽象类
java
package demo4;
// 抽象类 Coach:继承自 Person,表示"教练"身份
// 所有教练都必须实现 teach() 方法(教授具体项目)
public abstract class Coach extends Person {
// 无参构造
public Coach() {
}
// 有参构造:调用父类构造器初始化共性字段
public Coach(String name, int age) {
super(name, age);
}
// 抽象方法:不同项目的教练教学内容不同,由子类具体实现
public abstract void teach();
}
2.4 English.java ------ 英语能力接口
java
package demo4;
// 接口 English:定义"说英语"的能力
// 仅与乒乓球相关的人员需要实现此接口(满足出国交流需求)
public interface English {
// 接口方法:说英语(默认 public abstract)
public void speakEnglish();
}
2.5 PingPangAthlete.java ------ 乒乓球运动员(具体类)
java
package demo4;
// 具体类:乒乓球运动员
// 继承 Athlete(身份),实现 English(能力)
public class PingPangAthlete extends Athlete implements English {
// 无参构造
public PingPangAthlete() {
}
// 有参构造:调用父类 Athlete 的构造器
public PingPangAthlete(String name, int age) {
super(name, age);
}
// 实现抽象方法 study():具体学习乒乓球技术
@Override
public void study() {
System.out.println("乒乓球运动员正在学习乒乓球技术");
}
// 实现接口方法 speakEnglish():具备说英语能力
@Override
public void speakEnglish() {
System.out.println("乒乓球运动员正在讲英语");
}
}
2.6 PingPangCoach.java ------ 乒乓球教练(具体类)
java
package demo4;
// 具体类:乒乓球教练
// 继承 Coach(身份),实现 English(能力)
public class PingPangCoach extends Coach implements English {
// 无参构造
public PingPangCoach() {
}
// 有参构造:调用父类 Coach 的构造器
public PingPangCoach(String name, int age) {
super(name, age);
}
// 实现抽象方法 teach():具体进行乒乓球教学
@Override
public void teach() {
System.out.println("乒乓球教练正在进行乒乓球教学");
}
// 实现接口方法 speakEnglish():具备说英语能力
@Override
public void speakEnglish() {
System.out.println("乒乓球教练正在讲英语");
}
}
2.7 BasketballAthlete.java ------ 篮球运动员(具体类)
java
package demo4;
// 具体类:篮球运动员
// 仅继承 Athlete,不实现 English(无需说英语)
public class BasketballAthlete extends Athlete {
// 无参构造
public BasketballAthlete() {
}
// 有参构造:调用父类 Athlete 的构造器
public BasketballAthlete(String name, int age) {
super(name, age);
}
// 实现抽象方法 study():具体学习篮球技术
@Override
public void study() {
System.out.println("篮球运动员正在学习篮球技术");
}
}
2.8 BasketballCoach.java ------ 篮球教练(具体类)
java
package demo4;
// 具体类:篮球教练
// 仅继承 Coach,不实现 English(无需说英语)
public class BasketballCoach extends Coach {
// 无参构造
public BasketballCoach() {
}
// 有参构造:调用父类 Coach 的构造器
public BasketballCoach(String name, int age) {
super(name, age);
}
// 实现抽象方法 teach():具体进行篮球教学
@Override
public void teach() {
System.out.println("篮球教练正在进行篮球教学");
}
}
2.9 Test.java ------ 测试类
java
package demo4;
// 测试类:验证乒乓球运动员的功能
public class Test {
public static void main(String[] args) {
// 使用有参构造创建乒乓球运动员对象
PingPangAthlete one = new PingPangAthlete("马龙", 25);
// 调用继承自 Person 的 getter 方法,获取基本信息
System.out.println("运动员信息 姓名:" + one.getName() + " 年龄:" + one.getAge());
// 调用继承自 Athlete 并重写的 study() 方法
one.study();
// 调用实现自 English 接口的 speakEnglish() 方法
one.speakEnglish();
}
}
输出 :
2.10 设计总结
| 设计元素 | 作用 |
|---|---|
抽象类 Person |
抽取共性属性(name, age) |
抽象类 Athlete/Coach |
定义身份共性行为(study/teach) |
接口 English |
表达可选能力(仅乒乓球相关人员) |
| 具体类 | 实现具体行为,可直接实例化 |
| JavaBean 规范 | 私有字段 + getter/setter + 无参构造 |
核心思想:
- 身份用继承(抽象类)
- 能力用接口
- 共性上移,个性下放
