接口的定义及使用
如果相对外部隐藏全部的实现细节,就要通过接口来实现。
接口的定义
使用interface关键字来定义。由于接口描述的是一个公共的定义标准,所以在接口之中所有的抽象方法的访问权限都为public
interface IMessage{ // 为了区分接口,接口名称前要加大写字母 I
public static final String INFO = "HelloWorld"; // 全局常量
public abstract String getInfo(); // 抽象方法
}
接口的实现
- 接口需要被子类是按(implements),一个子类可以实现多个父接口;
- 子类(如果不是抽象类)那么一定要覆写接口之中的全部抽象方法;
- 接口对象可以利用子类对象的向上转型进行实例化。
class MessageImpl implements IMessage {
public String getInfo(){
return "得到一个消息。";
}
}
多接口实现
在java中的主要目的是:一个子类可以实现多个接口(多继承)
interface IMessage{ // 为了区分接口,接口名称前要加大写字母 I
public static final String INFO = "HelloWorld"; // 全局常量
public abstract String getInfo(); // 抽象方法
}
interface IChannel {
public abstract boolean connect();
}
class MessageImpl implements IMessage,IChannel {
public String getInfo(){
return "得到一个消息。";
}
public boolean connect() {
System.out.println("消息发送通道已建立。");
}
}
接口与接口,接口与Object的关系
实现了两个接口的子类,其实例化对象,可以向上转型为两个接口对象。
接口的多继承
interface IService extends IMessage,IChannel {
public String service();
}
实际开发
实际开发中,接口的使用有三种形式:
- 进行标准设置
- 表示一种操作的能力
- 暴露远程方法视图,这个一般都在RPC分布式开发中使用。
接口定义加强
假如当接口下的子类都需要新增 某一个相同的方法时,此时若子类数量很多,会造成代码修改成本增大。
对于该种情况,正确的方式是:子类在不应该直接实现该接口,而是中级使用一个抽象类进行过渡,由此便可以在抽象类中定义这样一个相同的普通方法了。
虽然在JDK的后续版本中支持了直接在接口中定义普通方法,甚至是static方法,但是其不应该作为接口的主要设计原则。
我们所写的代码中依然应该奉行:接口就是抽象方法的集合
使用接口定义标准
对于接口而言在开发之中最为重要的应用就是进行标准的制定。
例如:电脑的USB口,就接收符合USB标准的输入,而不关心USB的外设是键盘、鼠标、打印机…