为什么类在 Java 中没有定义符号,除非您访问它们的属性?

考虑最简单的例子。我们有

public class Foo {}

因此我们可以说

Foo.class // ==> class Foo

因此,按理说Foo应该是 a java.lang.Class,因为我们显然可以访问它并且可以在当前上下文中操纵它。然而

Foo instanceof java.lang.Class

引发错误

cannot find symbol
  symbol:    variable Foo
Foo instanceof java.lang.Class
^-^

不过,这与 instanceof 本身无关;只是

Foo

单独在 OpenJDK shell 中会产生相同的错误。

Foo如果Foo当前上下文中不存在,我们如何访问属性?


陪伴而非守候
浏览 46回答 2
2回答

莫回无

类名可以在源代码中用作许多不同表达式的一部分。这并不意味着类名本身就是一个对象;而是意味着类名本身就是一个对象。它只是意味着名称本身可以用作更大表达式的一部分。这些不是“属性”或属性;而是“属性”。它们是其他语法结构,用于形成具有许多不同部分的表达式。JLS 定义了如何Foo使用“TypeName”,例如,在第 15 章中形成表达式。具体来说:第 15.8.2 节,类文字。类型名称{[ ]} 。class第 15.8.4 节,限定 this,以访问词法封闭类。类型名称.this第 15.11 节, 字段访问表达式,将词法封闭类作为超类进行访问。类型名称. super。标识符第 15.12 节, 方法调用表达式,调用静态方法。类型名称. [类型参数]标识符([参数列表])类型名称. super。[类型参数]标识符([参数列表])第 15.13 节,方法引用表达式,引用稍后可能调用的封闭类的方法。类型名称 . super:: [类型参数] 标识符它也可能是适用于其他表达式的“参考类型”,例如:第 15.16 节, 强制转换表达式,创建强制转换表达式。(参考类型{ AdditionalBound })UnaryExpressionNotPlusMinus第 15.20.2 节,类型比较运算符instanceof,使用instanceof.关系表达式 instanceof 引用类型类型名称有特定的用途,例如Foo上面描述的。这并不意味着类型名称通常可以用作其自己的对象。类型名称只能作为较大表达式的一部分,否则可能不相关。

翻阅古今

Foo是一种类型。Foo.class是一个代表类型的对象。该instanceof运算符将对象作为其第一个参数,将类型作为其第二个参数。Foo不能作为第一个参数,因为它不是一个对象 - 它是一种类型。至于为什么你可以这样做Foo.class……好吧,这就是 Java 语法的工作方式。Class类本身的结构在运行时是已知的,并由该类的所有实例共享的对象表示。语法.class是访问该对象的一种方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java