正如类之间可以继承,一个接口也可以继承另一个接口。Java为了避免多重继承带来的基类方法调用冲突的问题,Java只允许类的单继承,但允许接口的多继承。
1、接口的继承:更应该称为扩展。
(1)Animal.java:定义一个Animal接口
package com.test;public interface Animal {void bark(); //等价于public abstract void bark();void move(); //等价于public abstract void move();
}
(2)FlyableAnimal.java,
package com.test;public interface FlyableAnimal extends Animal{void fly();
}
接口FlyableAnimal继承了接口Animal,扩展了Animal接口,增加了可飞行的动物应该具备的特征。陆地上的动物(类)可以实现Animal接口,而飞禽可以实现FlyableAnimal接口。
2、接口的多继承:
(1)AnimalToys.java
package com.test;interface Speakable {void say();
}
public interface AnimalToys extends Animal,Speakable{//...
}
例如,有一个玩具厂商生产了一种会说话的动物玩具,有各种各样的动物。那么我们就可以定义一个动物玩具接口AnimalToys接口,让它继承Animal接口,从而具备了动物的行为特征。人是可以说话的,但是要让动物玩具继承人或者实现人接口不合情理。为此,单独定义一个Speakable接口,在该接口中声明一个say()方法。根据Java的接口可以多继承,上面代码中AnimalToys接口也继承了Speakable接口。
3、接口的实现:
类在实现接口时,也可以同时实现多个接口。飞行的行为具有通用性,并不限于飞禽飞机等,例如玩具飞机也可以飞,下面定义了一个Flyable接口,在该接口中声明fly()方法,如下:
package com.test;public interface Flyable {void fly();
}
下面代码,编写了一个Bird类,它是动物,又会飞,因此可以让Bird类同时实现Animal接口和Flyable这两个接口,如下:
package com.test;public class Bird implements Animal,Flyable{public void bark() {System.out.println("Bird singing.");}public void move() {System.out.println("Bird jump.");}public void fly() {System.out.println("Bird fly.");}public static void main(String[] args) {Bird bird = new Bird();bird.bark();bird.move();bird.fly();}
}
Bird类实现了接口Animal中定义的bark()和move()方法,及实现了Flyable接口中定义的fly()方法。
一个知识点:
在Java中,当一个接口继承另一个接口时,通常不需要显式地在子接口中导入(import)父接口。这是因为在同一个包中,接口之间的可见性是默认的,也就是说,它们可以自动地访问彼此的成员。因此,接口A可以直接继承接口B,而不需要在接口A中导入接口B。
如果子接口和父接口不在同一个包,子类需要导入父接口,才能继承(extends)。