当前位置: 首页 > 面试题库 >

子类中Java静态块的执行

裴楚青
2023-03-14
问题内容

我正在准备进行Java认证测试,并且发现了一个与Java静态块的执行有关的有趣问题。我已经花了很多时间阅读有关此主题的内容,但是找不到所需的答案。

我知道将类加载到JVM或调用main方法时会执行静态块,但是…

package oneClassTasks;

class Parent {
    static int age;
}

class Child extends Parent {
    static {
        age = 5;
        System.out.println("child's static block");
    }
}

public class XXX {

    public static void main(String args[]) {
        System.out.println("Child age is : "+ Child.age);
    }

}

输出为:

Child age is : 0

如果我在中包含详细输出-verbose:class,则输出为:

...
[Loaded java.html" target="_blank">security.BasicPermissionCollection from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded oneClassTasks.XXX from file:/D:/temp/bin/]
[Loaded sun.launcher.LauncherHelper$FXHelper from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded java.lang.Class$MethodArray from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded java.lang.Void from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded oneClassTasks.Parent from file:/D:/temp/bin/]
[Loaded oneClassTasks.Child from file:/D:/temp/bin/]
Child age is : 0
[Loaded java.lang.Shutdown from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]
[Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jre1.8.0_161\lib\rt.jar]

我们可以在这里看到 Child类已加载 到JVM中。

有人可以解释 为什么Child类的静态块没有执行吗?


问题答案:

您看到Child该类已加载,但尚未初始化。

由于是类的成员,因此访问Child.age不会导致Child类的初始化。因此,只有class被初始化,并保持。age``Parent``Parent``age``0

12.4.1。发生初始化时

类或接口类型T将在以下任何一种首次出现之前立即初始化:

  • T是一个类,并创建T的实例。

  • 调用由T声明的静态方法。

  • 分配由T声明的静态字段。

  • 使用由T声明的静态字段,并且该字段不是常量变量(第4.12.4节)

  • T是顶级类(第7.6节),并执行词法嵌套在T中的断言(第14.10节)(第8.1.3节)。

在您的情况下,您访问了由声明的静态字段Parent,因此仅Parent被初始化。



 类似资料:
  • 问题内容: 这是代码 我期望的输出是: 但实际上是: 看来Child类中的静态块没有得到执行,但是为什么呢?这是反直觉的,不是吗? 补充: 为了更清楚,我列出了 2 __以下 1 分: 正如@axtavt所说,根据JLS 12.4.1,类Child已加载,但未初始化。 但是@Alexei Kaigorodov指出,根据 jvms-5.5,应初始化Child类,因为对Child类执行了getstat

  • 问题内容: 前几天,我在查看一些代码,然后发现: 来自C ++,我不知道为什么会这样。它不是错误,因为代码编译良好。这个“静态”代码块是什么? 问题答案: 这是一个静态初始化器。它是在加载类时执行的(确切地说是初始化,但通常不会注意到它们之间的区别)。 可以将其视为“类构造函数”。 请注意,还有一些实例初始化器,它们看起来一样,只是它们没有static关键字。当创建对象的新实例时,除了构造函数中的

  • 问题内容: 有什么像在Java中吗? 这样的课是什么意思。静态类的所有方法都需要吗? 是否需要反过来,如果一个类包含所有静态方法,那么该类也应该是静态的吗? 静态类有什么用? 问题答案: Java具有静态嵌套类,但听起来你正在寻找顶级静态类。Java无法将顶级类设为静态,但是你可以像这样模拟静态类: 声明你的课程-阻止扩展课程,因为扩展静态课程没有意义 创建构造函数-防止通过客户端代码实例化,因为

  • 静态类有什么好处?

  • 我已经编写了以下代码,并为这个超类创建了对象。 当我检查输出时,如下所示: 我知道只有在初始化类的对象或进行任何静态引用时,才会执行静态块。但在这里,我并没有把这些都带到课堂上。那么为什么我会看到“sub”即sub类的静态块输出?

  • 问题内容: 我有一个充满实用程序功能的类。实例化它的实例没有语义,但是我仍然想调用它的方法。处理此问题的最佳方法是什么?静态课?抽象? 问题答案: 标记为final的类上的私有构造函数和静态方法。