6

有关受保护访问的 JLS 详细信息中

令 C 为声明受保护成员的类。只有在 C 的子类 S 的主体内才允许访问。

此外,如果 Id 表示实例字段或实例方法,则:

如果通过限定名称 Q.Id 进行访问,其中 Q 是 ExpressionName,则当且仅当表达式 Q 的类型是 S 或 S 的子类时才允许访问。

如果通过字段访问表达式 E.Id(其中 E 是 Primary 表达式)或通过方法调用表达式 E.Id(. . .)(其中 E 是 Primary 表达式)进行访问,则当且仅如果 E 的类型是 S 或 S 的子类。

限定名称字段访问表达式有什么区别?

4

2 回答 2

0

如果表达式名称的格式为 Q.Id,则 Q 已被分类为包名称、类型名称或表达式名称。

字段访问表达式的含义使用与限定名称相同的规则确定,但受限于表达式不能表示包、类类型或接口类型这一事实。

在 oracle 的网站上找到了上面的文字。

所以简单来说:

  1. 限定名称是指在声明中带有父信息的名称。例如Pack1.Pack2.Pack3.Class1 & Pack1.Pack2.Pack4.Class2

Pack4中,我们可以通过以下任一方式 访问Class1 Pack3.Class1Pack2.Pack3.Class1Pack1.Pack2.Pack3.Class1,其中最后一个是完全限定名称。

  1. 字段访问表达式是限定名称的子类型,但正如名称所说,它是用于访问字段

因此,限定名称可能指的是 Packge、Class、Interface 而不是字段,而字段访问表达式只能指字段

参考: 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

于 2013-03-12T07:10:39.463 回答
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

更像是一个字段访问表达式。

于 2013-03-12T06:49:13.353 回答