上一篇
java interface怎么写
- 后端开发
- 2025-07-14
- 9
Java中,接口使用interface关键字声明public interface MyInterface {, void
Java编程中,接口(Interface)是一种极为重要的构造,它为代码的设计和组织提供了强大的支持,以下将详细阐述Java接口的写法:
接口的定义
-
基本语法
- 使用interface关键字来定义接口,语法格式如下: [修饰符] interface 接口名 { // 接口体 }
- 定义一个简单的Animal接口: public interface Animal { void eat(); void sleep(); }
- 在这个例子中,public是修饰符,表示该接口是公开的,可以被其他类访问。Animal是接口名,接口体中定义了两个抽象方法eat()和sleep()。
-
成员变量
- 接口中的变量默认是public static final的,即公共的、静态的、不可变的常量。 public interface Shape { double PI = 3.14159; void calculateArea(); void calculatePerimeter(); }
- 这里定义了一个名为PI的常量,它在整个项目中都是公开且不可修改的。
-
方法声明
- 接口中的方法默认是public abstract的,不需要显式地用这两个关键字修饰。 public interface Printable { void print(); }
- 这个方法print()没有方法体,只有方法签名,具体的实现由实现该接口的类来完成。
接口的实现
-
实现方式
-
类通过implements关键字来实现接口,有一个Cat类实现了Animal接口:
public class Cat implements Animal { @Override public void eat() { System.out.println("猫吃鱼"); } @Override public void sleep() { System.out.println("猫在睡觉"); } } -
在这个类中,必须实现Animal接口中定义的所有方法,否则该类将被视为抽象类。
-
-
多接口实现

-
一个类可以实现多个接口,接口之间用逗号隔开。
public interface Runnable { void run(); } public interface Flyable { void fly(); } public class Bird implements Runnable, Flyable { @Override public void run() { System.out.println("鸟在奔跑"); } @Override public void fly() { System.out.println("鸟在飞翔"); } } -
Bird类同时实现了Runnable和Flyable接口,需要实现这两个接口中的所有方法。
-
接口继承接口
-
接口可以通过extends关键字继承其他接口。
public interface Animal { void eat(); void sleep(); } public interface Mammal extends Animal { void giveBirth(); } -
Mammal接口继承了Animal接口,所以实现Mammal接口的类需要实现Animal接口中的eat()和sleep()方法,以及Mammal接口中的giveBirth()方法。

-
-
多继承
-
Java中的类不支持多继承,但接口可以多继承。
public interface A { void methodA(); } public interface B { void methodB(); } public interface C extends A, B { void methodC(); } -
实现C接口的类需要实现A、B和C接口中的所有方法。
-
-
默认方法
-
从Java 8开始,接口中可以定义默认方法,使用default关键字修饰,默认方法有具体的实现,实现该接口的类可以选择重写或直接使用默认实现。
public interface Animal { void eat(); default void sleep() { System.out.println("动物在睡觉"); } } public class Dog implements Animal { @Override public void eat() { System.out.println("狗吃肉"); } // 可以选择不重写sleep方法,直接使用接口中的默认实现 } -
在这个例子中,Dog类实现了Animal接口,但没有重写sleep()方法,所以会使用接口中的默认实现。

-
-
静态方法
-
接口中还可以定义静态方法,使用static关键字修饰,静态方法只能在接口中调用,不能被实现类继承。
public interface MathTool { static int add(int a, int b) { return a + b; } void calculate(); } public class Calculator implements MathTool { @Override public void calculate() { System.out.println("计算器在进行计算"); } } public class Main { public static void main(String[] args) { int result = MathTool.add(3, 5); System.out.println("3 + 5 = " + result); } } -
在这个例子中,MathTool接口中的add()方法是静态方法,只能通过接口名来调用。
- 语法上:接口使用interface关键字定义,抽象类使用abstract关键字定义,接口中的方法默认是public abstract的,而抽象类中的方法可以是public、protected或默认访问修饰符,且可以有具体实现。
- 成员变量:接口中的变量默认是public static final的常量,而抽象类中可以有实例变量和静态变量。
- 多继承:一个类可以实现多个接口,但只能继承一个抽象类,接口之间可以多继承,抽象类不支持多继承。
- 设计理念:接口更侧重于定义行为规范,强调的是“做什么”,而抽象类更侧重于代码的复用,既可以定义行为规范,也可以提供部分实现。
- 定义规范:接口的主要作用是定义一组行为规范,让实现该接口的类去具体实现这些行为,如果接口中的方法有具体实现,就违背了接口作为规范的初衷。
- 灵活性:将方法定义为抽象的,使得不同的类可以实现不同的逻辑,提高了代码的灵活性和可扩展性,实现类可以根据自己的需求来实现接口中的方法,而不会受到接口中
接口的应用场景
应用场景 描述 示例 定义回调 通过接口定义回调方法,当特定事件发生时,调用实现该接口的对象的方法。 定义一个EventListener接口,当事件发生时,调用实现该接口的对象的onEvent()方法。 实现多态 不同的类实现同一个接口,可以根据实际需要创建不同的对象,而调用相同的方法。 定义一个Shape接口,有Circle、Rectangle等类实现该接口,可以通过Shape类型的变量来引用不同的形状对象,调用calculateArea()方法。 解耦代码 将高层模块和低层模块分离,通过接口进行交互,降低模块之间的耦合度。 在一个系统中,数据访问层和业务逻辑层通过接口进行交互,当数据访问层的实现方式改变时,业务逻辑层不需要修改。 FAQs
问题1:接口和抽象类有什么区别?
回答:接口和抽象类都是Java中的抽象类型,但它们有以下区别:
问题2:为什么接口中的方法默认是抽象的?
回答:接口中的方法默认是抽象的,主要有以下原因:
-
接口的继承
接口的默认方法和静态方法(Java 8及以上)
-