gpt4 book ai didi

java - 静态变量和方法是否属于该类的 java.lang.Class 对象?

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:17 24 4
gpt4 key购买 nike

我读过很多关于这个主题的问题,其中许多人说静态内容(静态方法变量)属于java.lang.Class对象(也称为驻留在永久代中的类级对象),其背后的原因是

  1. 在Java规范中,我们可以发现“静态内容属于类的某些内部结构,该结构为所有对象所共有,并且存在于对象之外”。

如Java语言规范第8.3.1.1节所述

If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created. A static field, sometimes called a class variable, is incarnated when the class is initialized (§12.4).

  • java.lang.Class类的对象代表了该类的内部结构,它只存在一个化身,并且它是所有对象所共有的。

  • java.lang.Class 对象在类加载和初始化时在 Perm Gen 中创建。

  • java.lang.Class 被称为类级别对象,静态变量被称为类变量,因为静态变量代表类级别对象的状态。

  • 在同步静态方法时,我们需要获取类级别对象的锁,该对象又是 java.lang.Class 实例。

  • 如第 8.4.3.6 节所述:

    For a class (static) method, the monitor associated with the Class object for the method's class is used.

    从以上几点,我们可以得出结论,静态内容属于java.lang.Class实例,但为什么在任何规范中都没有明确写出它?

    还有 if class A { static int b; } 为什么 b 无法通过 A.class.b 访问?

    那么如何证明静态变量和方法属于Class对象呢?

    如果静态内容不属于 Class 对象,那么它到底属于哪里?为什么很多答案、博客和教程都提到它?

    最佳答案

    §8.3.1.1 Java 语言规范规定如下:

    If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created. A static field, sometimes called a class variable, is incarnated when the class is initialized (§12.4).

    §8.4.3.6说:

    For a class (static) method, the monitor associated with the Class object for the method's class is used.

    它们都没有指定应包含静态字段的对象。

    正如您提到的:

    static content belongs to some internal structure the class which is common to all objects and exist outside of the objects".

    这包括的实例。这些实例描述了部分内部结构,但不包含它们。

    因此,不幸的是,您试图证明的陈述是错误的。

    关于java - 静态变量和方法是否属于该类的 java.lang.Class 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40435102/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com