第20 章 : 接口的定义与使用
87 接口基本定义
抽象类比普通类的
优势:可以对子类覆写方法控制,
缺点:涉及安全操作问题
接口:纯粹的抽象类,抽象方法和全局常量
JDK 1.8 Lambda
定义,接口名前加入字母I
interface I类名{}
1、接口需要被子类实现implements,一个子类可以实现多个父接口
2、子类如果不是抽象类,一定要覆写接口中全部抽象方法
3、接口对象可以利用子类对象的向上转型进行实例化
实现接口类增加后缀:Impl
// 定义接口 interface IMessage{ // 全局常量 public static final String NAME = "Tom" ; // 抽象方法 public abstract String getInfo() ; } interface IChanel{ // 抽象方法 public abstract boolean connect() ; } // 实现接口 class MessageImpl implements IMessage, IChanel{ public String getInfo() { return "hi " + NAME ; } public boolean connect() { return true; } } class Demo{ public static void main(String[] args) { IMessage message = new MessageImpl(); System.out.println(message.getInfo()); } }
利用接口,子类可以实现多实现
MessageImpl 是 IMessage, IChanel 两个接口的实现子类
接口不能继承父类
Object类对象可以接收所有数据类型
包括:基本数据类型,类对象,接口对象,数组
接口描述的公共定义标准,默认public, 覆写只能是public
以下两种写法等价
interface IMessage{ public static final String NAME = "Tom" ; public abstract String getInfo() ; } interface IMessage{ String NAME = "Tom" ; String getInfo() ; }
一个抽象类可以实现多个父接口
一个普通类可以继承一个抽象类,实现多个父接口, 先继承再实现
接口中可以省略 abstract, 抽象类中不能省略
// 定义接口 interface IMessage{ // 全局常量 public static final String NAME = "Tom" ; // 抽象方法 public abstract String getInfo() ; } interface IChanel{ // 抽象方法 public abstract boolean connect() ; } abstract class DatabaseAbstract{ public abstract boolean getConnect(); } // 单继承多实现 class MessageImpl extends DatabaseAbstract implements IMessage, IChanel{ public String getInfo() { return "hi " + NAME ; } public boolean connect() { return true; } public boolean getConnect(){ return true; } } class Demo{ public static void main(String[] args) { IMessage message = new MessageImpl(); System.out.println(message.getInfo()); } }
接口多继承
接口无法继承一个父类,可以继承多个父接口
// 定义接口 interface IMessage{ public abstract String getInfo() ; } interface IChanel{ public abstract boolean connect() ; } interface IServer extends IMessage, IChanel{ public abstract boolean getConnect(); } class MessageImpl implements IServer{ public String getInfo() { return ""; } public boolean connect() { return true; } public boolean getConnect(){ return true; } } class Demo{ public static void main(String[] args) { IMessage message = new MessageImpl(); } }
接口三种使用形式
1、进行标准设置
2、表示一种操作能力
3、暴露远程方法视图,一般在RPC分布式开发使用
88 接口定义加强
JDK < 1.8
如果接口设计不当,增加方法难以维护
增加过渡抽象类实现接口,再用子类继承抽象类
JDK >= 1.8
允许接口中定义普通方法
// 定义接口 interface IMessage{ public abstract String getInfo() ; } // 过渡抽象类 abstract class MessageImpl implements IMessage{ public abstract String getInfo(); // 扩充的新方法 public String getMessage(){ return "message" ; } } class Message extends MessageImpl{ public String getInfo(){ return "info"; } } class Demo{ public static void main(String[] args) { Message message = new Message(); System.out.println(message.getInfo()); // info // 调用新方法 System.out.println(message.getMessage()); // message } }
接口中增加default普通方法
// 定义接口 interface IMessage{ public abstract String getInfo() ; // 扩充的新方法 public default String getMessage(){ return "message" ; } } class Message implements IMessage{ public String getInfo(){ return "info"; } } class Demo{ public static void main(String[] args) { Message message = new Message(); System.out.println(message.getInfo()); // info // 调用新方法 System.out.println(message.getMessage()); // message } }
接口中可以增加static方法
// 定义接口 interface IMessage{ public abstract String getInfo() ; public static IMessage getInstance(){ return new Message(); } } class Message implements IMessage{ public String getInfo(){ return "info"; } } class Demo{ public static void main(String[] args) { IMessage message = IMessage.getInstance(); System.out.println(message.getInfo()); // info } }
接口中不建议使static 和default