来自JLS details on protected access:
设C是声明受保护成员的类。访问是 只允许在C的子类S的主体内使用。
此外,如果Id表示实例字段或实例方法,则:
如果访问是通过限定名称Q.Id,其中Q是 ExpressionName,当且仅当类型时才允许访问 表达式Q是S或S的子类。
如果访问是通过字段访问表达式E.Id,其中E是a 主表达式,或方法调用表达式E.Id(...), 其中E是主表达式,如果和,则允许访问 只有当E的类型是S或S的子类时。
限定名称和字段访问表达式之间有什么区别?
答案 0 :(得分:0)
qualified name
在类名方面有意义(从静态角度来看)。其中,字段访问表达式就像为包含方法名称的类的特定对象的引用指定Fully Qualified Name
一样。
示例:
public class A
{
public static void method1()
{//does something
}
}
public class B
{
public int dummy;
public void hello()
{
System.out.println("Hello!");
}
}
public class Main
{
public static void main(String[] args)
{
B b = new B();
b.dummy=1;
b.hello();
}
}
如果我们说
,请参阅上述课程A.method1()
它更像是一个合格的名称,其中
b.hello();
b.dummy
更像是一个字段访问表达式。
答案 1 :(得分:0)
如果表达式名称的格式为Q.Id,则Q已被分类为包名称,类型名称或表达式名称。
字段访问表达式的含义是使用与限定名称相同的规则确定的,但受到表达式无法表示包,类类型或接口类型的限制。
在oracle的网站上找到了上述文本。
所以简单来说:
在 Pack4 中,我们可以通过以下任一方式访问 Class1 Pack3.Class1 或 Pack2.Pack3.Class1 或 Pack1.Pack2.Pack3.Class1 , 最后一个是完全合格的名称。
所以合格的名称可以引用Packge,Class,Interface但不是字段,而字段访问表达式只能引用字段
REF: http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.11 http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.5.6.2