Java 所有关键字及规范分类(含保留字/核心说明)
Java 关键字是编程语言内置的特殊标识符 ,全为小写英文字母,具有固定语法含义,不能作为类名、变量名、方法名等自定义标识符使用 。以下按功能场景+语法属性 规范分类,包含所有有效关键字、未使用保留字,并标注易混淆的特殊值,覆盖Java SE全版本核心关键字,已补充非访问修饰符default。
一、基础数据类型关键字(8种+1个无返回值标识)
用于声明Java基本数据类型 (共8种,分4类:整型、浮点型、字符型、布尔型),以及标识方法无返回值的void,是Java数据定义的基础。
- 整型:
byte(字节型)、short(短整型)、int(整型,默认)、long(长整型) - 浮点型:
float(单精度浮点型)、double(双精度浮点型,默认) - 字符型:
char(单个Unicode字符) - 布尔型:
boolean(布尔值,仅true/false) - 无返回值标识:
void(用于方法声明,标识无返回值)
二、流程控制关键字(12个,分3个子类)
用于控制程序的执行流程、分支判断、循环遍历、跳转中断,是实现程序逻辑的核心关键字,分3类更易理解:
1. 条件分支控制
if、else、switch、case、default(switch的默认分支,与非访问修饰符default语义不同)
2. 循环遍历控制
for、while、do(与while配合构成do-while循环)、for(Java5+增强for循环仍用此关键字)
3. 跳转中断控制
break(跳出循环/switch)、continue(跳过本次循环,进入下一次)、return(方法返回,可带/不带返回值)
三、访问权限修饰符关键字(4个,含无显式关键字的默认权限)
用于修饰类、方法、成员变量、构造器,控制其在不同包/类中的访问范围,是Java封装特性的核心实现,共4种权限(其中默认权限无显式关键字):
public:公共权限,所有包/类均可访问protected:受保护权限,本类、同包子类、不同包子类可访问private:私有权限,仅本类可访问- 【默认权限】:无任何访问修饰符,仅本包可访问(无对应关键字,需特别注意)
四、非访问修饰符关键字(11个,含模块/高级特性,已补充default)
用于修饰类、方法、变量、代码块 ,赋予其特殊语法特性(如静态、最终、抽象等),不控制访问范围,仅修饰行为/属性,含Java8+、Java9+新增特性相关修饰符,注意与switch中的default区分,二者为不同语义的关键字 :
static(静态)、final(最终,不可修改)、abstract(抽象)、synchronized(同步,线程安全)、native(原生,调用本地方法库)、strictfp(严格浮点,统一浮点计算规则)、transient(瞬态,序列化时忽略)、volatile(易变,保证变量可见性,禁止指令重排)、default(接口默认方法,Java8+,仅接口中使用)、exports(模块导出,Java9+)、requires(模块依赖,Java9+)
五、类与对象核心关键字(13个,面向对象基础)
用于类、接口、枚举、注解 的定义、继承、实现,以及包管理、对象实例判断,是Java面向对象(OOP)特性的核心关键字:
class(定义普通类)、interface(定义接口)、enum(定义枚举类,Java5+)、@interface(定义注解,Java5+,语法关键字)、extends(类继承/接口泛型限定)、implements(类实现接口)、package(定义包,用于类隔离)、import(导入包/类,简化类名)、this(当前对象实例引用)、super(父类对象/构造器引用)、instanceof(判断对象是否为指定类/接口的实例)、new(创建对象实例,调用构造器)、module(定义模块,Java9+)
【面向对象关键字深度扩展】
(在原有基础上补充核心关键字的用法、场景、版本特性及代码示例,含default修饰符相关扩展)
1. class(类定义)
- 核心作用:定义普通类、抽象类、最终类,也是内部类的基础。
- 扩展场景
-
普通类:最基础的对象模板,包含属性与方法。
-
抽象类 :用
abstract class修饰,包含抽象方法(无实现),强制子类重写,用于提取公共抽象逻辑。 -
最终类 :用
final class修饰,不能被继承(如 JDK 中的String、Integer),保证类的不可变性。 -
内部类 :分为4种,用于实现更细粒度的封装
java// 成员内部类:依赖外部类实例,可访问外部类所有成员 public class Outer { private String name = "Outer"; public class Inner { public void show() { System.out.println(name); } } } // 静态内部类:不依赖外部类实例,仅能访问外部类静态成员 public class Outer { private static String name = "Static Outer"; public static class Inner { public void show() { System.out.println(name); } } } // 局部内部类:定义在方法/代码块内,作用域仅限当前块 public class Outer { public void method() { class LocalClass { public void show() { System.out.println("局部内部类"); } } new LocalClass().show(); } } // 匿名内部类:无类名,直接实现接口/继承类,用于一次性场景 new Runnable() { @Override public void run() { System.out.println("匿名内部类"); } }.run();
-
2. interface(接口定义)
-
核心作用:定义抽象契约,支持多实现,是多态的核心载体。
-
版本扩展
- Java 8+:支持
default(默认方法,带实现,子类可重写)和static(静态方法,类级别的)。 - Java 9+:支持
private(私有方法,用于接口内部代码复用)。
- Java 8+:支持
-
示例
javapublic interface Animal { // 抽象方法(默认public abstract) void eat(); // Java8+ 默认方法(非访问修饰符default核心用法) default void sleep() { System.out.println("动物睡觉"); } // Java8+ 静态方法 static void breathe() { System.out.println("动物呼吸"); } // Java9+ 私有方法 private void clean() { System.out.println("清理毛发"); } }
0)、抽象类与接口 深度对比表
| No. | 区别点 | 抽象类(abstract class) |
接口(interface) |
|---|---|---|---|
| 1 | 定义本质 | 对事物的模板式抽象,体现「is-a」继承关系,是包含抽象方法的类,允许同时包含具体实现 | 对行为的契约式抽象,体现「has-a/can-do」能力关系,是抽象方法与常量的集合(JDK8+后支持默认方法、静态方法) |
| 2 | 组成细节 | * 构造方法:存在,用于初始化父类成员,子类构造器会隐式调用 * 抽象方法 :abstract修饰,无方法体,子类必须重写(除非子类也是抽象类) * 普通方法:允许有带方法体的实例方法、静态方法 * 成员变量 :支持实例变量(默认default权限)、静态变量、常量(final) * 代码块:允许静态代码块、实例代码块 |
* 构造方法:无(接口不能实例化,无实例成员需要初始化) * 抽象方法 :JDK8前默认public abstract;JDK8+可包含default(默认方法,带实现)、static(静态方法)、private(私有方法,JDK9+,用于内部复用) * 成员变量 :默认public static final修饰,必须初始化 * 代码块:无实例/静态代码块 |
| 3 | 使用方式 | 子类通过extends继承,单继承局限(一个子类只能继承一个抽象类);子类必须重写所有抽象方法(否则子类需声明为抽象类) |
子类通过implements实现,多实现支持(一个类可实现多个接口);必须重写所有抽象方法(JDK8+默认方法可选择重写) |
| 4 | 类与接口的关系 | 可以实现多个接口(implements),弥补单继承的灵活性不足 |
不能继承抽象类,但可以多继承其他接口 (extends),组合多个行为契约 |
| 5 | 常见设计模式 | * 模板方法模式(定义算法骨架,子类实现可变步骤,如Spring的AbstractApplicationContext) * 回调模式(抽象类作为回调逻辑的父类) |
* 简单工厂/工厂方法/代理模式(接口作为代理与真实对象的契约) * 策略模式(接口定义策略行为) * 适配器模式(接口适配不同实现) |
| 6 | 对象实例化 | 不能直接实例化,需子类继承后实例化子类,通过继承多态(父类引用指向子类对象)使用 | 不能直接实例化,需类实现后实例化实现类,或通过匿名内部类 (new 接口(){...})快速实例化 |
| 7 | 局限 | 单继承局限(子类只能继承一个抽象类,限制代码复用的灵活性);耦合度较高(继承关系强绑定) | JDK8前仅能定义抽象方法,扩展性弱(JDK8+默认方法已改善);接口契约过多时易导致"接口污染" |
| 8 | 实际作用 | 作为模板封装通用逻辑,定义规范同时提供部分实现(如工具类抽象父类、框架基类) | 作为标准/能力标识 ,定义行为契约解耦代码(如Runnable标识可执行能力、Serializable标识可序列化能力) |
| 9 | 选择原则 | * 优先用接口:避免单继承局限、降低耦合、支持多能力组合 * 用抽象类:需复用代码、提供模板逻辑、依赖构造器/实例变量的场景 | * 优先用接口:定义行为契约、实现多态解耦、适配多场景扩展 * 用抽象类:需保留状态、提供通用实现的场景 |
| 10 | 成员默认修饰符 | 成员变量默认default(包访问权限),方法默认default(可自定义为private/protected/public,抽象方法不能为private) |
成员变量默认public static final,抽象方法默认public abstract;默认方法public default,静态方法public static |
| 11 | JDK版本演进 | 自JDK1.0存在,语法稳定,无重大新增特性 | JDK8新增default/static方法;JDK9新增private方法;JDK16新增密封接口 (sealed),限制实现类范围 |
1)、抽象类代码示例(模板方法模式)
抽象类适合封装通用模板逻辑,固定流程步骤,仅让子类实现可变部分。
java
// 抽象类:定义支付流程的模板
abstract class AbstractPayment {
// 模板方法:固定支付流程(校验→扣款→通知)
public final void pay(double amount) {
// 1. 通用校验逻辑(固定步骤)
if (validateAmount(amount)) {
// 2. 扣款逻辑(可变步骤,子类实现)
boolean result = deduct(amount);
// 3. 通用通知逻辑(固定步骤)
sendNotification(result, amount);
} else {
System.out.println("支付金额校验失败");
}
}
// 通用校验方法(具体实现)
private boolean validateAmount(double amount) {
return amount > 0;
}
// 抽象方法:扣款逻辑(子类必须实现)
protected abstract boolean deduct(double amount);
// 通用通知方法(具体实现)
private void sendNotification(boolean success, double amount) {
if (success) {
System.out.println("支付" + amount + "元成功,已发送通知");
} else {
System.out.println("支付" + amount + "元失败,已发送通知");
}
}
}
// 子类:支付宝支付实现
class AlipayPayment extends AbstractPayment {
@Override
protected boolean deduct(double amount) {
System.out.println("支付宝扣款" + amount + "元");
return true;
}
}
// 子类:微信支付实现
class WechatPayment extends AbstractPayment {
@Override
protected boolean deduct(double amount) {
System.out.println("微信扣款" + amount + "元");
return true;
}
}
// 测试类
public class AbstractClassDemo {
public static void main(String[] args) {
AbstractPayment alipay = new AlipayPayment();
alipay.pay(100.0); // 执行完整支付流程
AbstractPayment wechat = new WechatPayment();
wechat.pay(50.0);
}
}
2)、接口代码示例(策略模式/行为契约)
接口适合定义行为契约,仅约定方法签名,不关注实现,支持多实现解耦。
java
// 接口:支付渠道契约
interface PaymentChannel {
// 抽象方法:支付行为(默认public abstract)
boolean pay(double amount);
// JDK8+ 默认方法:通用日志逻辑(可选重写)
default void logPayment(double amount) {
System.out.println("记录支付日志:金额" + amount + "元");
}
// JDK8+ 静态方法:工具方法
static boolean checkChannelStatus() {
System.out.println("检查支付渠道状态正常");
return true;
}
}
// 实现类:支付宝渠道
class AlipayChannel implements PaymentChannel {
@Override
public boolean pay(double amount) {
System.out.println("支付宝渠道支付" + amount + "元");
return true;
}
// 可选重写默认方法
@Override
public void logPayment(double amount) {
System.out.println("支付宝专属日志:支付" + amount + "元");
}
}
// 实现类:微信渠道
class WechatChannel implements PaymentChannel {
@Override
public boolean pay(double amount) {
System.out.println("微信渠道支付" + amount + "元");
return true;
}
}
// 测试类
public class InterfaceDemo {
public static void main(String[] args) {
// 检查渠道状态(静态方法直接调用)
PaymentChannel.checkChannelStatus();
PaymentChannel alipay = new AlipayChannel();
alipay.pay(100.0);
alipay.logPayment(100.0);
PaymentChannel wechat = new WechatChannel();
wechat.pay(50.0);
wechat.logPayment(50.0);
}
}
3)、代码层面核心差异对比
| 特性 | 抽象类示例体现 | 接口示例体现 |
|---|---|---|
| 继承方式 | 用extends单继承(一个类只能继承一个抽象类) |
用implements多实现(一个类可实现多个接口) |
| 成员修饰符 | 方法可设为private/protected/public,变量默认default权限 |
方法默认public,变量默认public static final(必须初始化) |
| 构造方法 | 抽象类有构造方法(用于初始化父类成员) | 接口无构造方法(不能实例化) |
| 代码复用 | 提供通用实现(如validateAmount、sendNotification),子类复用模板 |
仅定义契约,实现类需自行编写完整逻辑(默认方法可提供基础实现) |
| 设计意图 | 体现「is-a」继承关系(如AlipayPayment是AbstractPayment的一种) |
体现「can-do」能力关系(如AlipayChannel具备PaymentChannel的能力) |
3. enum(枚举定义)
-
核心作用 :定义枚举类,本质是继承
java.lang.Enum的 final 类,用于表示固定的有限值集合(如性别、状态码)。 -
扩展特性
- 枚举常量自带
values()、valueOf()方法。 - 可实现接口、定义构造器与成员方法。
- 枚举常量自带
-
示例
javapublic enum Gender implements Serializable { MALE("男"), FEMALE("女"); private final String desc; // 私有构造器(枚举构造器默认私有) Gender(String desc) { this.desc = desc; } public String getDesc() { return desc; } }
4. @interface(注解定义)
-
核心作用:定义注解(Annotation),是元编程的基础,用于给代码添加元数据。
-
扩展场景 :配合元注解(
@Target、@Retention、@Documented、@Inherited)使用,控制注解的作用范围与生命周期。 -
示例
java@Target(ElementType.METHOD) // 仅能作用于方法 @Retention(RetentionPolicy.RUNTIME) // 运行时保留 public @interface Log { String value() default "操作日志"; // 此处为注解属性默认值,非关键字default }
5. record(Java 16+ 新增,数据载体定义)
-
核心作用 :定义不可变数据载体(Data Carrier),自动生成
equals()、hashCode()、toString()及全参构造器,简化 POJO 编写。 -
示例
javapublic record User(Long id, String name, Integer age) {} // 自动生成构造器、getter、equals、hashCode、toString
6. extends(继承/泛型限定)
-
核心作用:类的单继承、接口的多继承、泛型上界限定。
-
关键限制
- 类只能单继承(避免菱形继承问题),但可以实现多个接口。
- 枚举类默认继承
java.lang.Enum,因此不能再继承其他类。 - 接口可以多继承 (用
extends关联多个父接口)。
-
示例
java// 类单继承 public class Cat extends Animal {} // 接口多继承 public interface Flyable extends Animal, Movable {} // 泛型上界限定 public <T extends Number> double sum(T a, T b) { return a.doubleValue() + b.doubleValue(); }
7. implements(接口实现)
-
核心作用:类实现接口,是多态的主要实现方式。
-
扩展特性 :一个类可以同时实现多个接口,解决了类单继承的限制;实现接口时,可重写
default方法,也可直接使用默认实现。 -
示例
java// 类实现多个接口,重写default方法 public class Bird implements Animal, Flyable { @Override public void eat() { System.out.println("鸟吃虫子"); } // 重写接口的default方法 @Override public void sleep() { System.out.println("鸟站在树枝上睡觉"); } @Override public void fly() { System.out.println("鸟飞行"); } }
8. package(包声明)
- 核心作用:声明类所属的包,用于隔离类名空间,避免类名冲突。
- 命名规范 :采用反向域名(如
com.example.demo),全小写。
9. import(包导入)
- 核心作用:导入其他包的类/接口,简化代码编写。
- 扩展场景
-
普通导入:
import java.util.List; -
静态导入(Java 5+):导入类的静态成员(方法/变量),直接使用无需类名。
javaimport static java.lang.Math.PI; import static java.lang.Math.sqrt; public class Demo { public static void main(String[] args) { System.out.println(PI); // 直接使用静态变量 System.out.println(sqrt(4)); // 直接使用静态方法 } } -
通配符导入:
import java.util.*;(不推荐,易引发类名冲突)
-
10. this(当前对象引用)
-
核心作用 :代表当前对象的引用,用于
- 区分同名的成员变量与局部变量(
this.name = name)。 - 调用当前类的其他构造器(
this()必须是构造器的第一句)。 - 作为方法返回值(链式调用)。
- 区分同名的成员变量与局部变量(
-
示例
javapublic class Person { private String name; public Person() { this("默认名称"); } // 调用带参构造器 public Person(String name) { this.name = name; } // 区分同名变量 public Person setName(String name) { this.name = name; return this; // 链式调用 } }
11. super(父对象引用)
-
核心作用 :代表父类对象的引用,用于
- 调用父类的构造器(
super()必须是构造器的第一句,默认隐式调用父类无参构造器)。 - 访问父类的成员(解决子类与父类成员重名的问题)。
- 调用父类的构造器(
-
示例
javapublic class Cat extends Animal { public Cat() { super("猫"); } // 调用父类带参构造器 @Override public void eat() { super.eat(); // 调用父类的eat方法 System.out.println("猫吃鱼"); } }
12. new(实例化)
- 核心作用:创建对象实例、匿名内部类、数组。
- 扩展场景
- 普通对象:
new Person(); - 匿名内部类:
new Runnable() { ... } - 数组:
new int[5];
- 普通对象:
13. instanceof(类型判断)
-
核心作用:判断对象是否为指定类/接口的实例,是多态类型判断的核心。
-
版本扩展 :Java 16+ 支持模式匹配,直接将对象转型为目标类型,无需强制转换。
-
示例
java// 传统用法 if (obj instanceof String) { String s = (String) obj; System.out.println(s.length()); } // Java16+ 模式匹配 if (obj instanceof String s) { System.out.println(s.length()); // 直接使用s,无需强制转换 }
六、异常处理关键字(5个)
专门用于Java异常的捕获、处理、抛出 ,实现程序的异常容错机制,分为异常捕获、异常抛出两类:
try(尝试执行可能抛出异常的代码)、catch(捕获指定类型的异常并处理)、finally(无论是否捕获异常,最终必执行的代码块)、throw(手动抛出单个异常对象)、throws(声明方法可能抛出的异常类型)
七、泛型相关关键字(2个+约定类型参数)
用于Java泛型编程(Java5+),实现类型参数化,解决类型安全问题,核心为泛型限定关键字,另含约定俗成的类型参数(非关键字,仅规范):
- 核心关键字:
extends(泛型上界限定,限制类型为指定类的子类/接口实现类)、super(泛型下界限定,限制类型为指定类的父类) - 【注意】:
E/T/K/V/N/S/U等为泛型类型参数约定 (非关键字),仅为编程规范,可自定义,如List<String>中的String是实际类型参数。
八、模块化关键字(4个,Java9+新增)
用于Java模块系统 (Module System),实现代码的模块化隔离、依赖管理、资源导出,是Java9+的核心特性,均为新增关键字:
module(定义模块)、opens(模块开放包,允许反射访问)、exports(模块导出包,允许外部访问)、requires(模块依赖,声明依赖其他模块)
九、未使用的保留字(2个,不可作为标识符)
Java保留但从未在任何版本中使用 的关键字,语法上仍被认定为关键字,不能作为自定义标识符 ,未来可能被启用:
const(原本用于定义常量,Java中用final替代)、goto(原本用于无条件跳转,Java中禁止使用,避免程序流程混乱)
十、易混淆的「非关键字特殊值」(3个,可间接使用)
不是Java关键字 ,但为Java内置的字面量/特殊值,具有固定含义,虽不建议作为标识符,但语法上未严格禁止(实际开发中绝对不要使用),需与关键字严格区分:
true(布尔型字面量,真)、false(布尔型字面量,假)、null(引用类型字面量,空引用)
核心总结
- 关键字特性:全小写、固定含义、不可自定义使用,是Java语法的基础组成;
- 修饰符分类:分访问权限修饰符 (控制范围)和非访问修饰符 (修饰特性),二者可组合使用(如
public static final),非访问修饰符default仅在接口中使用,与switch的default为同名不同义关键字; - 版本差异:模块化关键字(
module/opens等)为Java9+新增,default(接口默认方法)、泛型、枚举、注解关键字(enum/@interface等)为Java5+/Java8+新增; - 关键区分:
true/false/null是字面量 而非关键字,const/goto是保留字 未实际使用,均不可作为自定义标识符;注解中default为属性默认值标识,非关键字用法。
Java关键字全表(按字母顺序,共51个有效+2个保留,已补充default)
abstract、assert、boolean、break、byte、case、catch、char、class、const(保留)、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、instanceof、int、interface、long、native、new、null(字面量)、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while、goto(保留)、true(字面量)、false(字面量)
(注:括号内为特殊标识,实际有效关键字49个,2个保留字,3个非关键字特殊值;default为双语义关键字,含非访问修饰符、switch分支两种用法)