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

Java 限定名和字段访问表达式之间有什么区别?,java,jls,Java,Jls,从: 设C为声明受保护成员的类。访问权限是 仅允许在C的子类S的主体内使用 此外,如果Id表示实例字段或实例方法,则: 如果通过限定名称Q.Id进行访问,其中Q是 ExpressionName,则仅当类型为 表达式Q的子类是S或S的子类 如果通过字段访问表达式E.Id进行访问,其中E是 主表达式,或通过方法调用表达式E.Id(…), 其中E是主表达式,则如果且 仅当E的类型是S或S的子类时 限定名和字段访问表达式之间有什么区别?限定名在类名方面有意义(从静态角度考虑)。其中,as字段访问表达式类

从:

设C为声明受保护成员的类。访问权限是 仅允许在C的子类S的主体内使用

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

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

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


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

限定名
在类名方面有意义(从静态角度考虑)。其中,as字段访问表达式类似于在类的特定对象(包括方法名)的引用范围内指定
完全限定名

例如:

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
更像是字段访问表达式。

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

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

在oracle的网站上找到上述文本

简单来说:

  • 限定名称是指在声明中携带父级信息的名称。 例如Pack1.Pack2.Pack3.Class1Pack1.Pack2.Pack4.Class2
  • Pack4中,我们可以通过以下任一方式访问Class1 Pack3.Class1Pack2.Pack3.Class1Pack1.Pack2.Pack3.Class1, 其中最后一个将是完全限定名

  • 字段访问表达式是限定名称的子类型,但正如名称所述,它用于访问字段
  • 所以,限定名可以引用包、类、接口,但不能引用字段,而字段访问表达式只能引用字段

    参考: