【问题标题】:Static Block in Java [duplicate]Java中的静态块[重复]
【发布时间】:2011-02-25 23:29:03
【问题描述】:

前几天我正在查看一些代码,结果发现:

static {
    ...
}

来自 C++,我不知道为什么会出现这种情况。它不是错误,因为代码编译得很好。这个“静态”代码块是什么?

【问题讨论】:

    标签: java static


    【解决方案1】:

    这是一个static initializer。它在类加载(或初始化,准确地说,但您通常不会注意到差异)时执行。

    可以认为是“类构造函数”

    请注意,还有instance initializers,它们看起来相同,只是它们没有static 关键字。当创建对象的新实例时,这些代码会在构造函数中的代码之外运行

    【讨论】:

    • 那么为什么要使用非静态实例初始化器而不是简单地使用类构造函数(我认为这在匿名类中很有用)?
    • @Jori:一个常见的原因是,如果您有多个单独的构造函数(不要只是“重定向”到一个规范的构造函数)并且您希望所有这些构造函数有一些共同的初始化。
    • 使代码更清晰,更少重复。制定 Java 规范的人有时会让事情变得更加混乱,但几乎总是有他们这样做的根本原因。流操作,有人吗?
    • 执行顺序为:静态初始化、实例初始化、构造函数
    • @SomeoneSomewhere 虽然“实例初始化器,构造器”相互跟随,但“静态初始化器”可能早就执行过了。但你是对的,最初的顺序是这样的。事实上,它是“SI,II,C,II,C,II,C,......”。
    【解决方案2】:

    这是一个代码块,当类被类加载器加载时执行。它旨在对类的静态成员进行初始化。

    也可以编写非静态初始化器,看起来更奇怪:

    public class Foo {
        {
            // This code will be executed before every constructor
            // but after the call to super()
        }
    
        Foo() {
    
        }
    }
    

    【讨论】:

    • 这看起来像一个普通构造函数。
    • @DerGolem 我认为他指的是普通构造函数上方的大括号。
    • 甚至没有注意到... ;) 是的,很奇怪!
    【解决方案3】:

    它是一个静态初始化器。它在类加载时执行,是放置静态变量初始化的好地方。

    来自http://java.sun.com/docs/books/tutorial/java/javaOO/initial.html

    一个类可以有任意数量的静态初始化块,它们可以出现在类主体的任何地方。运行时系统保证静态初始化块按照它们在源代码中出现的顺序被调用。

    如果你有一个带有静态查找图的类,它可能看起来像这样

    class MyClass {
        static Map<Double, String> labels;
        static {
            labels = new HashMap<Double, String>();
            labels.put(5.5, "five and a half");
            labels.put(7.1, "seven point 1");
        }
        //...
    }
    

    这很有用,因为上述静态字段无法使用labels = ... 进行初始化。它需要以某种方式调用 put-method。

    【讨论】:

    • @aioobe 我知道这可能没有必要,但是如果不接触静态初始化器,就永远不会了解它们。此外,在某些情况下,不鼓励在声明中初始化类成员(我工作过的一些公司),建议在静态块或构造函数中初始化它们(对于非静态成员)。
    • 我明白了。为什么会气馁?就我个人而言,我发现声明中的成员初始化非常容易阅读和维护。我认为强制它们进入构造函数可能是一个坏主意,特别是如果你有多个构造函数并且需要重复初始化。 (例如,如果您从 ArrayList 更改为 LinkedList,则需要记住在多个位置进行更改。)
    • 如你所说,我们需要在每个构造函数中重复初始化代码。如果我们在实例初始化器中初始化它们,那将是最好的。
    • "运行时系统保证静态初始化块按照它们在源代码中出现的顺序被调用。"静态块中的代码必须在类的构造函数之前首先执行
    • @PhilipRego,静态初始化器在某些情况下很有用。例如,在匿名类中,没有构造函数可将实例初始化放入其中。
    【解决方案4】:

    静态块用于初始化代码,将在 JVM 加载类时执行。请参阅下面的链接,其中给出了详细说明。 http://www.jusfortechies.com/java/core-java/static-blocks.php

    【讨论】:

    • 您的链接不可用
    • @user7294900 检查这个link
    【解决方案5】:

    一个静态块在任何程序的生命周期中执行一次, 静态块的另一个特性是它在 main 方法之前执行。

    【讨论】:

      【解决方案6】:

      静态块也可以用来表明程序可以在没有主函数的情况下运行。

      //static block
      //static block is used to initlize static data member of the clas at the time of clas loading
      //static block is exeuted before the main
      class B
      {
          static
          {
              System.out.println("Welcome to Java"); 
              System.exit(0); 
          }
      }
      

      【讨论】:

      • 只有在版本 7 之前,如果你想运行代码,你必须编写一个 main。
      【解决方案7】:

      是的,静态块用于初始化代码,它将在 JVM 开始执行时加载。

      在以前的java版本中使用了静态块,但在最新版本中它不起作用。

      【讨论】:

      • 不是在 JVM 启动时而是在加载类时。 JVM 使用类加载机制,因此它在使用类时加载,而不是在 JVM 启动之前,也永远不会在 JVM 启动时加载
      • 静态块适用于所有 Java 版本。我正在使用 Java 14,它工作正常。
      猜你喜欢
      • 2012-10-30
      • 2014-04-16
      • 2013-04-30
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 2011-06-02
      • 2012-09-15
      • 2012-06-03
      相关资源
      最近更新 更多