由于java的继承支持单一继承,不支持多继承,所以在接口的使用在java中要多于继承,现在介绍一个关于继承和接口的综合例题
请用代码描述:
在动物园每一个动物都有颜色和年龄,都会吃
所有老虎都吃肉,但是有的老虎会表演(钻火圈)
所有的大猩猩都吃香蕉,但有大猩猩会表演(骑自行车)
所有的鹦鹉都吃小米和说话,但是有的鹦鹉会表演(过跷跷板)
在动物园中管理员有年龄和姓名,他会喂动物和组织会表演的动物进行演出,如果演出时鹦鹉,还会让鹦鹉说你好
操作步骤
/*
定义动物类(Animal)
属性:颜色(color),年龄(age)
抽象方法: 吃(eat)
提供: 空参,带参构造;setters和getters方法
*/
publicabstractclass Animal {
// 属性:颜色(color),年龄(age)
private String color;
privateintage;
// 抽象方法: 吃(eat)
publicabstractvoid eat();
// 提供: 空参,带参构造;setters和getters方法
public Animal() {
super();
}
public Animal(String color, intage) {
super();
this.color = color;
this.age = age;
}
public String getColor() {
returncolor;
}
publicvoid setColor(String color) {
this.color = color;
}
publicint getAge() {
returnage;
}
publicvoid setAge(intage) {
this.age = age;
}
}
/*
定义表演者接口(Actor)
抽象方法: play()
*/
publicinterface Actor {
// 表演
publicabstractvoid play();
}
/*
定义老虎类(Tiger),继承动物类(Animal)
实现抽象方法: 吃(eat)
输出格式: 2岁的黄色老虎吃肉
提供: 空参,带参构造;
*/
publicclass Tiger extends Animal {
//实现抽象方法: 吃(eat)
// 输出格式: 2岁的黄色老虎吃肉
publicvoid eat(){
System.out.println(getAge()+"岁的"+getColor()+"老虎吃肉");
}
//提供: 空参,带参构造;
public Tiger() {
super();
}
public Tiger(String color, intage) {
super(color, age);
}
}
/*
定义会表演的老虎类(ActedTiger),继承老虎类(Tiger),实现表演者接口
实现抽象方法表演(play)
输出格式: 2岁的黄色老虎在表演钻火圈
提供: 空参,带参构造;
*/
publicclass ActedTiger extends Tiger implements Actor{
//实现抽象方法表演(play)
// 输出格式: 2岁的黄色老虎在表演钻火圈
publicvoid play(){
System.out.println(getAge()+"岁的"+getColor()+"老虎在表演钻火圈");
}
//提供: 空参,带参构造;
public ActedTiger() {
super();
}
public ActedTiger(String color, intage) {
super(color, age);
}
}
/*
定义大猩猩类(Gorilla),继承动物类(Animal)
实现抽象方法: 吃(eat)
输出格式: 3岁的黑色大猩猩吃香蕉
提供: 空参,带参构造;
*/
publicclass Gorilla extends Animal {
//实现抽象方法: 吃(eat)
// 输出格式: 3岁的黑色大猩猩吃香蕉
publicvoid eat(){
System.out.println(getAge()+"岁的"+getColor()+"大猩猩吃香蕉");
}
//提供: 空参,带参构造;
public Gorilla() {
super();
}
public Gorilla(String color, intage) {
super(color, age);
}
}
/*
定义会表演的大猩猩(ActedGorilla),继承大猩猩类(Gorilla),实现表演者接口
实现抽象方法表演(play)
输出格式: 3岁的黑色大猩猩在表演骑自行车
提供: 空参,带参构造;
*/
publicclass ActedGorilla extends Gorilla implements Actor {
//实现抽象方法表演(play)
// 输出格式: 3岁的黑色大猩猩在表演骑自行车
publicvoid play(){
System.out.println(getAge()+"岁的"+getColor()+"大猩猩在表演骑自行车");
}
//提供: 空参,带参构造;
public ActedGorilla() {
super();
}
public ActedGorilla(String color, intage) {
super(color, age);
}
}
/*
定义鹦鹉类(Parrot),继承动物类(Animal)
实现抽象方法: 吃(eat)
输出格式: 1岁的绿色鹦鹉在吃小米
特有方法: 说话(say)
输出格式: 1岁的绿色鹦鹉在说你好
提供: 空参,带参构造;
*/
publicclass Parrot extends Animal {
//实现抽象方法: 吃(eat)
// 输出格式: 1岁的绿色鹦鹉在吃小米
publicvoid eat(){
System.out.println(getAge()+"岁的"+getColor()+"鹦鹉在吃小米");
}
//特有方法: 说话(say)
// 输出格式: 1岁的绿色鹦鹉在说你好
publicvoid say(){
System.out.println(getAge()+"岁的"+getColor()+"鹦鹉在说你好");
}
//c)提供: 空参,带参构造;
public Parrot() {
super();
}
public Parrot(String color, intage) {
super(color, age);
}
}
/*
定义会会表演的鹦鹉类(ActedParrot),继承鹦鹉类(Parrot),实现表演者接口
实现抽象方法表演(play)
输出格式: 1岁的绿色鹦鹉在表演过跷跷板
提供: 空参,带参构造;
*/
publicclass ActedParrot extends Parrot implements Actor {
//实现抽象方法表演(play)
// 输出格式: 1岁的绿色鹦鹉在表演过跷跷板
publicvoid play(){
System.out.println(getAge()+"岁的"+getColor()+"鹦鹉在表演过跷跷板");
}
//提供: 空参,带参构造;
public ActedParrot() {
super();
}
public ActedParrot(String color, intage) {
super(color, age);
}
}
/*
定义动物园管理员类(ZooManager)
属性:姓名(name),年龄(age)
行为:
喂养动物(feed(Animal a)),调用吃的方法;
请思考此处为什么使用Animal作为参数类型而不是其子类
在方法内部,调用a对象的eat方法
组织演出(letItShow(Actor a))
请思考此处为什么使用Actor接口类型作为参数类型而不是其实现类
在方法内部
调用a的play方法
如果是鹦鹉,把a向下转型为Parrot类型,调用说话方法
提供空参,有参构造方法与setters和getters方法
*/
publicclass ZooManager {
// 属性:姓名(name),年龄(age)
private String name;
privateintage;
// 行为:
// 喂养动物(feed(Animal a)),调用吃的方法;
// 请思考此处为什么使用Animal作为参数类型而不是其子类
// 在方法内部,调用a对象的eat方法
publicvoid feed(Animal a){
a.eat();
}
// 组织演出(letItShow(Actor a))
// 请思考此处为什么使用Actor接口类型作为参数类型而不是其实现类
// 在方法内部
// 调用a的play方法
// 如果是鹦鹉,把a向下转型为Parrot类型,调用说话方法
publicvoid letItShow(Actor a){
// 调用a的play方法
a.play();
// 如果是鹦鹉,把a向下转型为Parrot类型,调用说话方法
if(ainstanceof Parrot){
Parrot p = (Parrot) a;
p.say();
}
}
// 提供空参,有参构造方法与setters和getters方法
public ZooManager() {
super();
}
public ZooManager(String name, intage) {
super();
this.name = name;
this.age = age;
}
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getAge() {
returnage;
}
publicvoid setAge(intage) {
this.age = age;
}
}
/*
定义测试类Test
提供main方法
在main方法
创建会表演的老虎类(ActedTiger)对象t,把颜色赋值为黄色,年龄赋值为2
创建会表演的大猩猩(ActedGorilla)对象g,把颜色赋值黑色,年龄赋值为3
创建会表演的鹦鹉类(ActedParrot)对象 p,把颜色赋值为绿色,年龄赋值1
创建物园管理员类(ZooManager)对象zm,把名称赋值邓超,年龄赋值30
调用zm对象的喂养动物(feed(Animala))方法,分别传入t,g,p对象
调用zm对象的组织表演(letItShow(Actora))方法,分别传入t,g,p对象
*/
publicclass Test {
publicstaticvoid main(String[] args) {
// 创建会表演的老虎类(ActedTiger)对象t,把颜色赋值为黄色,年龄赋值为2
ActedTiger t = new ActedTiger();
t.setAge(2);
t.setColor("黄色");
// 创建会表演的大猩猩(ActedGorilla)对象g,把颜色赋值黑色,年龄赋值为3
ActedGorilla g = new ActedGorilla();
g.setAge(3);
g.setColor("黑色");
// 创建会表演的鹦鹉类(ActedParrot)对象 p,把颜色赋值为绿色,年龄赋值1
ActedParrot p = new ActedParrot("绿色", 1);
// 创建物园管理员类(ZooManager)对象zm,把名称赋值邓超,年龄赋值30
ZooManager zm = new ZooManager("邓超", 30);
// 调用zm对象的喂养动物(feed(Animala))方法,分别传入t,g,p对象
zm.feed(t);
zm.feed(g);
zm.feed(p);
// 调用zm对象的组织表演(letItShow(Actora))方法,分别传入t,g,p对象
zm.letItShow(t);
zm.letItShow(g);
zm.letItShow(p);
}
}