调用没有名称的Java方法

dav*_*rld 99 java initializer

我正在看下面的代码,发现有点奇怪的东西:

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 ");
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这会给出一个编译错误,因为System.out"y"不属于方法声明只是一个{ }.为什么这个有效?我没有看到这个代码将如何或应该被调用.

当运行它时它也产生x y c g,为什么static { }在序列构造函数之前调用get?

jlo*_*rdo 147

这个:

static {
        System.out.print("x ");
    }
Run Code Online (Sandbox Code Playgroud)

是一个静态初始化块,在加载类时调用.您可以根据需要在课堂上拥有尽可能多的课程,并按照外观(从上到下)执行.

这个:

    {
        System.out.print("y ");
    }
Run Code Online (Sandbox Code Playgroud)

是一个初始化块,代码被复制到类的每个构造函数的开头.因此,如果您的类中有许多构造函数,并且它们都需要在开头做一些常见的操作,那么您只需要编写一次代码并将其放在像这样的初始化块中.

因此,您的输出非常有意义.

正如Stanley在下面评论的那样,请参阅Oracle教程中描述初始化块的部分以获取更多信息.

  • 很好的答案.有关初始化块的更多信息,请参见[http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html](http://docs.oracle.com/javase/tutorial/java/javaOO/initial)的.html) (12认同)
  • `代码被复制到类的每个构造函数的开头 - 这是不正确的.假设构造函数以`super("x");`开头,超级构造函数将在任何初始化块之前执行. (6认同)
  • 是的,对超级构造函数的隐式和显式调用将首先执行,初始化块接下来执行,而不是其余的构造函数代码. (3认同)

xyz*_*xyz 25

它不是一个方法,而是一个初始化块.

 {
    System.out.print("y ");
 }
Run Code Online (Sandbox Code Playgroud)

它将在构造函数调用之前执行.而

static {
        System.out.print("x ");
       }
Run Code Online (Sandbox Code Playgroud)

静态初始化块,在类加载器加载类时执行.

因此,当您运行代码时
1.类由类加载器加载,因此执行静态初始化块
输出:x打印
2.创建对象,以便执行初始化块,然后调用constuctor
输出:y打印后跟c
3.调用main方法,然后调用go方法
输出:g打印

最终输出:xycg
这可能有助于http://blog.sanaulla.info/2008/06/30/initialization-blocks-in-java/


Luc*_*ore 16

这是一个实例初始化块,后跟一个静态初始化块.

{
    System.out.print("y ");
}
Run Code Online (Sandbox Code Playgroud)

在创建类的实例时调用.

static {
    System.out.print("x ");
}
Run Code Online (Sandbox Code Playgroud)

在类加载器加载类时调用.所以,当你这样做

new Sequence().go();
Run Code Online (Sandbox Code Playgroud)

类被加载,因此它执行static {},然后它执行实例初始化块{},然后调用构造函数的主体,然后调用新创建的实例上的方法.Ergo输出x y c g.


Nar*_*hai 15

static {
        System.out.print("x ");
    }
Run Code Online (Sandbox Code Playgroud)

是一个静态块,在类加载期间调用

{
    System.out.print("y ");
}
Run Code Online (Sandbox Code Playgroud)

是一个初始化块

您可以在一个类中有多个初始化块,在这种情况下,它们按照它们在类中出现的顺序执行.

请注意,类中存在的任何初始化块都在构造函数之前执行.


Ter*_* Li 10

static {
      System.out.print("x ");
}
Run Code Online (Sandbox Code Playgroud)

是由类共享的初始化块(如所示static),首先执行该初始化块.

{
        System.out.print("y ");

}
Run Code Online (Sandbox Code Playgroud)

是类的所有对象(构造函数)共享的初始化块,接下来是.

Sequence() {
        System.out.print("c ");
}
Run Code Online (Sandbox Code Playgroud)

是类的特定构造函数,它是第三个执行的.每次执行构造函数时,都会首先调用实例初始化块.这就是"y"出现在"c"之前的原因.

void go() {
        System.out.print("g ");
}
Run Code Online (Sandbox Code Playgroud)

只是一个与使用上面的构造函数构造的对象相关联的实例方法,它最后出现.


Roh*_*ain 9

{
    System.out.print("y ");
}
Run Code Online (Sandbox Code Playgroud)

这些类型的块被称为initializer block.每次创建一个实例时都会执行它class.在编译时,此代码将移动到您的类的每个构造函数中.

static initializer块的情况下: -

static {
    System.out.println("x ");
}
Run Code Online (Sandbox Code Playgroud)

它在加载类时执行一次.我们一般static在初始化static字段时使用初始化块,需要多个步骤.


mal*_*ney 6

它用作初始化块,并在任何静态声明后运行.它可用于确保没有其他人可以像Singleton设计模式一样创建类的实例(与使用私有构造函数的方式相同).