接口和抽象类的综合练习
【题目描述】
编写带有接口和抽象类的标准Javabean类
我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。
为了出国交流,跟乒乓球相关的人员都需要学习英语
请用所有知识分析,在这个案例中,那哪些是具体类,哪些是抽象类,哪些是接口
乒乓球运动员:姓名,年龄,学打乒乓球,说英语
篮球运动员:姓名,年龄,学打篮球
乒乓球教练:姓名,年龄,教打乒乓球,说英语
篮球教练:姓名,年龄,教打篮球
【题目分析】
-
首先可以确定,子类分别是乒乓球运动员,篮球运动员,乒乓球教练,篮球教练
-
**思路一:按照运动进行分类。**将乒乓球相关的运动员和教练放到一个父类,把姓名,年龄,学英语放到这个父类中;将篮球相关的运动员和教练放到一个父类,把姓名,年龄放到这个父类中。然后将这两个父类抽取公共的属性姓名,年龄,放到更高层的父类Person中。用两个接口分别代表学和教,运动员实现接口学,教练实现接口教。
-
思路一中具体类是乒乓球运动员、乒乓球教练、篮球运动员、篮球教练、篮球从业者、乒乓球从业者。接口是学和教
-
**思路二:按照职业进行分类。**将运动员们放到一个父类,把姓名,年龄,学运动放到这个父类中;将教练们放到一个父类,把姓名,年龄,教运动放到这个父类中。然后将这两个父类抽取公共的属性姓名,年龄,放到更高层的父类Person中。用一个借口表示学英语,乒乓球运动员和乒乓球教练实现学英语的接口
-
思路二中具体类就是乒乓球运动员,篮球运动员,篮球教练,乒乓球教练,接口就是学英语,抽象类就是运动员和教练
-
根据这两种思路的结构图不难看出,思路二更加简洁,所以以下就用思路二进行代码实现
【代码实现】
-
第一步
依据从上向下的顺序,首先应该创建最高级父类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类,直接创建顶层父类是没有意义的
-
第二步
创建完父类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(); }
-
第三步
接着,需要创建接口English,在接口中写明抽象方法
public interface English { public abstract void speakEnglish(); }
-
第四步
创建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接口里面的抽象方法。
-
第五步
创建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接口里面的抽象方法。
-
第六步
编写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(); } }
最终结果