📌 目录
1. 什么是接口?
接口(Interface) 是 Java 中一种特殊的类,用于定义一组方法的集合,但不提供这些方法的实现。接口仅包含方法声明(没有方法体),由实现接口的类提供具体的实现。接口可以被任何类实现,任何类可以实现多个接口,接口支持多继承。
接口的作用是规定类必须遵循的行为规范,定义了一种契约,保证实现该接口的类提供特定的功能。
2. 接口的特点
- 只能声明方法:接口只能声明方法,不能包含方法的实现(默认方法除外)。
- 没有构造方法:接口不能有构造方法。
- 实现接口:类通过
implements
关键字实现接口,类必须实现接口中声明的所有方法,除非该类是抽象类。 - 接口可以继承接口:接口之间可以继承,支持多继承。
- 默认方法:从 Java 8 开始,接口可以包含
default
方法,提供方法的默认实现。 - 静态方法:从 Java 8 开始,接口还可以包含
static
方法。
3. 接口的声明与定义
3.1 接口的声明格式
接口使用 interface
关键字声明,格式如下:
interface InterfaceName {
// 接口的方法声明
returnType methodName();
}
3.2 接口的方法
- 接口中的方法默认是
public abstract
,即方法的访问权限是public
,并且没有方法体(抽象的)。 - 从 Java 8 开始,接口可以有
default
和static
方法:- default 方法:提供一个默认的实现,子类可以选择重写这个方法。
- static 方法:可以在接口中定义静态方法,类可以通过接口名来调用这些方法。
interface Animal {
void sound(); // 抽象方法
default void sleep() { // 默认方法
System.out.println("动物在睡觉");
}
static void eat() { // 静态方法
System.out.println("动物在吃东西");
}
}
4. 接口的实现
类通过 implements
关键字实现接口,必须实现接口中声明的所有抽象方法。如果类没有实现接口的所有抽象方法,那么这个类也必须是抽象类。
class Dog implements Animal {
// 必须实现接口中的抽象方法
public void sound() {
System.out.println("狗叫:汪汪");
}
}
5. 接口的多继承
在 Java 中,接口可以继承多个接口,类可以实现多个接口。接口支持多继承,而类只支持单继承。
interface Animal {
void sound();
}
interface Mammal {
void giveBirth();
}
class Dog implements Animal, Mammal {
public void sound() {
System.out.println("狗叫:汪汪");
}
public void giveBirth() {
System.out.println("狗是哺乳动物,生小狗");
}
}
6. 接口与抽象类的区别
特性 | 接口(Interface) | 抽象类(Abstract Class) |
---|---|---|
继承方式 | 类实现接口 implements | 类继承抽象类 extends |
方法实现 | 默认方法可以有实现;其他方法无实现 | 抽象方法没有实现;非抽象方法有实现 |
访问修饰符 | 所有方法默认是 public | 可以使用不同的访问修饰符 |
多继承支持 | 支持多继承(接口可以继承多个接口) | 不支持多继承(只能继承一个类) |
构造方法 | 无 | 可以有构造方法 |
属性 | 只能包含 public static final 常量 | 可以包含实例变量 |
子类实例化 | 通过实现接口实例化 | 通过继承抽象类实例化 |
7. 接口的应用场景
- 规范定义:接口可以定义一组方法签名,供不同类实现,用于不同类型对象的统一管理。
- 多态:接口是实现多态的一个常用方式,允许不同类使用相同的接口来提供不同的实现。
- 解耦:接口有助于解耦代码,类之间只通过接口交互,而不依赖于具体实现。
- 插件系统:接口广泛应用于插件系统,通过接口约定插件的行为,动态地增加功能。
8. 接口的实例化
接口不能直接实例化,只能通过实现接口的类来创建对象。接口本身没有构造方法,无法直接生成实例。
// 错误,接口不能实例化
Animal animal = new Animal(); // 编译错误
// 正确,通过实现接口的类来实例化
Animal dog = new Dog();
9. 接口的示例代码
示例 1:基本接口实现
interface Animal {
void sound(); // 抽象方法
default void sleep() { // 默认方法
System.out.println("动物在睡觉");
}
}
class Dog implements Animal {
public void sound() {
System.out.println("狗叫:汪汪");
}
}
public class TestInterface {
public static void main(String[] args) {
Animal dog = new Dog();
dog.sound(); // 调用 Dog 类的 sound 方法
dog.sleep(); // 调用 Animal 接口的默认方法
}
}
输出:
狗叫:汪汪
动物在睡觉
示例 2:接口的多继承
interface Animal {
void sound();
}
interface Mammal {
void giveBirth();
}
class Dog implements Animal, Mammal {
public void sound() {
System.out.println("狗叫:汪汪");
}
public void giveBirth() {
System.out.println("狗是哺乳动物,生小狗");
}
}
public class TestMultipleInterface {
public static void main(String[] args) {
Dog dog = new Dog();
dog.sound(); // 输出:狗叫:汪汪
dog.giveBirth(); // 输出:狗是哺乳动物,生小狗
}
}
输出:
狗叫:汪汪
狗是哺乳动物,生小狗
发表回复