我的问题来自JLS第6.7章末尾的例子:
完全限定名称和规范名称之间的区别可以 可以在如下代码中看到:
package p;
class O1 { class I {} }
class O2 extends O1 {}
和p.O1.I
都是完全限定名称,表示 I 级成员,但只有p.O2.I
是其规范名称。p.O1.I
我不太明白为什么
p.O2.I
不是一个规范名称。
根据6.7:
每个原始类型、命名包、顶级类和顶级 接口有一个规范名称:
• 对于每个基本类型、命名包、顶级类和顶级 级别接口,规范名称与完全限定名称相同 名字。
每个成员类、成员接口和数组类型都可以有一个 规范名称:
• 在另一个类中声明的成员类或成员接口 M 或 接口 C 具有规范名称当且仅当 C 具有规范名称 名字。
我的理解是
p.O2.I
是“在另一个类C中声明的成员类或接口M”,类O2
是顶级类,因此它有一个规范名称p.O2
。那么根据规则,为什么p.O2.I
不是规范名称?
此外,我也看不出规范名称和完全限定名称之间的区别(与前面引用的段落相比):
每个成员类、成员接口和数组类型都可以有一个 完全 合格名称:
• 另一个类或接口 C 的成员类或成员接口 M 具有完全限定名称当且仅当 C 具有完全限定名称 名字。
谁能给我详细解释一下吗? 感谢您的阅读。
这里的关键字是“declared in”。比较:
另一个类或接口 C 的成员类或成员接口 M 具有完全限定名称当且仅当 C 具有完全限定名称。
在这种情况下,M 的完全限定名称由 C 的完全限定名称、后跟“.”和 M 的简单名称组成。
与
在另一个类或接口 C 中声明的成员类或成员接口 M 当且仅当 C 具有规范名称时才具有规范名称。
在这种情况下,M 的规范名称由 C 的规范名称、后跟“.”和 M 的简单名称组成。
I
是
O1
的成员类,由于继承,它也是
O2
的成员类。但是
I
是仅在
O1
中声明。
O2
中未声明。更具体地说,
I
的声明位于
O1
的主体中,而不是
O2
。因此,
p.O2.I
不是
I
的规范名称。