接口
在 Java 中,接口是一种抽象类型,用来规定类必须实现的一组方法。它可以看作是一个“契约”或“协议”,实现接口的类必须提供接口中定义的方法实现。
接口
接口中只能存在常量+抽象方法。接口也是类的一种
继承关系
接口默认继承Object,可以调用Object中的方法
构造方法
接口没有构造方法,无法被实例化
接口属性
接口可以有属性,但必须是 public static final 常量。
常量的public static final可以省略
public interface UserConstants {
// 实际上等价于:public static final String TYPE = "ADMIN";
String TYPE = "ADMIN";
int MAX_COUNT = 100;
}抽象方法
接口中的抽象方法的public abstract可以省略
public interface Animal {
void eat(); // 抽象方法
}接口
定义接口
// 定义接口
public interface Animal {
void eat(); // 抽象方法
void sleep();
default void run() { // 默认方法
System.out.println("Animal is running");
}
static void breathe() { // 静态方法
System.out.println("Animal breathes");
}
}实现接口
// 实现接口
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("Dog eats bones");
}
@Override
public void sleep() {
System.out.println("Dog sleeps in kennel");
}
}一个类可以实现多个接口,解决了 Java 单继承的限制
interface Flyer { void fly(); }
interface Swimmer { void swim(); }
class Duck implements Flyer, Swimmer {
public void fly() { System.out.println("Duck flies"); }
public void swim() { System.out.println("Duck swims"); }
}多继承接口
在 Java 中接口是可以多继承的,而且这是接口相比类最大的优势之一(类只能单继承)。
一个接口可以继承多个接口,用逗号分隔即可:
interface A {
void methodA();
}
interface B {
void methodB();
}
// 接口C继承A和B
interface C extends A, B {
void methodC();
}实现多继承接口时,必须实现所有父接口中的方法
class Impl implements C {
@Override
public void methodA() {
System.out.println("实现A的方法");
}
@Override
public void methodB() {
System.out.println("实现B的方法");
}
@Override
public void methodC() {
System.out.println("实现C的方法");
}
}面向接口编程
面向接口调用者称为接口调用者。面向接口实现者称为接口实现者。
调用者和实现者通过接口达到了解耦。调用者不需要关心具体的实现者,实现者也不需要关心具体的调用者。双方都遵循接口开发规范。
默认/静态方法(JDK 8+)
默认方法
引入默认方法是为了解决接口演变的问题:接口中定义抽象方法,但是不能实现这些方法,所有实现类必须实现这些抽象方法。当我们向接口中添加或删除一个抽象方法,这会破坏接口的所有实现类,所有实现类都需要修改代码同步更新。
public interface Animal {
void eat(); // 抽象方法
default void sleep() { // 默认方法
System.out.println("Animal is sleeping");
}
}我们可以将新方法设置为默认方法,所有实现类可以自行决定是否实现。
需要删除的接口也可以将其设为默认方法,新的实现类不会实现这个要删除的方法,同时不影响原来的实现类
静态方法
静态方法属于接口本身,而不是实现类,和类的静态方法类似,主要作用是提供 工具方法或辅助方法,不依赖于接口实现对象。
静态方法只能使用本接口访问,无法使用实现类的类名访问
public interface Animal {
void eat(); // 抽象方法
static void breathe() { // 静态方法
System.out.println("Animal breathes");
}
}私有方法 (JDK 9+)
在 Java 9 之后,接口可以定义 私有方法(private 方法),它只能在接口内部被调用,不能被实现类访问或重写。主要目的是 给接口内部的默认方法或静态方法提供共用的辅助逻辑,避免重复代码。
public interface Animal {
void eat(); // 抽象方法
default void sleep() {
System.out.println("Animal starts sleeping");
log("sleep"); // 调用私有方法
}
static void breathe() {
System.out.println("Animal breathes");
logStatic("breathe"); // 调用私有静态方法
}
// 私有实例方法
private void log(String action) {
System.out.println("Logging action: " + action);
}
// 私有静态方法
private static void logStatic(String action) {
System.out.println("Static logging: " + action);
}
}