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

时间:2013-03-12 06:33:54

标签: java jls

来自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的子类时。

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

2 个答案:

答案 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的网站上找到了上述文本。

所以简单来说:

  1. 合格名称表示在声明中包含父信息。 例如 Pack1.Pack2.Pack3.Class1 &的 Pack1.Pack2.Pack4.Class2
  2. Pack4 中,我们可以通过以下任一方式访问 Class1 Pack3.Class1 Pack2.Pack3.Class1 Pack1.Pack2.Pack3.Class1 , 最后一个是完全合格的名称。

    1. 字段访问表达式是限定名称的子类型,但如名称所示,它用于访问字段
    2. 所以合格的名称可以引用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