java - 调用没有名称的 Java 方法

标签 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 ");
    }
}

我预计这会产生编译错误,因为带有“y”的 System.out 不属于方法声明,而只是 { }。为什么这是有效的?我看不出应该如何调用这段代码。

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

最佳答案

这个:

static {
    System.out.print("x ");
}   

是一个静态初始化 block ,在类加载时被调用。您可以在您的类(class)中拥有任意数量的它们,并且它们将按照它们的出现顺序(从上到下)执行。

这个:

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

是一个初始化 block ,代码被复制到类的每个构造函数的开头。因此,如果您的类有很多构造函数,并且它们都需要在开始时做一些共同的事情,那么您只需要编写一次代码并将其放入像这样的初始化 block 中。

因此您的输出非常有意义。

作为 Stanley评论如下,见the section in the Oracle tutorial describing initializaiton blocks了解更多信息。

关于java - 调用没有名称的 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13699075/

相关文章:

java - 在线程 "main"java.lang.NoClassDefFoundError : org/hibernate/cache/spi/support/DomainDataRegionImpl中

java - 将变量从 Android 应用程序传递到 MYSQL

java - java中未排序数组列表中的最小元素

swift - 我该如何处理这个初始值设定项?

java - 如何使用jsf上传文件?

java - 对集合中的项目求和以获得目标值的方法数量 - 顺序很重要

python - 实际需要 global_variables_initializer() 时

c# - 是否可以将 c# 对象初始值设定项与工厂方法一起使用?

c++ - 使用相等运算符初始化对象

c++ - 当作为指向结构的指针的成员传递时,将 C 数组清零