【问题标题】:java class object and Typesjava类对象和类型
【发布时间】:2015-07-07 09:11:40
【问题描述】:

给定一个班级

public class A {
  public static int classVal;
}

在运行时,A 类型会成为对class Object 的引用吗?

public static void main(String[] args) {
  A a = new A(); 
  A.classVal = 100;
  A.classVal = 200;
}

如果A.classVal 是对静态类变量的引用,那么A 是对表示类的对象的引用吗?

a.getClass()A 指的是同一个对象吗?

澄清

如果A.classVal 是一个引用,而A 只不过是一个名称,那么一个类是否只是成为使用类名称作为键的查找表的一部分?我试图了解在运行时类会发生什么。

【问题讨论】:

    标签: java class object


    【解决方案1】:

    不,A 根本不是参考。这只是类名。 A 本身并不是一个表达式——它没有值。它只能是另一个表达式的一部分(例如 A.classValnew A())。

    【讨论】:

    • 但是当你调用new A()时,jvm必须know这个怎么查 - 'name space = A', call = '()'...
    • @ThemanontheClaphamomnibus:我建议您查看生成的字节码——但这并不意味着存在“引用A”。 JVM 如何处理所有这些是一个实现细节。
    【解决方案2】:

    首先,

    static 指的是封闭类型而不是实例

    A 不会成为对类 Object 的引用。将为 type 本身创建每个静态成员,如果您尝试使用实例访问静态成员,则在执行期间将为类的所有实例使用相同的副本。

    这里是A.staticMember类名访问Java中静态成员的一种方式。

    【讨论】:

      【解决方案3】:

      没有。 A 是类名,但 A.class 等于 a.getClass()

      【讨论】:

        【解决方案4】:

        不,“A”只是类。它不是参考。 “a”是一个参考对象。因此,如果您想检查类,只需比较:a.getClass() 与 A.class。他们应该是平等的。

        【讨论】:

          猜你喜欢
          • 2010-11-07
          • 2016-03-30
          • 1970-01-01
          • 1970-01-01
          • 2018-09-30
          • 2013-10-16
          • 1970-01-01
          • 1970-01-01
          • 2015-08-14
          相关资源
          最近更新 更多