文章目录
- 前言
- 接口
- 浅浅理解下接口
- 抽象类与接口的爱恨情仇
- 特点
- 接口的回调
- 抽象类和接口
- 相同之处
- 区别
前言
前文回顾 戳这里→java基础 之 抽象类
因为接口是对抽象类的一种延伸,所以请先了解一下抽象类会更好的理解接口哦
子类对抽象类叫继承,使用关键字extends;
子类对接口叫实现,使用关键字implement;
jdk1.8以前,接口中的方法必须全部是抽象方法;jdk1.8之后可以使用default关键字来实现。
本文介绍是基于jdk1.8以前的
接口
浅浅理解下接口
-
回顾抽象类
1、是站在类的角度把共性抽离出来
2、主要作用是用来当父类的
3、目的是让代码共用的同时还能提升代码的灵活性
4、有抽象方法和普通方法,但是不能实例化对象 -
抽象类是不是就够用了呢?
1、抽象类一种共性的抽离,那如果在抽象类中,只有抽象方法,那可以再抽离一下吗?
2、有时候继承一个抽象类不足以满足当前对象的属性,怎么办?于是,我们引入了接口~~
抽象类与接口的爱恨情仇
-
接口也是类
-
接口就是抽象类抽象到了极致
如果一个类是抽象类,且类中的所有方法都是抽象方法。那么类需要写abstract修饰,方法也写abstract修饰,为了减少代码量,我们可以把这个抽象类“抽象”成一个接口。
也就是说,接口是抽象类的抽象类。
接口用interface替代了类的abstract修饰和方法上的abstract修饰 -
抽象类是个模板,接口就是个标准
抽象类可以有自己的普通方法。接口中全部是抽象方法,没有方法体,可以理解为一个标准,具体实现需要子类去实现
-
类只支持单继承,但是接口支持多实现
java中类的继承只能是单继承:如果同时继承两个类,如果两个类有相同的非抽象方法(普通方法),子类就无法确定使用哪个父类的方法
类对接口的实现,支持多实现:接口只是个标准,所有的方法都是没有方法体的。类去实现接口后,需要根据自己的业务逻辑去重写该方法。这样即使两个接口有相同的方法,重写后方法也是唯一的,没有冲突。
特点
-
1、接口是一种特殊的类,使用的关键字是interface
-
2、接口中所有的方法默认是public abstract修饰的(一般省略不写)
-
3、接口中的所有成员变量都是有public static final修饰的
接口可以认为是一个标准,标准就是公开(public)、共享(static)、不可变(final)的
-
4、接口没有构造方法,可是使用多态
构造方法是用来实例化对象的,接口不可以实例化对象
-
5、实现接口的类必须要实现接口中所有方法。如果不想实现接口中的所有方法,那么该类设置成抽象类即可
-
6、接口和接口之间可以继承,并且支持多继承;类与接口之间是实现关系,并且一个类可以多现实多个接口
-
7、接口与实现类之间存在多态性
我们定义一个接口Animal、Move 和 Eat
使用类的多态,如果是Animal的话,只能调用breath()和run()方法
使用类的多态:如果是Eat的话,只能调用eating()方法
使用类的多态:如果是Move的话,只能调用moving()方法
接口的回调
-
在接口没有实现前也可以调用
即先有接口的使用者,再有接口的实现者
-
实现一个接口回调
1、创建一个usb接口,方法我们先只有一个service()
2、定义接口的使用者Computer类,该类包含三个usb属性
3、定义三个类 Key(键盘)、Mouse(鼠标)、Udisk(U盘)来实现Usb接口
4、实例化Computer类/*** * 创建一个usb接口,方法只有一个service */ public interface Usb { void service(); }
/*** * 定义接口的使用者Computer类 */ public class Computer { Usb usb1; Usb usb2; Usb usb3; public void run(){ System.out.println("Computer 启动"); if(usb1!=null){ usb1.service(); } if(usb2!=null){ usb2.service(); } if(usb3!=null){ usb3.service(); } } }
/*** * 定义Mouse类来实现Usb接口 */ public class Mouse implements Usb{ @Override public void service() { System.out.println("鼠标启动"); } }
/*** * 定义Key类来实现Usb接口 */ public class Key implements Usb{ @Override public void service() { System.out.println("键盘启动"); } }
/*** * 定义Udisk类来实现Usb接口 */ public class Udisk implements Usb{ @Override public void service() { System.out.println("U盘启动"); } }
// 测试方法 public class Test { public static void main(String[] args) { Computer computer = new Computer(); computer.usb1 = new Key(); computer.usb2 = new Mouse(); computer.usb3 = new Udisk(); computer.run(); } } ----------------输出结果-------------------- Computer 启动 键盘启动 鼠标启动 U盘启动
抽象类和接口
相同之处
- 接口和抽象类中都可以有静态代码块和静态方法、抽象方法和默认方法
接口的默认方法是由default修饰,在jdk1.8以后使用
区别
- 1、接口中的方法默认抽象方法,在接口中不能有实现;抽象类中的非抽象的方法可以有方法体
- 2、接口中的成员变量默认是final修饰的;抽象类中的成员变量不一定
- 3、一个类可以实现多个接口,但是最多只能继承一个抽象类
- 4、一个类实现接口需要实现接口的所有方法,继承抽象类只需要实现抽象方法,非抽象方法不做要求
- 5、从设计层面来看:抽象类是对类的抽象,是一种模板设计。而接口是行为的抽象,是一种行为的规范