概念
接口用于描述类具有什么功能,但并不给出具体实现。当某个类要使用接口时,再去实现接口中的这些方法,类需要遵从接口中描述的统一规则进行定义。所以,接口是对外提供的一组规则、标准。
形象的解释:电源插座就像是一个接口,它提供了标准化的电源连接方式,让我们能够将电器设备插入插座并获取电力供应;USB接口也是一种接口,它定义了计算机和移动硬盘之间的通信协议,确保了它们能够顺利地进行数据传输。
定义
1、接口要用关键字interface来定义
格式:public interface 接口名{ }
2、接口不能实例化(不能new出来)
3、接口和类之间是实现关系,通过implements关键字表示
格式:public class 类名 implements 接口名{ }
接口中成员的特点
1、成员变量:只能是常量,默认修饰符:public static final
2、构造方法:没有
3、成员方法(不同JDK要求不同):只能是抽象方法,默认修饰符:public abstract (JDK7以前)
接口与类
-
类和类的关系 :继承关系,只能单继承,不能多继承,但可以多层继承
- 接口和接口的关系:继承关系,可以单继承,也可以多继承
- 类和接口的关系:实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
继承关系用extends,实现关系用inplements
一、类实现接口(可多实现)
1、类实现多个接口:
如果实现多个接口则要重写接口中的所有抽象方法
2、类实现单个接口:
a、非抽象类实现接口时要重写接口中的所有抽象方法,抽象类可重写也可直接使用接口中的抽象方法
b、如果实现类实现了最下面的子接口,则需要重写所有的抽象方法
二、接口继承接口(可多继承)
子接口继承父接口,可以将父接口中的方法全部继承过来,子接口的实现类要实现(重写)所有方法(子接口自身方法和继承的父接口方法)
接口中的方法
接口中的默认方法
JDK8以后接口中新增的方法 允许在接口中定义默认方法,需要使用关键字 default 修饰
作用:解决接口升级的问题
接口中默认方法的定义格式:
格式: public default 返回值类型方法名(参数列表) { }
范例: public default void show() { }
注意事项:
- 默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字
- public可以省略,default不能省略
- 如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写
接口中的静态方法
JDK8以后允许在接口中定义静态方法,用static修饰
格式:public static 返回值类型 方法名(参数列表){ }
注意事项:
- 静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
- public可以省略,static不能省略
接口中的私有方法
JDK9以后允许将方法覅那个以为private,使得某些复用的代码不会把方法暴露出去
格式1:private 返回值类型 方法名(参数列表){ }
格式2:private static 返回值类型 方法名(参数列表){ }
总结
1、接口代表规则,是行为的抽象。想让哪个类拥有一个行为,就让这个类实现对应的接口
2、当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称之为接口多态
抽象类与接口的区别

接口的应用
类实现接口
//文件名:LikeAnimal.java
public interface LikeAnimal {//声明一个接口
public void eat();//接口中的两个公共方法
public void travel();//等待继承此接口的类来实现
public static void ab() {
System.out.println("接口中的静态方法!");
}
}
//文件名:Tiger.java
public class Tiger implements LikeAnimal {//Tiger类继承LikeAnimal接口
public void eat() {//实现接口中的eat()抽象方法
System.out.println("老虎正在吃饭!");
}
public void travel() {//实现接口中的travel()抽象方法
System.out.println("老虎喜欢旅行!");
}
public String park() {//此类额外创建了一个新方法
return "公园里有很多只老虎!";
}
}
//文件名:PlayAnimal.java
public class PlayAnimal {
public static void main(String[] args) {
Tiger a=new Tiger();
a.eat();
a.travel();//抽象方法和默认方法通过实现该接口的类的实例对象来调用
System.out.println(a.park());
LikeAnimal.ab();//通过 接口名.方法名 来调用接口中的静态方法
}
}
运行结果:
接口间的继承
//文件名:Sports.java
public interface Sports {
public void play();
public void happy();
public int interesting(int a);
}
//文件名:Basketball.java
public interface Basketball extends Sports {
public void perfect();
public String together(String name1,String name2);
public int friends(int x);
}
//文件名:Football.java
public interface Football extends Sports {
public void good();
public void nice();
}
在 Sports 接口中,自己声明了 3 个方法,所以实现 Sports 接口的类需要编写这 3 个方法。
在 Basketball 接口中,自己声明了 3 个方法,并且从 Sports 接口中继承了它的 3 个方法。所以实现 Basketball 接口的实现类需要编写 6 个方法。
在 Football 接口中,自己声明了2个方法,并且从 Sports 接口中继承了它的3个方法。所以实现 Football 接口的实现类需要编写 5 个方法。
2468

被折叠的 条评论
为什么被折叠?



