为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

陪伴而非守候 2024-01-17 17:08:05
考虑最简单的例子。我们有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当前上下文中不存在,我们如何访问属性?
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

类名可以在源代码中用作许多不同表达式的一部分。这并不意味着类名本身就是一个对象;而是意味着类名本身就是一个对象。它只是意味着名称本身可以用作更大表达式的一部分。这些不是“属性”或属性;而是“属性”。它们是其他语法结构,用于形成具有许多不同部分的表达式。

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上面描述的。这并不意味着类型名称通常可以用作其自己的对象。类型名称只能作为较大表达式的一部分,否则可能不相关。


查看完整回答
反对 回复 2024-01-17
?
翻阅古今

TA贡献1780条经验 获得超5个赞

Foo是一种类型Foo.class是一个代表类型的对象。

instanceof运算符将对象作为其第一个参数,将类型作为其第二个参数。Foo不能作为第一个参数,因为它不是一个对象 - 它是一种类型。

至于为什么你可以这样做Foo.class……好吧,这就是 Java 语法的工作方式。Class类本身的结构在运行时是已知的,并由该类的所有实例共享的对象表示。语法.class是访问该对象的一种方法。


查看完整回答
反对 回复 2024-01-17
  • 2 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信