合格名称和字段访问表达式有什么区别?

6
根据JLS关于protected访问的详细信息
  • 类C中声明的protected成员只允许在其子类S中使用。
  • 如果Id表示实例字段或实例方法,则:
    • 如果访问是由限定名称Q.Id完成的,其中Q是ExpressionName,则当表达式Q的类型为S或S的子类时,访问才被允许。
    • 如果访问是通过字段访问表达式E.Id完成的,其中E是一种Primary expression,或者是通过方法调用表达式E.Id(...)完成的,其中E是一种Primary expression,则仅当E的类型为S或S的子类时,访问才被允许。
“限定名称”和“字段访问表达式”之间有什么区别?
2个回答

0

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

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

在Oracle网站上发现了以上文本。

因此,简单来说:

  1. 限定名称意味着在声明中携带父级信息。例如:Pack1.Pack2.Pack3.Class1Pack1.Pack2.Pack4.Class2

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

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

因此,限定名称可以引用包、类、接口,但不能引用字段,而字段访问表达式只能引用字段。

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


0

限定名称在类名方面是有意义的(以静态方式考虑)。而字段访问表达式则类似于针对特定类对象的引用中指定完全限定名称,包括方法名称。

例如:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接