我在看下面的代码,发现东西有点怪:
public class Sequence {
Sequence() {
System.out.print("c ");
}
{
System.out.print("y ");
}
public static void main(String[] args) {
new Sequence().go();
}
void go() {
System.out.print("g ");
}
static {
System.out.print("x ");
}
}
我已经期待给编译错误的System.out
与“Y”不属于一个方法声明只是一个{ }
这是为什么有效? 我看不出这个代码将会或应该被调用。
当运行这个它产生xycg
也,为什么static { }
得到序列构造函数之前叫什么名字?
Answer 1:
这个:
static {
System.out.print("x ");
}
是一个静态初始化块 ,并加载的类时被调用。 你可以有很多人在你的类,只要你想,他们会在自己的外表(从上到下)的顺序执行。
这个:
{
System.out.print("y ");
}
是初始化块 ,以及将码被复制到类的每个构造的开始。 所以,如果你有你的类的多个构造函数,他们都需要做共同的东西在他们开始,你只需要编写一次代码,并把它放在一个像这样的初始化块 。
因此,你的输出是非常合情合理的。
如斯坦利下面评论,请参见在Oracle教程部分描述initializaiton块的详细信息。
Answer 2:
它不是一个方法,而是一个初始化块 。
{
System.out.print("y ");
}
它将在构造函数调用之前执行。 而
static {
System.out.print("x ");
}
是当类是由类加载器加载其上执行静态初始化块 。
所以,当你运行你的代码
1.类是由类加载器,以便在执行静态初始化块加载
输出:x被印刷
2.对象被创建,以便执行初始化块,然后constuctor被称为
输出:y被印刷随后c
3.主要方法被调用,这反过来又调用方法去
输出:G是印刷
最终输出:xycg
这可能有助于http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/
Answer 3:
这是一个实例初始化块后跟一个静态初始化块 。
{
System.out.print("y ");
}
得到当你创建一个类的实例调用。
static {
System.out.print("x ");
}
当类是由类加载器加载被调用。 所以,当你做
new Sequence().go();
该类被加载,所以它执行static {}
然后执行实例初始化块{}
事后构造函数体被调用,然后在新创建的实例的方法。 人机工程学输出xycg
。
Answer 4:
static {
System.out.print("x ");
}
是一个静态块和类加载时被调用
{
System.out.print("y ");
}
一个初始化块
你可以在这种情况下它们在它们出现在类的顺序执行一类多初始化块。
需要注意的是存在于类中的任何初始化块构造函数之前执行。
Answer 5:
static {
System.out.print("x ");
}
是由类(由所指示的共享初始化块static
),其首先执行。
{
System.out.print("y ");
}
是由类,其随之而来的的所有对象(构造)共享的初始化块。
Sequence() {
System.out.print("c ");
}
是类,其中执行第三特定的构造函数。 实例初始化块首先每次执行构造时调用。 这就是为什么“Y”时逢“C”之前。
void go() {
System.out.print("g ");
}
只是用上述的构造,这是最后构造的对象相关联的一个实例方法。
Answer 6:
{
System.out.print("y ");
}
这些类型的块被称为initializer block
。 这是执行每次创建实例时class
。 在编译时,该代码被移到类的每一个构造。
如考虑的情况下, static initializer
块: -
static {
System.out.println("x ");
}
它是在类加载执行一次。 我们通常使用static
初始化块时的初始化static
字段,需要多个步骤。
Answer 7:
它被用作任何静态声明之后的初始化块和运行。 它可以被用来确保没有其他人可以创建类的实例(在你可以使用一个私有的构造方法相同)与Singleton设计模式。
Answer 8:
static {
System.out.print("x ");
}
Static blocks
在类被装载并且通过JRE初始化仅执行一次。
和non-static
块会打电话给你要创建一个新的实例 ,它只会在构造函数之前被调用每次 。
如这里你已经创建仅1实例Sequence
构造之后被称为non-static
块,然后该方法,实际上你的目标。
文章来源: Calling a Java method with no name