我意外地在所有方法之外制作了一对{}并且工作了。
public static void main(String[] args) {
System.out.println("ddd");
}
{
System.out.println("ttt");
}
当然,如果你运行这段代码,结果就是“ddd”,只有当我创建一个新的实例时它才会写“ttt”。
如果我成功static {System.out.println("ttt");}
它按设计工作,结果是“ttt”然后“ddd”
这有什么实际用途吗?为什么有人会将它与构造函数或没有书面构造函数一起使用?
我的印象是:它似乎有效,但闻起来像是糟糕而奇怪的做法。我是对的吗?
答案 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)
实例变量的初始化程序块看起来就像静态初始化程序块,但没有静态关键字:
{
// will execute when intialization
}
Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。
答案 3 :(得分:1)
这些称为初始化程序块。它们与所有构造函数一起被调用。因此任何构造函数调用都将调用此代码。
只有在加载类时才会调用静态块。
答案 4 :(得分:1)
通常,您必须将代码放在构造函数中初始化实例变量。使用构造函数初始化实例变量有两种选择:initializer blocks
和final methods
。
实例变量的初始化程序块看起来就像静态初始化程序块,但没有静态关键字:
Java compiler
将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。
来源:here
答案 5 :(得分:0)
这在java中称为初始化块
初始化块是在创建类的对象之前执行的大括号之间的代码块。由于初始化块的执行取决于对象的创建,我们可以很容易地猜测它有两种类型的对象。
大多数情况下,如果你使用任何构造函数,这用于初始化你想要初始化的类中的一些东西。
Ex:让我们在你的课堂上假设你有3个构造函数
第一次一次初始化IO。
第二一个初始化套接字等。
并且您想要为您的类初始化一些实例变量,无论您使用哪个构造函数都无关紧要。因此,您有2个解决方案:
答案 6 :(得分:0)
可能不熟悉,但本身并不坏。它是一个在构造时执行的初始化程序块。有关包含静态初始化块的更详细说明,请参阅here。