没有签名或名称的成员函数 - Java

Member Function with no Signature or Name - Java

所以我正在为我的大学寻找一个 Java 项目,我们正在使用的代码具有我以前从未见过的这种语法:

public abstract class Machinery {
    protected String name="default Computer";
    protected int weight=0;  
    protected static int num_of_Machineries;
    
    //int counter=0;
    static String kevo="     ";
    {
        num_of_Machineries++;
        System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
        System.out.println("Machinery construction call Baby!");
        print(this);
    }

}

据我了解,这就像默认构造函数一样工作。谁能证实或否认我的怀疑?

那是 instance initializer

它实际上是一个内联到构造函数 (*) 开头的代码块,而不是构造函数本身。

因为这个class没有明确的构造函数,编译器给它一个默认的构造函数。默认构造函数调用 super(),因此实例初始化程序被内联到其中。

实际上与以下内容相同:

public abstract class Machinery {
    protected String name="default Computer";
    protected int weight=0;  
    protected static int num_of_Machineries;
    
    //int counter=0;
    static String kevo="     ";

    public Machinery() {
        // Invoke the default super constructor.
        super();

        // Inline body of instance initializer.
        num_of_Machineries++;
        System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
        System.out.println("Machinery construction call Baby!");
        print(this);

        // Rest of constructor body (which is empty).
    }

}

除非你有充分的理由 (**) 使用实例初始化器(我会说你没有,如果你不知道它是什么),最好定义一个显式的构造函数并将实例初始化程序中的代码放在那里。

注意:您可能不想在 initializer/constructor 中执行 print(this);:在执行此操作时,您的实例尚未完全初始化,因此这可能会产生一些意想不到的效果.


(*) 它被内联到所有(隐式或显式)调用 super(...); 的构造函数中。它没有内联到调用 this(...); 的构造函数中,因为它们必须(最终)调用调用 super(...); 的构造函数,而您只希望初始化代码执行一次。

(**) 我能想到的唯一好理由是避免在两个或多个 super(...) 调用构造函数之间重复代码;但即便如此,您也可以经常用方法来编写它。如果没有实例初始化程序,你真正无法做到的唯一情况是有多个 super(...) 调用构造函数初始化 co-dependent final 字段。罕见,可能是您应该重新考虑 class.

的迹象