抽象类有单继承局限,在java中想要避免单继承局限,又想使用抽象方法,用接口。
1.接口的基本概念
接口就是抽象方法和全局常量的集合(JDK8之前)
定义接口:
interface IMessage{
//全局常量
public static final String MSG="bonjour"; //IMessage.MSG
//抽象方法
public abstract void print();
}
- 接口优先原则:在一个操作中既可以使用抽象类又可以使用接口的时候,优先考虑接口。
- 接口使用interface关键字定义
- 接口命名规范:接口前加 I 来区分接口与类
- 子类可以实现多个接口(使用implements关键字),使用接口来实现多继承
- 子类的实例化对象可以向上转型为任意接口类型
- 一般使用接口名+Impl来命名子类
代码示例:
public class Test7{
public static void main(String[] args){
//接口中的所有抽象方法都被子类覆写,具有多态性
//使用向上转型,达到参数统一化、标准化
IMyInterface myInterface = new MyInterfaceImpl();
myInterface.test();
//父接口间的相互转换
//INews与IMyInterface通过共同子类——MyInterfaceImpl进行相互转换
INews news = (INews)myInterface;
news.getNews();
}
}
class MyInterfaceImpl implements IMyInterface,INews{
public void test(){
System.out.println(MSG);
}
public void getNews(){
System.out.println(MSG);
}
}
interface IMyInterface{
public static final String MSG="bonjour";
public abstract void test();
}
interface INews{
public abstract void getNews();
}
2.接口使用限制
-
2.1 访问权限
- 接口中只有public权限
接口中定义的变量,实际就是全局常量,默认public static final
接口中定义的方法默认为public abstract
-
阿里编码规约:接口中方法和属性不加任何修饰符,public也不加,保证代码简洁性
-
2.2 子类继承抽象类和实现接口
- 子类可以先使用extends继承一个抽象类,后使用implements实现多个接口。
- 先继承再实现原因:继承为单继承,实现为多实现。
-
2.3 抽象类实现接口
- 抽象类可以使用implements实现多个接口,但是接口不能extends继承抽象类(接口中的方法只有抽象方法,而抽象类中的方法有普通方法、构造方法、抽象方法)
- 抽象类实现接口可以选择性的覆写接口中的抽象方法
代码示例:
public class Test16{
public static void main(String[] args){
//子类可以实现多个接口,子类的实例化对象可以向上转型为任意接口类型
QQMessage qq =new QQMessage();
IMessage qq2 = new QQMessage();
IPlatform qq3 = new QQMessage();
qq.print();
//类型之间转换:编译阶段、运行阶段
//为了让msn实现supportPlateform()方法,将msn强转为IPlatform类型
//运行时,msn在内存空间上创建一个MSNMessage对象
//如果msn instanceof IPlatform为true,则可运行通过;为false,则CCE
//编译时,msn为IMessage类型,只要强转为IPlatform,则编译通过
IPlatform platform = (IPlatform)qq3; //相当于IPlatform platform = new QQMessage();
platform.supportPlateform();
QQMessage qqmessage = (QQMessage)qq2;
qqmessage.printCompany();
}
}
//子类可以实现多个接口
//子类可以继承抽象类(类),先extends,再implements
//接口的实现类,要实现接口的抽象方法
//虽然抽象类Company已经实现了IMessage接口,但是此处仍可以再写一遍,强调当前类是IMessage的子类
class QQMessage extends Company implements IMessage,IPlatform{
public void print(){
System.out.println("这是QQMessage");
}
public void supportPlateform(){
System.out.println("QQ支持Windows和Macos平台");
}
public void printCompany(){
System.out.println("Tencent出品");
}
}
//抽象类实现接口
abstract class Company implements IMessage{
public abstract void printCompany();
}
interface IMessage{
//全局常量
//接口中定义的变量,实际就是全局常量
//默认public static final
String MSG="bonjour"; // IMessage.MSG
//抽象方法
//接口中定义的方法默认为public
void print();
}
interface IPlatform{
void supportPlateform();
}
-
2.4 接口继承接口
- 一个接口可以使用extends继承多个父接口。
代码示例:
public class Test{
public static void main(String[] args){
}
}
class D implements C{
public void test1();
public void test2();
public void test3();
}
interface A{
void test1();
}
interface B{
void test2();
}
interface C extends A,B{
void test3();
}
3.接口的应用
a.定义操作标准(USB2.0标准)
b.表示一种能力,进行一项操作
c.在分布式开发中暴露远程服务方法
代码示例:
public class Test8{
public static void main(String[] args){
Computer computer = new Computer();
computer.use(new Mouse());
computer.use(new Keyboard());
}
}
//定义USB子类
class Mouse implements USB{
public void plugIn(){
System.out.println("将鼠标接收器插入电脑");
}
public void setup(){
System.out.println("安装鼠标驱动");
}
public void work(){
System.out.println("鼠标使用");
}
}
class Keyboard implements USB{
public void plugIn(){
System.out.println("将键盘接收器插入电脑");
}
public void setup(){
System.out.println("安装键盘驱动");
}
public void work(){
System.out.println("键盘使用");
}
}
//定义电脑类
class Computer{
public void use(USB usb){
usb.plugIn();
usb.setup();
usb.work();
}
}
//定义USB标准
interface USB{
//插入
void plugIn();
//安装驱动
void setup();
//工作
void work();
}