Java 规范名称

2025年8月24日 | 阅读 3 分钟

什么是规范名称?

规范名称就是名称的标准形式。在Java中,规范名称是类名与包名组合在一起的名称。它通常在import语句中使用。例如,java.lang.Character 是 Character 类的规范名称。

当 javac 编译器完全了解类路径时,它会在编译时通过冲突的完全限定类名和包名来强制执行规范名称在类路径中的唯一性。

请注意,类的规范名称与完全限定名称并不相同。它们之间存在细微差别。

对于每个基本类型、命名包、顶级类和顶级接口,规范名称与其完全限定名称相同。除此之外,每个成员类、成员接口和数组类型都可能有规范名称。

  • 声明在另一个类或接口 (C) 中的成员类或成员接口 (M) 仅当 C 具有规范名称时才具有规范名称。在这种情况下,成员类或成员接口的规范名称由另一个类或接口的规范名称后跟点(.)以及成员类或成员接口的简单名称组成。
  • 当且仅当其组件类型具有规范名称时,数组类型也可能具有规范名称。在这种情况下,数组类型的规范名称由数组类型的组件类型的规范名称后跟“[]”组成。

如何获取 Java 类的规范名称?

Java 的 Class 类提供了三种不同的方法来获取类名。

  • getSimpleName(): 返回不带包名的类名。
  • getName(): 返回带有完整包名的类名。
  • getCanonicalName(): 返回类的规范名称。

Class.getCanonicalName() 方法

该方法返回指定类的规范名称。如果类没有规范名称,则返回 null

语法

让我们来看一个查找类规范名称的 Java 程序。

CanonicalName.java

输出

The canonical name of the Class is: CanonicalName

规范名称和完全限定名称之间的相似性

  • 局部类没有完全限定名称和规范名称。
  • 每个基本类型、命名包、顶级类和顶级接口都有完全限定名称和规范名称。
  • 每个成员类、成员接口和数组类型都可能有一个完全限定名称。例如,double 类型数组的完全限定名称是 double[]。

规范名称和完全限定名称之间的区别

以下代码片段清楚地区分了规范名称和完全限定名称。

p1.A.Bp1.C.B 都是表示成员类 B 的完全限定名称。但只有 p1.A.B 是其规范名称。