如何正确理解完全限定名和规范名的概念?

问题描述 投票:0回答:1

我的问题来自JLS第6.7章末尾的例子:

完全限定名称规范名称之间的区别可以 可以在如下代码中看到:

package p; 
class O1 { class I {} } 
class O2 extends O1 {}

p.O1.I
p.O2.I
都是完全限定名称,表示 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 具有完全限定名称 名字。

谁能给我详细解释一下吗? 感谢您的阅读。

java
1个回答
0
投票

这里的关键字是“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
 的规范名称。

© www.soinside.com 2019 - 2024. All rights reserved.