接口(interface):是一种抽象类型,是对类的一组需求的描述。需求指的是,比如要使用 Arrays 类的 sort 方法对 Employee 对象数组进行排序,那么 Employee 类必须实现 Comparable 接口。
// 语法
[可见度] interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
// Comparable接口的代码:
public interface Comparable<T> {
int compareTo(T other);
}
调用x.compareTo(y)时,当 x < y,返回一个负数;当 x > y,返回一个正数;否则返回0。
接口特性
- 一个类可以实现多个接口;
- 接口没有构造函数;
- 接口中没有已实现的方法,全都是抽象方法,方法会被隐式地指定为
public abstract
; - 接口中的所有方法自动地属于 public,因此在接口中声明方法时不必提供关键字 public,但在实现接口时,必须提供 public;
- 接口中可以定义成员变量,这些成员变量默认都是
public static final
的静态常量; - 一个实现接口的类,必须实现接口内的所有方法,否则必须声明为抽象类。
注意:抽象类实现接口的话不需要实现接口内的所有方法!(抽象类允许抽象方法的存在)
如何实现一个接口?
为了让类实现一个接口,两个步骤:
- 将类声明为实现给定的接口。(使用关键字:
implements
) - 实现接口中的所有方法。
class Employee implements Comparable<Employee> {
public int compareTo(Employee other) {
return Double.compare(salary,other.salary);
}
}
注意:
为什么要添加这个特性?
因为在 JDK 1.8 之前,接口中的方法都是抽象方法,当我们需要修改接口时,就要修改所有实现这个接口的类,这显然不合适,所以解决方法是在接口中添加新的方法,但是这样也要在类中添加这个方法的实现,所以引进默认方法和静态方法,解决了接口的修改与现有实现不兼容的问题。
public interface Test{
// 1.默认方法,用default修饰。只能通过接口实现类的对象调用默认方法
default String fun1(String s){
return s;
}
// 2.静态方法,用static修饰。只能通过接口名调用静态方法
static void fun2(){
System.out.println("xxx");
}
}
如果一个类实现了多个接口,具有相同名字的默认方法如何解决冲突?
public interface Vehicle {
default void print(){
System.out.println("我是一辆车!");
}
}
public interface FourWheeler {
default void print(){
System.out.println("我是一辆四轮车!");
}
}
第一个解决方案是创建自己的默认方法,来覆盖重写接口的默认方法:
public class Car implements Vehicle, FourWheeler {
default void print(){
System.out.println("我是一辆四轮汽车!");
}
}
第二种解决方案可以使用 super 来调用指定接口的默认方法:
public class Car implements Vehicle, FourWheeler {
public void print(){
Vehicle.super.print();
}
}
抽象类和接口的区别?
- 实现:抽象类和接口都是 Java 中的抽象类型,抽象类通过继承实现,一个类只能有一个继承关系,但是一个类能实现多个接口;
- 方法:抽象类允许有实现方法,接口只能有未实现的方法,即抽象方法;
- 成员变量:抽象类的成员变量可以是各种类型的,接口中的成员变量只能是
public static final
类型的静态常量; - 实现理念:抽象类和接口的实现理念不同,抽象类表示
is-a
关系,接口表示has-a
关系;
参考资料:
- Java 接口 | 菜鸟教程
- 「Java核心技术 卷1 基础知识 原书第9版」
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。