从JLS关于受保护访问的详细信息:
让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已被分类为包名称、类型名称或表达式名称。
字段访问表达式的含义是使用与限定名称相同的规则确定的,但受到表达式不能表示包、类类型或接口类型这一事实的限制。
在甲骨文的网站上找到了上面的文字。
简单来说:
在Pack4中,我们可以通过以下任一方式访问Class1 Pack3。第一类或第二类。Pack3。第1类或第1包。Pack2。Pack3。Class1,其中最后一个将是完全限定名。
因此,合格的名称可以引用包、类、接口,但不能引用字段,而字段访问表达式只能引用字段
参考: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 ++中是合法的: 但是,必须定义一次。如果忘记定