Java class 初始化

Java class initialization

下面的代码实际上做了什么?

MyClass desc = new MyClass(){
            {
                setName("A");
                setAge(20);
            }
        };

它只是创建 MyClass 实例然后调用它的内部方法吗?

我觉得它做了更多的事情,例如,使用称为初始化块的方法创建一个匿名 class。

谁能解释一下?

此代码创建了 MyClass 的匿名子 class 的实例。它包含一个实例初始化块,该块在创建实例时执行。

相当于:

public class SubClass extends MyClass
{
    {
        setName("A");
        setAge(20);
    }
}

MyClass desc = new SubClass ();

(除了这里的 sub-class 不是匿名的)。

而这段代码等同于:

public class SubClass extends MyClass
{
    public SubClass ()
    {
        super ();
        setName("A");
        setAge(20);
    }
}

MyClass desc = new SubClass ();

因为实例初始化块被复制到 class 的每个构造函数的开头。

Does it simply create MyClass instance and then calls the inner methods on it?

实例初始化块用于初始化实例数据成员。

{
   setName("A");
   setAge(20);
}

关于初始化块和构造函数的执行顺序有一定的规则。让我们先把它们列出来,然后写一个简单的程序来验证一下。

Initialization blocks run in the order they appear in the program.
Instance initialization blocks run whenever a new instance of class is created.

read more