除了任何方法之外,{}的目的是什么?

时间:2013-04-25 10:01:21

标签: java initialization

我意外地在所有方法之外制作了一对{}并且工作了。

public static void main(String[] args) {
    System.out.println("ddd");
}

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

当然,如果你运行这段代码,结果就是“ddd”,只有当我创建一个新的实例时它才会写“ttt”。

如果我成功static {System.out.println("ttt");}它按设计工作,结果是“ttt”然后“ddd”

这有什么实际用途吗?为什么有人会将它与构造函数或没有书面构造函数一起使用?

我的印象是:它似乎有效,但闻起来像是糟糕而奇怪的做法。我是对的吗?

7 个答案:

答案 0 :(得分:4)

{}定义模块或代码块的范围(如方法,静态块,类等)

每个模块都应该有一个名称,可以从其他模块中识别它。

在你的情况下,简单地放{}意味着你正在创建一个代码块而不是命名,因此它会给出错误。但是将{}放在方法中可以正常工作。

但是当你在它之前添加static关键字时,你正在创建一个在java中具有特殊含义的静态块。这意味着当您的类第一次加载时,static块内的所有内容都将被执行。

See this link for initializer blocks from Java Tutorials website

答案 1 :(得分:3)

  

这有什么实际用途吗?

有一个“成语”使用了实例初始化程序块:

 Map mymap = new HashMap() {{put("a", 1); put("b", 2);}};

这是创建使用给定条目集初始化的地图的简明方法。当你将其分解时,它会声明并实例化HashMap的匿名子类,它使用实例初始化程序块来填充新地图。


  

我的印象是:它似乎有效,但闻起来像是一种糟糕而奇怪的做法。

这是一个主观陈述。对于初始化程序块不好/奇怪,我能想到的唯一合理的论点是人们不使用它们。而这种说法有点循环逻辑。

答案 2 :(得分:2)

全部关于Initializer blocks

实例变量的初始化程序块看起来就像静态初始化程序块,但没有静态关键字:

{

// will execute when intialization

}

Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。

答案 3 :(得分:1)

这些称为初始化程序块。它们与所有构造函数一起被调用。因此任何构造函数调用都将调用此代码。

只有在加载类时才会调用静态块。

答案 4 :(得分:1)

通常,您必须将代码放在构造函数中初始化实例变量。使用构造函数初始化实例变量有两种选择:initializer blocksfinal methods

实例变量的初始化程序块看起来就像静态初始化程序块,但没有静态关键字:

Java compiler将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。

来源:here

答案 5 :(得分:0)

这在java中称为初始化块

  

初始化块是在创建类的对象之前执行的大括号之间的代码块。由于初始化块的执行取决于对象的创建,我们可以很容易地猜测它有两种类型的对象。

大多数情况下,如果你使用任何构造函数,这用于初始化你想要初始化的类中的一些东西。

Ex:让我们在你的课堂上假设你有3个构造函数   第一次一次初始化IO。
  第二一个初始化套接字等。
并且您想要为您的类初始化一些实例变量,无论您使用哪个构造函数都无关紧要。因此,您有2个解决方案:

  1. 在每个构造函数中放置初始化代码。
  2. 使用初始化块并将这些变量放入其中,每次构造函数调用时都会初始化这些变量。

答案 6 :(得分:0)

可能不熟悉,但本身并不坏。它是一个在构造时执行的初始化程序块。有关包含静态初始化块的更详细说明,请参阅here