一、接口
- 接口是一种数据类型,使用关键字interface定义,包含接口声明和接口体。
interface Printable {
}
- 接口体中包含常量的声明(没有变量)和抽象方法两部分。
- 接口体中所有常量的访问权限都是public,而且都是static常量(即允许省略public、final、static修饰符)。
- 接口体中所有的抽象方法的访问权限都是public(允许省略public abstract修饰符)。
interface Printable {
public static final int MAX = 100; //等价写法:int MAX = 100;
public abstract void add(); //等价写法:void add()
public abstract float sum(float x,float y);
}
二、实现接口
- 接口由类实现来使用接口中的方法,用关键字implements声明该类实现一个或多个接口。
class Dog extends Animal implements Eatable,Sleepable //Animal的子类Dog实现Eatable和Sleepable接口
- 若非抽象类实现了某个接口,那么这个类必须重写接口中所有方法,且方法一定要明显的用public修饰。
- 用户可以自定义接口,一个JAVA源文件可以由类和接口组成。
- 抽象类既可以重写接口中的方法,也可以直接拥有接口中的方法。
- 如果一个类实现了接口,那么在该类体中可以直接使用接口常量。
- 若接口关键字interface前加上public关键字,则是一个public接口,可被任何类实现;友好接口只被同包中的类实现。
- 若父类实现了某个接口,则子类也就实现了该接口。
- 接口可以被继承,通过extend声明子接口。
import java.io.*;
不仅引入java.io包中的类,同时引入了该包中的接口。
三、接口回调
- 接口可以声明接口变量,属于引用型变量,存放对象的引用。
- 实现了某个接口的类创建的对象,可以调用类实现的接口方法和类原有方法。
- 接口回调:把实现了某个接口的类创建的对象的引用赋值给该接口声明的接口变量,则该接口变量可调用被类实现的接口方法。
- 接口无法调用类中其他非接口方法。
四、理解接口
- 接口的思想在于它可以要求某些类有相同名称的方法,但方法的具体内容可以不同。
- 接口在要求一些类有相同名称的方法的同时,并不强迫这些类具有相同父类。
五、接口与多态
- 接口多态:不同的类在实现同一个接口时,能具有不同的实现形式,那么接口变量在回调接口方法时就可能具有多种形态。
六、接口参数
- 若一个方法的参数是接口类型,则可将实现该接口类的对象引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法。
七、abstract类与接口的比较
- 都可以有abstract方法。
- 接口只可以有常量;abstract类可以有常量和变量。
- abstract类也可以有非abstract方法,接口不可以。
- 抽象类将其抽象方法的实现交给其子类,而接口将其抽象方法的实现交给实现该接口的类。
习题6.4
public interface Animal {
void cry();
String getAnimalName();
}
public class Simulator {
void playSound(Animal animal) {
animal.cry();
animal.getAnimalName();
}
}
public class Dog implements Animal {
public void cry() {
System.out.println("汪汪");
}
public String getAnimalName() {
return "狗";
}
}
public class Cat implements Animal {
public void cry() {
System.out.println("喵喵");
}
public String getAnimalName() {
return "猫";
}
}
public class Application {
public static void main(String[] args) {
Simulator simulator = new Simulator();
simulator.playSound(new Dog());
simulator.playSound(new Cat());
}
}