接口与类是一种并列的关系,接口可以理解为一种特殊的类,接口中全部是由全局常量和公共的抽象方法所组成。接口是解决Java无法使用多继承的一种手段,但是接口在实际中更多的作用是制定标准的。
举个栗子:
下面4个实例除了具有一些自己特有的属性(如老鹰:颜色,年龄等,战斗机:型号,大小等),它们还有一些共有的特性,在只涉及到继承知识点时,“飞”作为下面4个实例的“共性”,最好就是将飞设为一个父类或是抽象类,实例类中重写父类中的“飞”方法,从而实现“飞”;
然而,继承是单一继承的,现在,老鹰这一类的实例,不仅具有“飞”的行为,还具有“攻击”这一行为,使用继承是肯定不可以实现这个要求的,因此就可以用接口来实现;
将“飞”和“攻击”写为两个接口,接口是可以多实现的,就可以实现上面的要求。
jdk1.7之前接口中只能定义全局常量和抽象方法(本篇文章以此为准)
jdk1.8后,除了定义7中的,还有了一些新的特性,还可以定义静态方法和默认方法(default)了
package com.stx.sn.myinterface.demo1;
// 创建了一个飞的接口
public interface Fly {
public abstract void fly();
}
package com.stx.sn.myinterface.demo1;
// 创建了一个攻击的接口
public interface Attack {
public abstract void attack();
}
package com.stx.sn.myinterface.demo1;
// 创建一个飞机实例实现上面两个接口
public class Plane implements Fly,Attack {
private String model;
public Plane(String model) {
this.model = model;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
@Override
public void attack() {
System.out.println("飞机--攻击");
}
@Override
public void fly() {
System.out.println("飞机--飞");
}
}
接口中是抽象方法,所以需要重写接口中的方法;
如果一个类去实现接口,若实现了接口中的所有抽象方法,则这个类才可以实例化,否则这个类也必须是一个抽象类
为什么继承只能是单继承,而接口可以多实现?
public class Father {
public void money(){
System.out.println("Father--money");
}
}
public class Mother {
public void money(){
System.out.println("Mother--money");
}
}
这里创建了两个类,一个Father类,一个Mother类,下面再创建一个Son类去同时继承这两个类
编译直接报错,这就说明了不可以多继承,若为多继承,那么当多个父类中有重复的属性或者方法时,子类的调用会含糊不清,不知道调用哪一个,因此就报错了。
而接口中,定义的方法是抽象方法,抽象方法必须被重写,就不存在不知道调用哪个的问题,因此可以多实现。