【问题标题】:What is the difference between qualified name and a field access expression?限定名称和字段访问表达式有什么区别?
【发布时间】:2013-02-27 14:06:09
【问题描述】:

来自JLS details on protected access

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

另外,如果Id表示实例字段或实例方法,那么:

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

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

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

【问题讨论】:

    标签: java jls


    【解决方案1】:

    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
    

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

    【讨论】:

      【解决方案2】:

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

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

      在 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

      【讨论】:

        猜你喜欢
        • 2021-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多