在构造函数中调用this()时调用super()

时间:2015-08-02 19:05:05

标签: java constructor

我知道构造函数中的第一个语句必须是super()(或this()),如果没有明确指定,编译器会为我们插入它。考虑到这一点,请参阅下面的代码:

    class Building {
            Building() {  System.out.print("b ");  }
            Building(String name) {

       }
     }
     public class House extends Building {
      House() {  System.out.print("h ");  }
      House(String name) {
        this();   System.out.print("hn " + name);
      }
      public static void main(String[] args) { new House("x "); }
     }

在main方法中,我调用了House类的重载构造函数,该构造函数接受一个String参数。由于this()已被调用,这意味着super()被非法调用。但是Building(String name)构造函数会发生什么?它也不必被调用吗?我知道这段代码有效并产生b h hn x但是不需要调用超类的匹配构造函数吗?

2 个答案:

答案 0 :(得分:3)

您需要调用基类的一个,也就是一个构造函数。在您的示例中,正如您所说的那样,将调用Building类的无参数构造函数。单参数构造函数不会被调用。

不需要在基类构造函数和派生类构造函数之间匹配参数名称或类型。

答案 1 :(得分:1)

让我们在代码的每一行添加数字,以便更容易解释指针执行代码的位置:

    1 class Building {
    2     Building() { System.out.print("b ");  }
    3     Building(String name) { } 
    4 }
    5
    6 public class House extends Building {
    7
    8     House() {  System.out.print("h ");  }
    9     House(String name) { this(); System.out.print("hn " + name); }
   10 
   11     public static void main(String[] args) { new House("x "); }
   12 }

当您致电new House("x ");时,会发生以下情况:

/*11*/ new House("x ") --              --> "b h hn x"
                        |             |
                /*9*/ this(); System.out.print("hn " + name); /* House(name) */ 
                        |             ^
                        v             |
                /*8*/ super(); System.out.print("h ");        /* House() */
                        |             ^
                        v             |
                /*2*/ super(); System.out.print("b ");        /* Building() */
                        |             ^
                        v             |
                      super() -------->                       /* Object() */  
            /* The super of Object() does nothing. let's go down. */

and all these calls will print : "b h hn x" as expected :)

每当你创建一个构造函数时,如果你没有明确地调用另一个构造函数,那么,super();被称为

(在您的情况下,Building的构造函数)。