1. 接口介绍
- 这里的接口指的是关键字的interface
- 接口的意义:是对不具有继承关系的同类行为的抽象,以便复用(多态的一种)
- 接口的方法是一种约束
2. 接口的定义
- 接口中所有的方法都是默认 public abstract,因此接口中的方法都是抽象的
- 接口中所有变量都是默认 public static final,因此接口中变量就相当于常量
public interface OperateCar {//接口只包含常量,抽象方法、默认方法和静态方法
int changeLanes(Direction direction,
double startSpeed,
double endSpeed);
int signalTurn(Direction direction,
boolean signalOn);
double E = 2.718282; // E就是个常量在这里
......
// more method signatures
}
3. 向接口添加方法
public interface DoIt {//原接口
void doSomething(int i, double x);
int doSomethingElse(String s);
}
1.创建一个原接口的子接口,在子接口中添加方法
public interface DoItPlus extends DoIt {
boolean didItWork(int i, double x, String s);
}
2.在原接口中将新方法定义为默认方法
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
default boolean didItWork(int i, double x, String s) {//默认方法:由default修饰的方法
...
}
}
- 在原接口中将新方法定义为静态方法
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
static boolean didItWork(int i, double x, String s) {//静态方法:由static修饰的方法
...
}
}
- 不要向接口添加抽象方法(如果有实现该接口的类),否则所有实现旧的原接口的类都将中断
- 第二,三种使您能够向原接口添加新功能,并确保与为未修改的原接口的编写的类能正常使用(而且这些类可以使用新功能)
4. 接口的实现
- 不能使用new来实例化一个接口
- 实现接口的类的实例方法优于接口的默认方法
public class FlyingCar implements OperateCar, FlyCar {
// ...
public int startEngine(EncryptedKey key) {
FlyCar.super.startEngine(key);//调用接口FlyCar的这个方法
OperateCar.super.startEngine(key);
}
}
}//使用接口的类必须实现其接口的所有方法,除非它是抽象类
5. 接口的继承
- 可以单继承和多继承
public interface GroupedInterface extends Interface1, Interface2, Interface3 {//多继承
double E = 2.718282;//E就是个常量
void doSomething (int i, double x);
int doSomethingElse(String s);
}
- 当你要继承的接口含有默认方法时:
- 不修改
- 将默认方法声明为抽象方法。
- 重写默认方法。
6. 接口作为类型
- 如果定义了一个类型为接口的引用变量,则分配给它的任何对象都必须是实现该接口的类的实例
- 可以在任何可以使用任何其他数据类型名称的地方使用接口名称
public Object findLargest(Object object1, Object object2) {
Relatable obj1 = (Relatable)object1;//Relatable是一个接口
Relatable obj2 = (Relatable)object2;
if ((obj1).isLargerThan(obj2) > 0)
return object1;
else
return object2;
}