一.引入
在Java中由于继承只支持单继承,为了实现类似于多重继承的效果,Java提供了接口来拓展类的功能,以弥补了Java中单继承的缺点。
二.接口的语法
(一).接口定义
[ public ] interface interfaceName [extends superInterfaceList]{
常量属性
抽象方法
}
注意:
1、关键字interface;
2、接口中的方法只有声明,没有定义(没有方法体);
3、接口中的所有属性:默认的修饰符是 public static final
4、接口中的所有方法:默认的修饰符是 public abstract
示例:
public interface MyInterface {
int age = 20;
// 属性默认的修饰符是 public static final
void eat();
// 方法默认的修饰符是 public abstract
void sleep();
}
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
(二).接口实现
类与类之间有继承关系,但是接口与类之间的关系叫做实现。类实现接口使用关键字implement,一个类可以实现一个或多个接口;假若实现了多个接口,每个接口之间使用逗号隔开。
1.单接口实现
这里实现了上述中的接口:
public class MyInterfaceClass implements MyInterface{
@Override
public void eat() {
// 实现MyInterface中声明的eat()方法
System.out.println("这是实现了MyInterface中声明的eat()方法");
}
@Override
public void sleep() {
// 实现MyInterface中声明的sleep()方法
System.out.println("这是实现了MyInterface中声明的sleep()方法");
}
}
2.多接口实现
多接口的实现就是在一个类中实现多个接口,在implement子句中用逗号将其分隔。
例如:有接口A、B、C,类D实现了A、B、C:
接口A:
public interface A {
void printA();
}
接口B:
public interface B {
void printB();
}
接口C:
public interface C {
void printC();
}
实现接口类D:
public class D implements A,B,C{
@Override
public void printC() {
System.out.println("这是实现接口C中的方法");
}
@Override
public void printB() {
System.out.println("这是实现接口B中的方法");
}
@Override
public void printA() {
System.out.println("这是实现接口A中的方法");
}
}
三.接口继承
接口是支持多重继承的,即一个接口可以有多个父接口。
例如:定义接口A、B、C,接口D继承A、B、C同时定义D中的方法:
接口A:
public interface A {
void printA();
}
接口B:
public interface B {
void printB();
}
接口C:
public interface C {
void printC();
}
接口D:
public interface D extends A,B,C{
//一个接口继承多个接口
void printD();//D中的方法
}
现在,在接口D中继承了接口A,B,C;同时定义了printD;因此接口D中现在就有了四个方法(包括继承自接口中的方法)。
四.接口与抽象类
实现接口的类也可以使抽象类,这个类可以不实现接口中的方法,它把这些方法都作为自身的抽象方法。因此,在抽象类中可以不需要实现所有方法,可以留在子类中定义。
例如:
接口:
public interface MyInterface {
void print();
}
实现接口的抽象类:
public abstract class TestMyInterface implements MyInterface{
// 实现MyInterface的抽象类,自身不实现也不会编译出错。可以让其子类定义
}
继承自抽象类的类:
public class Test extends TestMyInterface{
@Override
public void print() {
// 继承自TestMyInterface类并且定义接口中的方法
// 这里如果不去定义接口中的方法,就会编译出错
}
}
五.接口应用
例一,Son继承了Father的财产,现在还需要继承Mother的财产,由于Java只支持单继承,只可以继承其中之一的财产。如果要实现两者都继承,那么就将Mother定义为接口,从而也获得了Mother的财产:
public class Father {
public double fatherMoney() {
return 9999999;
}
}
public interface Mother {
double motherMoney();
}
public class Son extends Father implements Mother{
@Override
public double fatherMoney() {
// Father的fatherMoney()方法
return super.fatherMoney();
}
@Override
public double motherMoney() {
// 实现month中的motherMoney()方法
return 8888888.8;
}
}
例二,Pencil继承了Pen的write方法,现在希望Pen还具有Eraser的clean功能;
我们将Eraser定义为接口,从而去扩展Pen的clean功能。
public class Pen {
void write() {
System.out.println("写字");
}
}
public interface Eraser {
void clean();
}
public class Pencil extends Pen implements Eraser{
@Override
void write() {
// 写字的功能
super.write();
}
@Override
public void clean() {
// 擦除功能
System.out.println("擦除");
}
}
六.接口总结
1、接口没有构造方法;
2、接口中定义的所有属性默认修饰是 public static final;
3、接口中定义的所有方法默认是 public abstract;
4、由于接口中的定义的所有方法都是抽象的,所以接口不能被实例化;
5、有抽象函数的不一定是抽象类,也可以是接口;
6、类可以通过implement实现接口,一个类可以实现多个接口;
7、如果类没有实现接口中的所有方法,那么类必须是抽象类;
8、如果在类中访问类接口中的属性,不能使用 super 关键字,因为两者之间没有继承关系。可以使用“接口名.属性名”访问。