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

核心思想

  • 身份用继承(抽象类)
  • 能力用接口
  • 共性上移,个性下放
相关推荐
哈哈哈哈~4 小时前
多线程之线程池
java·线程池
洛克大航海4 小时前
7-SpringCloud-服务网关 Gateway-高级特性 Route
java·spring cloud·gateway·route
Dreams_l4 小时前
redis中的数据类型
java·开发语言
梵得儿SHI4 小时前
Java IO 流详解:字符流(Reader/Writer)与字符编码那些事
java·开发语言·字符编码·工作原理·字符流·处理文本
盖世英雄酱581364 小时前
java深度调试【第三章内存分析和堆内存设置】
java·后端
爬山算法4 小时前
Redis(84)如何解决Redis的缓存击穿问题?
java·redis·缓存
程序定小飞4 小时前
基于springboot的电影评论网站系统设计与实现
java·spring boot·后端
一 乐5 小时前
汽车销售|汽车推荐|基于SprinBoot+vue的新能源汽车个性化推荐系统(源码+数据库+文档)
java·数据库·vue.js·汽车·毕设·汽车个性化推荐
虾说羊5 小时前
最细Maven教程以及Maven私服搭建
java·数据库·maven