如何理解Java完全限定名与规范名?解惑JLS示例疑问
Java规范中Canonical Name与Fully Qualified Name的差异解析
核心概念与规则差异
Fully Qualified Name(完全限定名)
完全限定名是任何能唯一定位到目标类型的名称路径,只要通过该路径可以在当前上下文找到对应的类,就属于完全限定名。它的核心是“可定位”,允许通过继承、嵌套等任意有效访问路径构建——同一个类可能存在多个完全限定名。
Canonical Name(规范名)
规范名是类的原生定义路径,用于唯一标识类的声明位置,每个类最多只有一个规范名(匿名类、本地类等无规范名)。它的核心是“原生声明”,必须严格遵循类的声明层次:从顶级类开始,沿着该类被直接声明的外层类链拼接,不允许通过继承路径推导。
针对示例的具体分析
先看示例代码:
package p; class O1 { class I {} } class O2 extends O1 {}
为什么p.O2.I不是规范名?
你提到的JLS 6.7规则“成员类M在有canonical name的C中则M有canonical name”,这里的C必须是M被直接声明的外层类,而非继承了包含M的类的子类。
在示例中,I是直接声明在O1中的成员类,并非O2的直接成员——O2只是通过继承获得了对I的访问权限。因此,I的规范名只能基于其原生声明类O1的规范名拼接,即p.O1.I;而p.O2.I是通过继承路径构建的访问名,不符合规范名“原生声明路径”的要求。
两者的具体差异对比
p.O1.I:既是完全限定名,也是规范名。它严格对应I的声明层次,是I的原生定义路径。p.O2.I:只是完全限定名。它能通过O2的继承关系定位到I,但并非I的原生声明路径,因此不是规范名。
内容的提问来源于stack exchange,提问作者user24723440
相关产品推荐
相关产品推荐

