概念
上一部分已经学过抽象类,接口的结构与抽象类分厂类似,而接口是比“抽象类”还“抽象”的“抽象类”,抽象类中还允许出现普通的方法,而接口中的方法全部都是抽象方法。接口全面地专业地实现了:规范和具体实现的分离。接口的本质是契约,就像我们人间的法律一样。制定好后大家都遵守。
接口与抽象类的具体不同:
1.接口的数据成员都是静态的,并且必须初始化。
2.接口中的方法必须全部声明为abstract的,也就是说接口不能想抽象累那样拥有普通的方法,接口的方法全部都是抽象方法。
接口的定义
格式:
[public]
interface
接口名 [
extends
父接口
1
,父接口
2
…] { //可以实现多继承
[public] [static][final] 数据类型 成员名=常量;
...
[public][abstract]返回值的数据类型 方法名(参数表);
}
详细说明:
1. 访问修饰符:只能是public或默认。
2. 接口名:和类名采用相同命名机制。
3. extends:接口可以多继承。
4. 常量:接口中的属性只能是常量,总是:public static final 修饰。不写也是(JAVA中的常量名一般全部大写)。
5. 方法:接口中的方法只能是:public abstract。 省略的话,也是public abstract。
接口的实现和引用
利用接口创建新类的过程称为接口的实现。接口的实现类似于继承,指数不使用extends关键字,而是在声明一个类的同时用implements关键字来实现一个接口。实现的语句格式为:
class <类名> implements 接口列表
{
...
}
要点:
1. 子类通过implements来实现接口中的规范。
2. 接口不能创建实例,但是可用于声明引用变量类型。
3. 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的。
public class TestInterface {
public static void main(String[] args) {
Volant volant = new Angel();
volant.fly();
System.out.println(Volant.FLY_HIGHT);
Honest honest = new GoodMan();
honest.helpOther();
}
}
/**飞行接口*/
interface Volant {
int FLY_HIGHT = 100; // 总是:public static final类型的;
void fly(); //总是:public abstract void fly();
}
/**善良接口*/
interface Honest {
void helpOther();
}
/**Angle类实现飞行接口和善良接口*/
class Angel implements Volant, Honest{
public void fly() {
System.out.println("我是天使,飞起来啦!");
}
public void helpOther() {
System.out.println("扶老奶奶过马路!");
}
}
/**好人卡**/
class GoodMan implements Honest {
public void helpOther() {
System.out.println("扶老奶奶过马路!");
}
}
class BirdMan implements Volant {
public void fly() {
System.out.println("我是鸟人,正在飞!");
}
}
接口的继承
与普通的类相似,接口也可以实现继承,在定义一个接口的时候可以声明是某个接口的子接口。
与普通的继承不同的是,一个接口可以有一个以上的父接口,他么之间用逗号隔开。子接口继承父接口中的所有变量与方法,子接口可以覆盖父接口中的变量和方法。
多继承
interface A {
void testa();
}
interface B {
void testb();
}
/**接口可以多继承:接口C继承接口A和B*/
interface C extends A, B {
void testc();
}
public class Test implements C {
public void testc() {
}
public void testa() {
}
public void testb() {
}
}
C接口同时继承了A和B接口,那么C接口的实现Test中就需要将A、B、C中的方法全部实现。
Java中是否有多继承?
答:Java的类只有单继承,没有多继承,但是Java的接口可以多继承。