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

在Java中使用花括号的奇怪行为

谷梁俊楚
2023-03-14
问题内容

当我运行以下代码时:

public class Test {

  Test(){
    System.out.println("1");
  }

  {
    System.out.println("2");
  }

  static {
    System.out.println("3");
  }

  public static void main(String args[]) {
    new Test();
  }
}

我希望按以下顺序获得输出:

1
2
3

但是我得到的却是相反的顺序:

3
2
1

谁能解释为什么输出顺序相反?

================

另外,当我创建多个的实例时Test

new Test();
new Test();
new Test();
new Test();

静态块 在第一次执行。


问题答案:

这完全取决于初始化语句的执行顺序。您的测试表明此顺序为:

  1. 静态初始化块
  2. 实例初始化块
  3. 建设者

编辑

感谢您的评论,现在我可以引用JVM规范中的相应部分。这是详细的初始化过程。



 类似资料:
  • 我一直在看到奇怪的方括号,无法找到和有关可能存在的内容的信息,日志看起来像这样: 正如您所看到的,在日志级别后面有带逗号的括号,在某些时候,括号中的信息如下所示: 无法真正找到可能是什么,我使用的是默认的Spring启动日志记录模式,是否可以在不重新声明日志记录模式的情况下错误地使用MDC?如果是MDC问题,那么为什么括号中的任何值看起来像这样: 我使用的记录器是Slf4j

  • 我在做Maven项目。我用log4j做了一个日志。但它在给定的文件中显示了一些starnge日志。我试图理解,为什么会出现这种奇怪的日志,但我不明白。请帮助我,为什么这些不需要的行会进入日志文件。 请帮我把这个拿开。 log.properties 我通过阅读这个链接创建了这个文件。 代码是 日志txt-(log.txt的一些起始行)

  • 问题内容: 我正在看书,有一些带有花括号的程序示例 例如 问题答案: 这是一个代码块。在其中声明的变量在上部代码块(这些curl之外的方法体)中不可见,即它们的作用域更加有限。

  • 问题内容: 有时在角形中我看到花括号,但有时没有。我搜索了很多,但找不到正确的问题 带花括号 不带花括号 什么我问的是,为什么我们不能写为 为什么有2不同的语法和? 问题答案: 它仅取决于“声明”所使用指令的方式。 如果指令具有以下声明: 那么,您不必使用双胡须,因为该指令需要一个对象 如果指令的声明如下: 然后,它期望一个值。如果您的值来自javascript变量,则必须使用大括号将包含在变量中

  • 所以我更新了代码,添加了行所做的是将主线程置于Hibernate状态一段时间,因此jvm可以获得一些时间来创建一个新线程。我正在得到我的预期输出