为什么要执行父类init块?

时间:2015-10-29 09:29:12

标签: java

据我所知,init block是一个在任何构造函数之前执行的块,只要该构造函数用于创建object.But为什么规则在这里是矛盾的......

class SuperClass
{
    SuperClass()
    {
        System.out.println("Super Class constructor");
    }

    {
        System.out.println("Init block of super class");
    }
}

class Child extends SuperClass
{
    Child()
    {
        super();
        System.out.println("Child Class constructor");
    }

    public static void main(String s[])
    {
        Child c1=new Child();
    }
}

这里,由于只形成子类对象,为什么父类的init块被调用呢?

3 个答案:

答案 0 :(得分:4)

listView.setAdapter(nameOrderedAdapter); 依赖于父类Child。它从父级获取/继承属性。因此,要构建子项,必须首先构造父项。这就是调用SuperClass的init块和构造函数的原因。

答案 1 :(得分:1)

您可以阅读JLS 12.5了解此主题。检查初始化顺序的步骤3和4

  
      
  1. 此构造函数不以同一类中另一个构造函数的显式构造函数调用开头(使用此方法)。如果此构造函数用于Object以外的类,则此构造函数将以超类构造函数的显式或隐式调用开始(使用super)。使用这五个相同的步骤评估参数并递归处理超类构造函数调用。如果该构造函数调用突然完成,则此过程突然完成,原因相同。否则,请继续执行步骤4.

  2.   
  3. 为此类执行实例初始值设定项和实例变量初始值设定项,将实例变量初始值设定项的值按从左到右的顺序分配给相应的实例变量,在这些顺序中它们以文本方式出现在源代码中类。如果执行任何这些初始值设定项导致异常,则不会处理其他初始化程序,并且此过程会突然完成同样的异常。否则,请继续步骤5.

  4.   

答案 2 :(得分:0)

一般遵循此规则,

A班{} B类延伸A {}

在这种情况下,

当B-object实例化时,调用顺序同样是

B-Constructor - > A的构造函数 - >在A的构造函数调用A的All-Initialization块之前执行,然后执行A的构造函数然后返回B的构造函数,就像它的工作原理一样。

所以,在你的情况下,

首先调用Child-constructor的子对象, 但在转到它之前,它转到了SuperClass构造函数,在第一步之前,如果有任何初始化块,那么它就完成了 - 这就是它。

所以SuperClass初始化块首先执行SuperClass的构造函数,最后执行Child Constructor。