一、题目
我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练,为了出国交流,跟乒乓球相关的人员都要学习英语,用代码实现。思考有哪些具体类、哪些抽象类、哪些接口。
二、思路
从具体到抽象分析,先从篮球运动员类、乒乓球运动员类、篮球教练类和乒乓球教练类提取出运动员类和教练类,再提取出人类,然后定义一个学习英语的接口。
从抽象到具体实现:
- 定义说英语接口:带有一个成员方法:说英语。
- 定义抽象人类:成员变量包括姓名和年龄;带参构造方法和无参构造方法;成员方法get和set;吃饭方法;
- 定义抽象教练类:继承人类;带参构造方法和无参构造方法;成员方法 教();重写吃饭方法;
- 定义抽象运动员类:继承人类;带参构造方法和无参构造方法;成员方法 学();重写吃饭方法;
- 定义具体篮球运动员类:继承运动员类;带参构造方法和无参构造方法;重写学习方法;
- 定义具体篮球教练类:继承教练类;带参构造方法和无参构造方法;重写教方法;
- 定义具体乒乓球运动员类:继承运动员类;实现学习英语接口;带参构造方法和无参构造方法;重写学方法,重写说英语方法;
- 定义具体乒乓球教练类:继承教练类;实现学习英语接口;带参构造方法和无参构造方法;重写教方法,重写说英语方法;
- 定义测试类。
三、代码
- 定义说英语接口:
package AthletesAndCoaches; public interface SpeakEnglish { void speakEnglish(); }
- 定义抽象人类:
package AthletesAndCoaches; public abstract class People { private int age; private String name; public People() { } public People(int age, String name) { this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void eat(); }
- 定义抽象教练类:
package AthletesAndCoaches; public abstract class Coaches extends People{ public Coaches() { } public Coaches(int age, String name) { super(age, name); } @Override public void eat() { System.out.println("教练吃火锅"); } public abstract void teach(); }
- 定义抽象运动员类:
package AthletesAndCoaches; public abstract class Athletes extends People{ public Athletes() { } public Athletes(int age, String name) { super(age, name); } @Override public void eat() { System.out.println("运动员吃烧烤"); } public abstract void study(); }
- 定义具体篮球运动员类:
package AthletesAndCoaches; public class BasketballPlayer extends Athletes { public BasketballPlayer() { } public BasketballPlayer(int age, String name) { super(age, name); } @Override public void study() { System.out.println("篮球运动员要练投篮"); } }
- 定义具体篮球教练类:
package AthletesAndCoaches; public class BasketballCoach extends Coaches{ public BasketballCoach() { } public BasketballCoach(int age, String name) { super(age, name); } @Override public void teach() { System.out.println("篮球教练要教投篮"); } }
- 定义具体乒乓球运动员类:
package AthletesAndCoaches; public class PingpangPlayer extends Athletes implements SpeakEnglish { public PingpangPlayer() { } public PingpangPlayer(int age, String name) { super(age, name); } @Override public void study() { System.out.println("乒乓球运动员要练螺旋球"); } @Override public void speakEnglish() { System.out.println("乒乓球运动员要学习英语"); } }
- 定义具体乒乓球教练类:
package AthletesAndCoaches; public class PingpongCoaches extends Coaches implements SpeakEnglish{ public PingpongCoaches() { } public PingpongCoaches(int age, String name) { super(age, name); } @Override public void teach() { System.out.println("乒乓球教练要教螺旋球"); } @Override public void speakEnglish() { System.out.println("乒乓球教练要学习英语"); } }
- 定义测试类:
package AthletesAndCoaches; public class AthletesAndCoachesDemo { public static void main(String[] args) { //创建一个篮球教练对象 BasketballCoach bc = new BasketballCoach(30,"斯隆"); System.out.println(bc.getName()+","+bc.getAge()); bc.eat(); bc.teach(); // bc.speakEnglish(); //篮球教练没有学习英语,这里会报错,必须注释掉 //创建一个篮球运动员对象 System.out.println("----------------"); BasketballPlayer bp = new BasketballPlayer(); bp.setAge(20); bp.setName("库里"); System.out.println(bp.getName()+","+bp.getAge()); bp.eat(); bp.study(); // bp.teach(); //运动员没有teach方法,必须注释掉 //创建一个乒乓球教练 System.out.println("----------------"); PingpongCoaches pc = new PingpongCoaches(30,"刘国梁"); System.out.println(pc.getName()+","+pc.getAge()); pc.eat(); pc.teach(); pc.speakEnglish(); //乒乓球教练要学习英语 //创建一个乒乓球运动员 System.out.println("----------------"); PingpangPlayer pp = new PingpangPlayer(); pp.setAge(20); pp.setName("张继科"); System.out.println(pp.getName()+","+pp.getAge()); pp.eat(); pp.study(); pp.speakEnglish(); } }
- 输出结果如下图:
到这里,运动员和教练的案例就完成了,你对继承和实现、具体类、抽象类、接口等知识点,有没有更好的理解呢?
可以看着思路,不看代码,自己动手敲一下。