1. interface1
可以使用interface关键字来声明一个接口,在Java中,接口不是类,而可以理解为对希望符合这个接口的类的一组要求。
接口允许创建者为类建立方法的形式,而不需要实现它。(在Java8之前,绝对不能在接口中实现方法)。
下面定义了一个Instrument接口:
interface Instrument{
void play();
void adjust();
String what();
}
可以看到,不需要实现接口中的方法。
接口不是类,不能使用new运算符来实例化一个接口,但是可以声明一个接口类型的变量:
Instrument x;
x = new Piano();
接口变量必须引用实现了这个接口的对象。
2. 接口的继承和实现
可以通过extends关键字使得一个接口继承另一个接口的方法。
通常情况下,extends关键字后面只能继承一个类,但用于接口时,可以使一个接口继承多个接口,例如下面的Moba接口
interface ComputerGame{
void play();
String getName();
}
interface MultiplayerGame extends ComputerGame{
void teammate();
}
interface OnlineGame extends ComputerGame{
boolean online();
}
interface Moba extends MultiplayerGame,OnlineGame{
}
使用implements关键字来使某个类实现接口。如果一个类要实现一个接口,那么就必须实现这个接口中所有的未定义的方法(后面可以看到可以使用default关键字为接口中的方法提供一个默认实现)。
class LOL implements Moba{
@Override
public void play() {
}
@Override
public String getName() {
return "LOL";
}
@Override
public void teammate() {
}
@Override
public boolean online() {
return false;
}
}
一个类可以实现多个接口,即implements后面可以跟多个接口,而extends关键字后面只能跟一个类。当一个类既继承了另一个类也实现了接口时,应该把extends关键字放在前面,implements关键字放在后面。
接口中定义的方法都默认是public的,不需要在定义时自己用public方法修饰(Java9后,接口中的方法可以使用private修饰)
3. 接口中的字段
在接口中可以定义常量字段,甚至可以只定义常量字段而不定义方法。
interface Months{
int JANUARY = 1,FEBRUARY = 2,MARCH = 3,APRIL = 4,
MAY = 5,JUNE = 6,JULY = 7,AUGUST = 8,
SEPTEMBER = 9,OCTOBER = 10,NOVEMBER = 11,DECEMBER = 12;
}
但是,接口中绝对不能存在实例字段,虽然可以如下定义:
interface ComputerGame{
void play();
String getName();
int i = 0;
}
看起来i是一个实例字段,但是很可惜,与接口中的方法默认被public修饰一样,接口中的字段默认被public static final修饰,也就是说接口中的字段默认是常量。只要你把i = 0的 = 0部分去掉,就会报错,告诉你未初始化。
4. 接口和抽象类
使用接口的好处是显而易见的:Java不支持多重继承,extends关键字后面只能跟一个类,而一个类可以实现多个接口。这样既得到了“多重继承”带来的大多数好处,也避免了多重继承的复杂性。
5. 默认方法
通过在接口中对一个方法使用default关键字进行修饰,就可以在接口中对这个方法进行实现,这样,有些使用不到这个接口的某个方法的类就不需要自己去实现这个方法了。
Iterator接口中的remove方法就是一个默认方法,默认抛出UnsupportedOperationException异常。如果你实现的迭代器是一个只读的迭代器,不需要使用到remove操作,那就不用自己去实现它。
文章内容参考自《Java核心技术》,网络以及自己的思考,主要作为自己整理的笔记使用。理解上表达上可能存在错误,欢迎指正。 ↩︎