前言
在面向对象的基础之上,接口的出现是类性质的一种完善,是继承机制的一种补充,是体现多态性的一种形式。从生活实际出发,接口把它之下一系列复杂的逻辑,功能等通过“实现接口”的方式封装简化出来,只通过连接一个小小的口子就轻而易举地实现了背后实则很复杂的功能。我想这就是接口存在的意义所在吧。
接口⭐
一.定义及语法
1.定义
一系列方法的声明使用,是一些方法的集合
给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来
2.语法:
interface 自定义的接口名字{
属性
方法
}
class 类名 implements 接口{
类自己的属性
类自己的方法
}
3.注意事项:
1.接口中的方法可以是抽象,静态,默认实现的方法
2.接口中的抽象方法必须在类中实现
3.JDK7前接口里的所有方法是没有方法体的,都是抽象方法
4.JDK8后接口可以有静态方法,默认方法
二.使用细节
🟢接口不能被实例化
例如:
🟢接口中所有方法为public方法,抽象方法可以不用abstract来修饰
例如:
🟢一个普通类实现接口,就必须将该接口中的所有方法都实现
例如:
🟢抽象类实现接口,可以不用实现接口的方法
例如:
🟢一个类同时可以实现多个接口
例如:
🟢接口中的属性只能是 public,final,static修饰
例如:
int a=10 等价于 public static final int a=10;
🟢访问接口中属性的方式为——接口名.属性名
例如:
public class Test {
public static void main(String[] args) {
System.out.println(Jiekou.a); //访问接口属性的方式
}
}
interface Jiekou{
int a=10;
void Method();
void Method2();
}
🟢接口不能继承其他的类,但是可以继承多个别的接口
例如:
🟢接口修饰符只能是public和默认修饰符
三.实现接口与继承
🟢接口和继承解决的问题不同
✔️继承提高代码复用性和可维护性
✔️接口通过设计好各种规范来让其它类去实现这些方法
🟢接口是对Java单继承机制的一种补充,父类中没有的功能有时也可以通过实现接口来解决
例如:
public class Monkey {
public static void main(String[] args) {
Monkeyking monkeyking = new Monkeyking("悟空");
monkeyking.jump();
monkeyking.fly(); //通过实现接口,从而补充了功能
}
public String name;
public Monkey(String name) {
this.name = name;
}
public void jump(){
System.out.println("我会跳了~");
}
}
interface Skill{ //接口类似于继承的一种补充机制 父类中没有的功能有时也可以通过实现接口来解决
void fly();
void swim();
}
class Monkeyking extends Monkey implements Skill{
public Monkeyking(String name, int age) {
super(name, age);
}
@Override
public void jump() {
super.jump();
}
@Override
public void fly() {
System.out.println("我又会飞了~");
}
@Override
public void swim() {
System.out.println("我又会游泳了~");
}
}
🟢继承满足的是is-a的关系,接口满足的是like-a的关系(实质上还是补充机制)
四.接口多态性体现
🟢多态参数
可以在形参列表中传入接口类型的不同参数用来接收不同的对象
例如:
A为一个接口
public static void play(A a){...}
🟢多态数组
通过一个情景引入
例如:
有MP3和Computer两台设备,给一个接口Usb,分别实现接口,并将对象存入数组并遍历,要求在使用Computer时可以在实现work()方法的同时,实现特有的game()方法。利用多态数组实现。
public class PolyArr {
public static void main(String[] args) {
Usb[] usb=new Usb[2]; //多态数组
usb[0]=new Computer();
usb[1]=new MP3();
for (int i = 0; i < usb.length; i++) {
usb[i].work(); //体现动态绑定机制
if (usb[i] instanceof Computer){ //类型判断
((Computer) usb[i]).game(); //向下转型
}
}
}
}
interface Usb{
void work();
}
class Comptuer implements Usb{
@Override
public void work() {
System.out.println("电脑在使用~");
}
public void game() { //手机特有的功能
System.out.println("电脑在玩游戏!");
}
}
class MP3 implements Usb{
@Override
public void work() {
System.out.println("MP3在工作!");
}
}
🟢接口存在多态传递
public class Pass {
public static void main(String[] args) {
IE ie=new Teacher(); //接口类型的变量可以指向,实现了该接口的类的对象实例
IG ig=new Teacher(); //这就是接口的多态传递现象
}
}
interface IG{}
interface IE extends IG{}
class Teacher implements IE{}
如果IE 继承了IG 接口,而Teacher 类实现了IE接口 那么,实际上就相当于Teacher类也实现了IG接口