2

我不小心在所有方法之外制作了一对 {} 并且工作了。

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

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

当然,如果您运行此代码,结果是“ddd”,并且仅当我创建它的新实例时它才会写入“ttt”。

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

这有什么实际用途吗?为什么有人会在没有构造函数或没有书面构造函数的情况下使用它?

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

4

7 回答 7

4

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

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

在您的情况下,简单地放置{}意味着您正在创建一个代码块而不是命名,因此它会给出错误。但是放入{}一个方法会很好。

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

请参阅此链接以获取 Java 教程网站中的初始化程序块

于 2013-04-25T10:05:19.910 回答
3

这有什么实际用途吗?

有一个使用实例初始化程序块的“习惯用法”:

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

这是创建使用给定条目集初始化的映射的简洁方法。当你分解它时,它是在声明和实例化一个匿名子类,HashMap它使用实例初始化块来填充新映射。


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

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

于 2013-04-25T10:06:52.020 回答
2

这都是关于 初始化程序块的

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

{

// will execute when intialization

}

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

于 2013-04-25T10:05:12.783 回答
1

这些被称为初始化块。它们与所有构造函数一起被调用。所以任何构造函数调用都会调用这段代码。

仅在加载类时才调用静态块。

于 2013-04-25T10:04:14.263 回答
1

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

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

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

来源:这里

于 2013-04-25T10:07:22.523 回答
0

这在java中称为初始化块

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

大多数情况下,这用于初始化类中的某些内容,如果您使用任何构造函数,则每次都需要初始化这些内容。

例如:让我们假设您的班级中有 3 个构造函数。
一个初始化 IO。
第二个初始化套接字等。
并且您想为您的类初始化一些实例变量,无论您使用哪个构造函数。所以为此你有2个解决方案:

  1. 将初始化代码放入每个构造函数中。
  2. 使用初始化块并将这些变量放入其中,每次调用任何构造函数时都会初始化这些变量。
于 2013-04-25T10:07:21.750 回答
0

它可能不熟悉,但它本身并不坏。它是在构造时执行的初始化程序块。有关更详细的说明,请参见此处,其中还包括静态初始化块。

于 2013-04-25T10:08:03.203 回答