- 继承VS接口
- 解决问题不同
- 接口比继承更加灵活
- 接口在一定程度上实现代码解耦 [ 即,接口规范性 + 动态绑定]
- 接口多态
public class ExtendVsInterface {
public static void main(String[] args) {
LittleMonkey WuKong = new LittleMonkey("悟空");
WuKong.climbing();
WuKong.swimming();
WuKong.flying();
}
}
class Monkey{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Monkey(String name) {
this.name = name;
}
public void climbing(){
System.out.println(name + "猴子会爬树...");
}
}
class LittleMonkey extends Monkey implements Fishable,Birdable{
public LittleMonkey(String name) {
super(name);
}
@Override
public void swimming() {
System.out.println(getName() + "通过学习,可以像鱼儿一样游泳...");
}
@Override
public void flying() {
System.out.println(getName() + "通过学习,可以像鸟儿一样飞行...");
}
}
interface Fishable{
void swimming();
}
interface Birdable{
void flying();
}
解决问题不同
继承的价值主要在于:
解决代码的复用性和可维护性
接口的价值主要在于:
设计。设计好各种规范(方法),让其它类去实现这些方法(即,更加的灵活)
接口比继承更加灵活接口比继承更加灵活,继承是满足 is - a的关系,接口只需满足 like - a的关系
1)多态参数
public class InterfacePolyParameter {
public static void main(String[] args) {
// 接口:接口类型的变量可以指向 实现了IF接口类的对象实例
IF if_01 = new Monster();
if_01 = new Car();
// 继承:父类类型的变量可以指向子类的对象实例
AAA a = new BBB();
a = new CCC();
}
}
interface IF{}
class Monster implements IF{}
class Car implements IF{}
class AAA{}
class BBB extends AAA{}
class CCC extends AAA{}
2)多态数组
public class InterfacePolyArr {
public static void main(String[] args) {
// 多态数组 -> 接口类型的数组
Usb[] usbs = new Usb[2];
usbs[0] = new Camera_();
usbs[1] = new Phone_();
for (int i = 0; i < usbs.length; i++) {
usbs[i].work(); //动态绑定
// 需要进行类型的向下转型
if (usbs[i] instanceof Phone_){ //判断运行类型是Phone_
((Phone_) usbs[i]).call();
}
}
}
}
interface Usb{
void work();
}
class Phone_ implements Usb{
public void call(){
System.out.println("手机打电话......");
}
@Override
public void work() {
System.out.println("手机工作中......");
}
}
class Camera_ implements Usb{
@Override
public void work() {
System.out.println("相机工作中......");
}
}
3)接口多态传递
public class InterfacePolyPass {
public static void main(String[] args) {
// 接口类型的变量可以指向实现了这个接口的类的对象实例
IG ig = new Teacher();
IH ih = new Teacher();
}
}
interface IH{
void ok();
}
interface IG extends IH{}
class Teacher implements IG{
@Override
public void ok() {
}
}



