抽象方法在接口中默认public abstract且不可加修饰符,在抽象类中必须显式用abstract修饰且访问权限不能为private。

Java 中定义抽象方法,关键看它属于接口还是抽象类——两者的语法、修饰符和使用规则完全不同。
接口中定义抽象方法
接口里的方法默认就是 public abstract,无需显式写出这两个修饰符。只要写方法签名,以分号结束,就是抽象方法。
- 格式:返回类型 方法名(参数列表);
- 不能加方法体(即不能有 {})
- 不能用 private、protected、static、final、synchronized 等修饰
- 即使省略 public abstract,编译器也会自动补上
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
void breathe(); // 等价于 public abstract void breathe();
int getLegs(); // 同样是抽象方法
}
抽象类中定义抽象方法
抽象方法必须用 abstract 显式修饰,且只能出现在用 abstract 声明的类中。方法签名后直接跟分号,不能有方法体。
- 访问修饰符可以是 public、protected 或默认(包访问),但不能是 private
- 不能与 static、final、synchronized、native 等共存
- 抽象类本身可以包含普通方法(有方法体)、构造方法、成员变量等
示例:
abstract class Vehicle {protected String brand;
public Vehicle(String brand) { this.brand = brand; }
public abstract void start(); // 必须用 abstract 修饰
abstract void stop(); // 默认包访问,也合法
// void run() { } // ❌ 有方法体就不是抽象方法
}
常见错误提醒
以下写法都是非法的,编译会报错:
- interface I { private void m(); } —— 接口方法不能 private
- abstract class A { abstract static void m(); } —— 抽象方法不能 static
- class B implements I { void m() { } } —— 实现接口时未加 public,会导致访问权限变窄(接口方法默认 public,实现必须至少是 public)
- abstract class C { abstract final void m(); } —— final 和 abstract 冲突
小结对比
接口抽象方法强调“契约”:统一公开、不可更改、只声明不实现;
抽象类抽象方法强调“模板”:可控制可见性、配合具体方法共同构建继承体系。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










