接口和抽象类的综合练习

接口和抽象类的综合练习

接口讲解入口

【题目描述】

编写带有接口和抽象类的标准Javabean类

我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。

为了出国交流,跟乒乓球相关的人员都需要学习英语

请用所有知识分析,在这个案例中,那哪些是具体类,哪些是抽象类,哪些是接口

乒乓球运动员:姓名,年龄,学打乒乓球,说英语

篮球运动员:姓名,年龄,学打篮球

乒乓球教练:姓名,年龄,教打乒乓球,说英语

篮球教练:姓名,年龄,教打篮球

【题目分析】

  • 首先可以确定,子类分别是乒乓球运动员,篮球运动员,乒乓球教练,篮球教练

  • **思路一:按照运动进行分类。**将乒乓球相关的运动员和教练放到一个父类,把姓名,年龄,学英语放到这个父类中;将篮球相关的运动员和教练放到一个父类,把姓名,年龄放到这个父类中。然后将这两个父类抽取公共的属性姓名,年龄,放到更高层的父类Person中。用两个接口分别代表学和教,运动员实现接口学,教练实现接口教。

    思路一结构图

  • 思路一中具体类是乒乓球运动员、乒乓球教练、篮球运动员、篮球教练、篮球从业者、乒乓球从业者。接口是学和教

  • **思路二:按照职业进行分类。**将运动员们放到一个父类,把姓名,年龄,学运动放到这个父类中;将教练们放到一个父类,把姓名,年龄,教运动放到这个父类中。然后将这两个父类抽取公共的属性姓名,年龄,放到更高层的父类Person中。用一个借口表示学英语,乒乓球运动员和乒乓球教练实现学英语的接口

    思路二结构图

  • 思路二中具体类就是乒乓球运动员,篮球运动员,篮球教练,乒乓球教练,接口就是学英语,抽象类就是运动员和教练

  • 根据这两种思路的结构图不难看出,思路二更加简洁,所以以下就用思路二进行代码实现

【代码实现】

  1. 第一步

    依据从上向下的顺序,首先应该创建最高级父类Person。在父类Person中应该有成员变量姓名、年龄,还要有对应的构造方法以及方法

    public abstract class Person {
        private String name;
        private int age;
    
        public Person() {
        }
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        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;
        }
    }
    

    Person类设为抽象类是因为不想让外界直接创建Person类,直接创建顶层父类是没有意义的

  2. 第二步

    创建完父类Person后,接着创建它的子类Sporter和Coach,在Sporter类和Coach类中首先要有父类中的成员变量的构造方法,还要在Sporter类中有抽象方法的learn,在Coach类中有抽象方法teach。因此Sporter类和Coach类是抽象类

    //Sporter类
    public abstract class Sporter extends Person{
        public Sporter() {
        }
    
        public Sporter(String name, int age) {
            super(name, age);
        }
    
        public abstract void learn();
    }
    
    //Coach类
    public abstract class Coach extends Person{
        public Coach() {
        }
    
        public Coach(String name, int age) {
            super(name, age);
        }
        public abstract void teach();
    }
    
  3. 第三步

    接着,需要创建接口English,在接口中写明抽象方法

    public interface English {
        public abstract void speakEnglish();
    }
    
  4. 第四步

    创建Sporter类的子类PingPongSporter类和BasketballSporter类,并且完成相关的功能

    //PingPongSporter类
    public class PingPongSporter extends Sporter implements English{
        public PingPongSporter() {
        }
    
        public PingPongSporter(String name, int age) {
            super(name, age);
        }
    
        @Override
        public void speakEnglish() {
            System.out.println("乒乓球运动员学英语");
        }
    
        @Override
        public void learn() {
            System.out.println("乒乓球运动员学打乒乓球");
        }
    }
    
    //BasketballSporter类
    public class BasketballSporter extends Sporter {
        public BasketballSporter() {
        }
    
        public BasketballSporter(String name, int age) {
            super(name, age);
        }
    
        @Override
        public void learn() {
            System.out.println("篮球运动员学打篮球");
        }
    
    }
    

    因为PingPongSporter类需要实现English接口,因此需要重写English接口里面的抽象方法。

  5. 第五步

    创建Coach类的子类PingPongCoach类和BasketballCoachr类,并且完成相关的功能

    //PingPongCoach类
    public class PingPongCoach extends Coach implements English{
        public PingPongCoach() {
        }
    
        public PingPongCoach(String name, int age) {
            super(name, age);
        }
    
        @Override
        public void teach() {
            System.out.println("乒乓球教练在教打乒乓球");
        }
    
        @Override
        public void speakEnglish() {
            System.out.println("乒乓球教练在学英语");
        }
    }
    
    //BasketballCoach类
    public class BasketballCoach extends Coach{
        public BasketballCoach() {
        }
    
        public BasketballCoach(String name, int age) {
            super(name, age);
        }
    
        @Override
        public void teach() {
            System.out.println("篮球教练在教打篮球");
        }
    }
    
    

    因为PingPongCoach类需要实现English接口,因此需要重写English接口里面的抽象方法。

  6. 第六步

    编写Test类,实现相应的输出

    public class Teat {
        public static void main(String[] args) {
            PingPongSporter pps = new PingPongSporter("ppa", 23);
            System.out.println(pps.getName() + " " + pps.getAge());
            pps.learn();
            pps.speakEnglish();
    
            PingPongCoach ppc=new PingPongCoach("ppc",40);
            System.out.println(ppc.getName()+" "+ppc.getAge());
            ppc.teach();
            ppc.speakEnglish();
    
            BasketballSporter bs=new BasketballSporter("bs",24);
            System.out.println(bs.getName()+" "+bs.getAge());
            bs.learn();
    
            BasketballCoach bc=new BasketballCoach("bc",42);
            System.out.println(bc.getName()+" "+bc.getAge());
            bc.teach();
        }
    }
    

    最终结果

测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

都不会的鲨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值