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

核心思想

  • 身份用继承(抽象类)
  • 能力用接口
  • 共性上移,个性下放
相关推荐
WX-bisheyuange2 小时前
基于Spring Boot的民宿预定系统的设计与实现
java·spring boot·后端·毕业设计
码界奇点2 小时前
Java设计模式精讲从基础到实战的常见模式解析
java·开发语言·设计模式·java-ee·软件工程
q***9443 小时前
springboot接入deepseek深度求索 java
java·spring boot·后端
诗9趁年华3 小时前
深入分析线程池
java·jvm·算法
百***06013 小时前
SpringBoot的@Scheduled和@Schedules有什么区别
java·spring boot·spring
喵了几个咪4 小时前
使用Bazel构建你的Kratos微服务
java·运维·微服务
千寻技术帮4 小时前
50022_基于微信小程序同城维修系统
java·mysql·微信小程序·小程序·同城维修
野蛮人6号4 小时前
黑马八股笔记
java
Charles_go4 小时前
41、C#什么是单例设计模式
java·设计模式·c#
皮皮林5515 小时前
别再只会 mvn install 了!深入拆解 Maven 插件核心原理
java·maven