目录
案例:猫和狗
需求:对猫狗进行训练,它们就可以调高了,这里加入调高功能。请采用抽象类和接口来实现猫狗案例,并在测试类中进行测试。
思路:
- 定义接口(Jumpping):
成员方法:跳高();
- 定义抽象动物类(Animal):
成员变量:姓名,年龄;
构造方法:无参,带参;
成员方法:get/set方法,吃饭();
- 定义具体的猫类(Cat):
构造方法:无参,带参;
重写方法:跳高();吃饭();
- 定义具体的狗类(Dog):
构造方法:无参,带参;
重写方法:跳高();吃饭();
- 定义测试类(AnimalDemo),写代码测试。
代码演示:
public abstract class Animal {
private String name;
private int age;
//无参
public Animal() {
}
//带参
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
//get/set方法
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;
}
//抽象方法
public abstract void eat();
}
interface Jumpping {
//抽象类方法
void jump();
}
class Cat extends Animal implements Jumpping {
//给出无参带参/构造方法
public Cat() {
}
public Cat(String name, int age) {
super(name, age);
}
//重写jump方法
@Override
public void jump() {
System.out.println("猫猫经过训练学会了跳高");
}
//重写eat方法
@Override
public void eat() {
System.out.println("爱吃鱼");
}
}
class Dog extends Animal implements Jumpping{
//有参无参
public Dog() {
}
public Dog(String name, int age) {
super(name, age);
}
//重写get/set方法
@Override
public void jump() {
System.out.println("狗狗经过训练学会了跳高");
}
@Override
public void eat() {
System.out.println("爱吃骨头");
}
}
/*
测试类
*/
class AnimalDemo {
public static void main(String[] args) {
//无参,父类引用子类对象
Animal a = new Cat();
a.setName("加菲猫");
a.setAge(5);
System.out.print(a.getName()+","+a.getAge()+"岁");
a.eat();
//接口指向子类
// 可以写作:
// Jumpping j = new Cat();
// j.jump();或者:
Jumpping j = (Cat) a;
((Cat) a).jump();
//带参,父类引用子类对象
a = new Cat("布偶猫",3);
System.out.print(a.getName()+","+a.getAge()+"岁");
a.eat();
j.jump();
System.out.println("------------");
/*发现一个问题,接口只能调接口里面的方法
抽象类只能调抽象类有的方法,而我们以后用的时候
他不是按照父类引用子类对象、接口指向子类这两种方式来使用的。
因为Cat类里面继承自Animal并且实现了Jumpping接口
Cat里面的内容是最多的,所以一般来说我们直接写具体类对象:
*/
//无参
Cat c = new Cat();
c.setName("橘猫");
c.setAge(1);
System.out.print(c.getName()+","+c.getAge()+"岁");
c.eat();
c.jump();
//带参
Cat c1 = new Cat("小花猫",2);
System.out.print(c1.getName()+","+c1.getAge()+"岁");
c1.eat();
c1.jump();
System.out.println("------------");
//无参,父类引用子类对象
Animal d = new Dog();
d.setName("小黑");
d.setAge(4);
System.out.print(d.getName()+","+d.getAge()+"岁");
d.eat();
//接口指向子类
Jumpping j1 = (Dog) d;
j1.jump();
//带参,父类引用子类对象
d = new Dog("小黄",2);
System.out.print(d.getName()+","+d.getAge()+"岁");
d.eat();
//接口指向子类
j1.jump();
System.out.println("------------");
//此处与上面同理
//无参
Dog D = new Dog();
D.setName("旺财");
D.setAge(1);
System.out.print(D.getName()+","+D.getAge()+"岁");
D.eat();
D.jump();
//带参
Dog D1 = new Dog("招财",3);
System.out.print(D1.getName()+","+D1.getAge()+"岁");
D1.eat();
D1.jump();
}
}
案例:运动员和教练
需求:我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。为了出国交流,跟乒乓球相关的人员都需要学习英语。请用所学知识分析,这个案例中有哪些具体类,哪些抽象类,那些接口,并用代码实现。
分析:
具体事物:乒乓球运动员,篮球运动员;乒乓球教练,篮球教练,所以它们都是具体的类。
找出具体事物的共性:篮球运动员和乒乓球运动员都要学习它们的技能,它们都是运动员,所以可以提取出一个抽象的运动员类再提取出一个学习方法是抽象的;因为篮球运动员和乒乓球运动员它们学习的内容不一样,所以它们以后继承这个运动员类就可以了
同理,两个教练也可以提取出一个抽象的教练类,它们要教学员东西,所以可以提取出一个教的抽象方法,因为乒乓球教练和篮球教练教的内容是不同的。
然后不管教练还是运动员 它们都是人,人都具有一个共性的内容:姓名、年龄这样的成员变量,还有一个吃饭的抽象方法,(在这假设教练和运动员吃的东西是不一样的)。
然后它们因为要出国交流就需要学习英语,而学英语是一个抽象的行为:因为可能学会可能学不会,也有可能某些人不用学,有些人要学。
分析之后实现应该是从抽象到具体。(也就是做的时候应该先定义接口定义抽象人类、运动员类、教练类再写具体的子类或者叫实现类)
使用:使用的是具体的类的对象(因为具体类里面包含的内容才是最多的)
思路:
- 定义说英语的接口:
成员方法:说英语();
- 定义抽象人类:
成员变量:姓名,年龄;
构造方法:无参,带参;
成员方法:get/set方法,吃饭();
- 抽象教练类,继承人类:
构造方法:无参,带参;
成员方法:教();
- 抽象运动员类,继承人类:
构造方法:无参,带参;
成员方法:学习();
- 定义具体的篮球教练类,继承教练类:
构造方法:无参,带参;
成员方法:重写教(){…},重写吃饭(){…}。
- 定义具体的乒乓球教练,继承教练类实现说英语接口:
构造方法:无参,带参;
成员方法:重写教(){…},重写吃饭(){…},重写说英语(){…}。
- 定义具体的篮球运动员类,继承运动员类:
构造方法:无参,带参;
成员方法:重写学习(){…},重写吃饭(){…}。
- 定义具体的乒乓球运动员类,继承运动员类:
构造方法:无参,带参;
成员方法重写吃饭(){…},重写学习(){…},重写说英语(){…}。
- 最后要有一个测试类写代码进行测试
代码演示:
/*
1.定义英语接口
*/
public interface English {
//说英语的抽象方法
void sayEnglish();
}
/*
2.定义抽象人类
人要有名字、年龄
人要吃饭
*/
abstract class People {
//3.成员变量名字、年龄
private String name;
private int age;
//4.无参带参
public People() {
}
public People(String name, int age) {
this.name = name;
this.age = age;
}
//5.get/set方法
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;
}
//6.eat吃饭方法
public abstract void eat();
}
/*
7.定义抽象教练
继承人类
*/
abstract class Coach extends People{
//8.无参带参构造方法
public Coach() {
}
public Coach(String name, int age) {
super(name, age);
}
//9.特有的教人方法
public abstract void tech();
}
/*
10.定义抽象运动员类
继承人类
*/
abstract class Athletes extends People {
//11.无参带参构造方法
public Athletes() {
}
public Athletes(String name, int age) {
super(name, age);
}
//12.特有的学习方法
public abstract void study();
}
/*
13.定义具体的篮球教练类
继承教练类,教练继承人所以要重写两个方法
*/
class Basketball_Coach extends Coach{
//14.无参带参构造方法
public Basketball_Coach() {
}
public Basketball_Coach(String name, int age) {
super(name, age);
}
//15.重写写吃饭和教的方法
@Override
public void eat() {
System.out.println("篮球教练吃羊肉,喝牛奶");
}
@Override
public void tech() {
System.out.println("篮球教练教运球和投篮");
}
}
/*
16.定义具体的乒乓球教练
继承教练类
乒乓球教练会说会说英语
*/
class Table_Tennis_Coach extends Coach implements English{
//17.无参带参构造方法
public Table_Tennis_Coach() {
}
public Table_Tennis_Coach(String name, int age) {
super(name, age);
}
//18.重写eat和tech方法和English方法
@Override
public void eat() {
System.out.println("乒乓球教练吃小龙虾,喝矿泉水");
}
@Override
public void tech() {
System.out.println("乒乓球教练教如何发球和接球");
}
@Override
public void sayEnglish() {
System.out.println("乒乓球教练说英语");
}
}
/*
19.定义具体的篮球运动员类
继承运动员类
*/
class Basketball_Player extends Athletes{
//20.无参带参构造方法
public Basketball_Player() {
}
public Basketball_Player(String name, int age) {
super(name, age);
}
//21.重写eat和study方法
@Override
public void eat() {
System.out.println("篮球运动员吃回锅肉,喝牛奶");
}
@Override
public void study() {
System.out.println("篮球运动员学习如何运球和投篮");
}
}
/*
22.定义具体的乒乓球运动员类
继承运动员类
乒乓球运动员会说英语
*/
class Table_Tennis_Player extends Athletes implements English{
//23.无参带参构造方法
public Table_Tennis_Player() {
}
public Table_Tennis_Player(String name, int age) {
super(name, age);
}
//24.重写eat、study、sayEnglish方法
@Override
public void eat() {
System.out.println("乒乓球运动吃鸡胸肉,喝小米粥");
}
@Override
public void study() {
System.out.println("乒乓球运动员学如何发球和接球");
}
@Override
public void sayEnglish() {
System.out.println("乒乓球运动员说英语");
}
}
/*
测试类
*/
class Demo {
public static void main(String[] args) {
System.out.println("---------乒乓球教练-------");
//25.无参形式
//26.创建乒乓球教练对象
Table_Tennis_Coach ttt = new Table_Tennis_Coach();
ttt.setName("孔令辉");
ttt.setAge(47);
System.out.print(ttt.getName()+","+ttt.getAge()+"岁");
ttt.eat();
ttt.tech();
ttt.sayEnglish();
System.out.println("---------乒乓球运动员-------");
//27.创建乒乓球运动员对象
Table_Tennis_Player ppp = new Table_Tennis_Player();
ppp.setName("张继科");
ppp.setAge(34);
System.out.print(ppp.getName()+","+ppp.getAge()+"岁");
ppp.eat();
ppp.study();
ppp.sayEnglish();
System.out.println("---------篮球教练-------");
//28.创建篮球教练对象
Basketball_Coach bb = new Basketball_Coach();
bb.setName("杜锋");
bb.setAge(41);
System.out.print(bb.getName()+","+bb.getAge()+"岁");
bb.eat();
bb.tech();
System.out.println("---------篮球运动员-------");
//29.创建篮球运动员对象
Basketball_Player pp = new Basketball_Player();
pp.setName("郭艾伦");
pp.setAge(36);
System.out.print(pp.getName()+","+pp.getAge()+"岁");
pp.eat();
pp.study();
System.out.println("---------乒乓球教练-------");
//30.带参形式
//31.创建具体乒乓球教练类对象
Table_Tennis_Coach ttc = new Table_Tennis_Coach("刘国梁",43);
System.out.print(ttc.getName()+","+ttc.getAge()+"岁");
ttc.eat();ttc.tech();ttc.sayEnglish();
System.out.println("---------乒乓球运动员-------");
//32.创建具体乒乓球运动员对象
Table_Tennis_Player ttp = new Table_Tennis_Player("张怡宁",28);
System.out.print(ttp.getName()+","+ttp.getAge()+"岁");
ttp.eat();ttp.study();ttp.sayEnglish();
System.out.println("---------篮球教练-------");
//33.创建具体篮球教练对象
Basketball_Coach bc = new Basketball_Coach("姚明",48);
System.out.print(bc.getName()+","+bc.getAge()+"岁");
bc.eat();bc.tech();
System.out.println("---------篮球运动员-------");
//34.创建具体篮球运动员
Basketball_Player bp = new Basketball_Player("周琦",31);
System.out.print(bp.getName()+","+bp.getAge()+"岁");
bp.eat();bp.study();
}
}