调用不带名称的 Java 方法

2022-08-31 10:13:10

我正在查看下面的代码,发现一些奇怪的东西:

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 gstatic { }


答案 1

这:

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

是一个静态初始化块,在装入类时调用。你可以在你的类中拥有任意数量的它们,它们将按照它们的外观顺序(从上到下)执行。

这:

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

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

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

正如 Stanley 在下面所评论的那样,有关详细信息,请参阅 Oracle 教程中描述初始块的部分


答案 2

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

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

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

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

静态初始化块,在类装入器装入类时执行。

因此,当您运行代码时

  1. 类由类装入器装入,因此执行静态初始化块
    输出:x 打印
  2. 创建对象,以便执行初始化块,然后构造函数称为
    输出:打印y,然后打印c
  3. 调用 Main 方法,而调用 go 方法
    输出:g 被打印

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


推荐