【java面向对象进阶】------抽象类+接口 综合实例
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)
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 —— 运动员抽象类
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 —— 教练抽象类
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 —— 英语能力接口
package demo4;// 接口 English:定义“说英语”的能力
// 仅与乒乓球相关的人员需要实现此接口(满足出国交流需求)
public interface English {// 接口方法:说英语(默认 public abstract)public void speakEnglish();
}
2.5 PingPangAthlete.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():具体学习乒乓球技术@Overridepublic void study() {System.out.println("乒乓球运动员正在学习乒乓球技术");}// 实现接口方法 speakEnglish():具备说英语能力@Overridepublic void speakEnglish() {System.out.println("乒乓球运动员正在讲英语");}
}
2.6 PingPangCoach.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():具体进行乒乓球教学@Overridepublic void teach() {System.out.println("乒乓球教练正在进行乒乓球教学");}// 实现接口方法 speakEnglish():具备说英语能力@Overridepublic void speakEnglish() {System.out.println("乒乓球教练正在讲英语");}
}
2.7 BasketballAthlete.java —— 篮球运动员(具体类)
package demo4;// 具体类:篮球运动员
// 仅继承 Athlete,不实现 English(无需说英语)
public class BasketballAthlete extends Athlete {// 无参构造public BasketballAthlete() {}// 有参构造:调用父类 Athlete 的构造器public BasketballAthlete(String name, int age) {super(name, age);}// 实现抽象方法 study():具体学习篮球技术@Overridepublic void study() {System.out.println("篮球运动员正在学习篮球技术");}
}
2.8 BasketballCoach.java —— 篮球教练(具体类)
package demo4;// 具体类:篮球教练
// 仅继承 Coach,不实现 English(无需说英语)
public class BasketballCoach extends Coach {// 无参构造public BasketballCoach() {}// 有参构造:调用父类 Coach 的构造器public BasketballCoach(String name, int age) {super(name, age);}// 实现抽象方法 teach():具体进行篮球教学@Overridepublic void teach() {System.out.println("篮球教练正在进行篮球教学");}
}
2.9 Test.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 + 无参构造 |
核心思想:
- 身份用继承(抽象类)
- 能力用接口
- 共性上移,个性下放

