精通 Java 接口:概念、实现与最佳实践
Java 接口详解
Java 接口定义实现类必须遵守的契约。它们实现抽象、多重继承,并促进清晰、模块化的架构。
定义接口
接口是完全抽象的类型。其所有方法隐式为 public abstract,所有字段隐式为 public static final。使用 interface 关键字声明:
interface Language { void getType(); void getVersion(); }
此处 Language 接口包含两个抽象方法。
实现接口
接口不能实例化。类使用 implements 关键字实现接口,并为所有抽象方法提供具体方法体。
示例 1:多边形接口
interface Polygon { void getArea(int length, int breadth); } class Rectangle implements Polygon { @Override public void getArea(int length, int breadth) { System.out.println("The area of the rectangle is " + (length * breadth)); } } class Main { public static void main(String[] args) { Rectangle r = new Rectangle(); r.getArea(5, 6); } }
输出:
The area of the rectangle is 30
示例 2:语言接口
interface Language { void getName(String name); } class ProgrammingLanguage implements Language { @Override public void getName(String name) { System.out.println("Programming Language: " + name); } } class Main { public static void main(String[] args) { ProgrammingLanguage lang = new ProgrammingLanguage(); lang.getName("Java"); } }
输出:
Programming Language: Java
实现多个接口
一个类可实现多个接口:
interface A { /* members */ } interface B { /* members */ } class C implements A, B { /* implementations */ }
扩展接口
接口可使用 extends 扩展其他接口:
interface Line { /* members */ } interface Polygon extends Line { /* members */ }
实现 Polygon 的类必须同时提供 Line 和 Polygon 成员的方法。
扩展多个接口
interface A { /* ... */ } interface B { /* ... */ } interface C extends A, B { /* ... */ }
为何使用接口?
- 抽象: 定义操作而不规定实现,允许不同类有不同行为。
- 规范: 设定清晰契约,实现类必须履行。
- 多重继承: 让类从多个来源获取行为。
- 默认可见性: 所有方法隐式
public;字段隐式public static final。
隐式常量示例:
interface Language { String TYPE = "programming language"; // 隐式 public static final void getName(); // 隐式 public }
默认方法(Java 8+)
Java 8 引入 default 方法,允许接口包含具体方法体:
default void getSides() { System.out.println("I can get sides of a polygon."); }
默认方法使接口新增方法时无需破坏现有实现,实现向后兼容。
示例:默认方法用法
interface Polygon { void getArea(); default void getSides() { System.out.println("I can get sides of a polygon."); } } class Rectangle implements Polygon { @Override public void getArea() { int length = 6; int breadth = 5; int area = length * breadth; System.out.println("The area of the rectangle is " + area); } @Override public void getSides() { System.out.println("I have 4 sides."); } } class Square implements Polygon { @Override public void getArea() { int length = 5; int area = length * length; System.out.println("The area of the square is " + area); } } class Main { public static void main(String[] args) { Rectangle r = new Rectangle(); r.getArea(); r.getSides(); Square s = new Square(); s.getArea(); s.getSides(); } }
输出:
The area of the rectangle is 30 I have 4 sides. The area of the square is 25 I can get sides of a polygon.
静态与私有方法(Java 9+)
接口现可包含 static 方法,通过接口名调用:
interface Polygon { static void helper() { /* ... */ } } Polygon.helper();
私有方法为其他接口方法提供内部工具,保证封装性。
实战示例:多边形计算
import java.lang.Math; interface Polygon { void getArea(); default void getPerimeter(int... sides) { int perimeter = 0; for (int side : sides) perimeter += side; System.out.println("Perimeter: " + perimeter); } } class Triangle implements Polygon { private final int a, b, c; private double area; Triangle(int a, int b, int c) { this.a = a; this.b = b; this.c = c; } @Override public void getArea() { double s = (a + b + c) / 2.0; area = Math.sqrt(s * (s - a) * (s - b) * (s - c)); System.out.println("Area: " + area); } } class Main { public static void main(String[] args) { Triangle t = new Triangle(2, 3, 4); t.getArea(); t.getPerimeter(2, 3, 4); } }
输出:
Area: 2.9047375096555625 Perimeter: 9
本例中,Polygon 接口提供可复用的 getPerimeter 方法,各形状实现各自的面积计算。
java
- 掌握 C# 接口:定义、实现与实战场景全解析
- C# 接口完全指南:定义契约、实现多态与解耦设计
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java if…else:控制流全解析
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- 掌握 Java NavigableSet 接口:导航、排序与实战示例
- 掌握 Java Lambda 表达式:从基础到 Stream API 实战
- Java 接口 vs 抽象类:如何选择合适的抽象方式
- Java 接口全解析:定义契约、默认方法、多实现与标记接口
- Java 9 接口私有方法:增强封装与代码复用