You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:47:38