【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)

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 + 无参构造

核心思想

  • 身份用继承(抽象类)
  • 能力用接口
  • 共性上移,个性下放
相关推荐
上玄code几秒前
【Agent精讲】调一个LLMAPI背后的工程问题
java·开发语言·python·chatgpt
李冰然1 分钟前
深入Java集合框架:ArrayList源码解析(JDK 8)
java
小小啊python9 分钟前
IDEA中SpringBoot项目配置热部署
java·ide·intellij-idea·springboot·热部署
Java成神之路-32 分钟前
Spring AI Alibaba 实现多轮对话记忆:ChatMemory 与 Redis 持久化实战
java·springaialibaba
JAVA面经实录91735 分钟前
网络编程基础(Java Web/分布式前置·完整版)(十一)
java·前端·网络
代码方舟42 分钟前
零信任架构实战:基于天远人企关联构建自动化企业尽职调查网关
java·人工智能·架构·自动化
Escalating_xu1 小时前
【Linux】基础 I/O 深度解析:FILE、文件描述符、open/read/write、重定向与缓冲区
java·linux·服务器
城管不管1 小时前
MySQL 慢查询完整排查
java·服务器·jvm·数据库·mysql·spring·面试
ZC跨境爬虫1 小时前
LeetCode 88. 合并两个有序数组(双指针详解 + Java Python 实现)
java·python·算法·leetcode
北风toto1 小时前
研发效能与后端核心技术全景指南:从CI/CD到共性组件实战
java·开发语言·ci/cd