当前位置: 首页 > 知识库问答 >
问题:

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

陈哲
2023-03-14

从JLS关于受保护访问的详细信息:

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

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

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

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

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

共有2个答案

苗冯浩
2023-03-14

限定名在类名方面有意义(从静态角度考虑)。其中,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

更像是字段访问表达式。

苗阳文
2023-03-14

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

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

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

简单来说:

  1. 限定名称是指在声明中携带父级信息的名称。例如Pack1。Pack2。Pack3。第一类

在Pack4中,我们可以通过以下任一方式访问Class1 Pack3。第一类或第二类。Pack3。第1类或第1包。Pack2。Pack3。Class1,其中最后一个将是完全限定名。

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

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

参考:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.11http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.5.6.2

 类似资料:
  • 我正在测试上面的代码。两者给我的结果是一样的。我正试图理解第1、2和6行之间的区别。我可以通过这两种方法获得相同的结果。

  • 问题内容: 我是Java的初学者,我想知道Java表达式和语句之间的区别吗? 问题答案: 这是一个例子: 是一个表达而是一个陈述。语句由表达式组成。 这不是特定于Java语言的。许多语言都使用这种语法,例如etc(not )。

  • 问题内容: 在Python中,表达式和语句之间有什么区别? 问题答案: 表达式仅包含标识符,文字和运算符,其中的运算符包括算术运算符和布尔运算符,函数调用运算符 包括预订运算符 等,并且可以简化为某种“值”,可以是任何Python对象。例子: 声明(请参阅 1,另一方面,2)是构成一行(或几行)Python代码的所有内容。注意表达式也是语句。例子:

  • 我目前正试图理解字段之间的差异(https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html)和属性(https://www.elastic.co/guide/en/elasticsearch/reference/current/properties.html). 它们都以某种方式定义为类型/映射

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: 两者的含义使我难以理解。 问题答案: 甲声明引入的标识符和描述了它的类型,无论是类型,对象,或功能。声明是编译器需要接受对该标识符的引用的内容。这些是声明: 甲定义实际实例化/器具该标识符。这是什么样的连接器需要以链接引用这些实体。这些是与上述声明相对应的定义: 可以使用定义代替声明。 可以根据需要多次声明标识符。因此,以下内容在C和C ++中是合法的: 但是,必须定义一次。如果忘记定