初始化超类成员的正确方法是什么?

时间:2012-05-27 01:50:34

标签: java subclassing super

如果我有一个类,例如在构造函数中初始化的HashMap就像这样......

public class MySuper{
   HashMap<String,String> foo;

   public MySuper(){
      foo = new HashMap<String,String>();
   }
}

我的印象(这是不正确的)是我只需要在子类中调用super并进行相同的初始化,但Eclipse对以下语法不满意...

 public class MySub extends MySuper{
      public MySub(){
         super.MySuper()
      }
   }

所以,我很好奇这样做的正确方法是什么。我是否必须在MySuper中创建一个单独的方法来进行初始化并调用super? (我知道这会起作用),但我的印象是,有一种方法可以在我正在扩展的类上调用super,并让它做它在构造函数中通常做的任何事情。

TIA

5 个答案:

答案 0 :(得分:3)

从子类自动调用超类的无参数构造函数。

但是如果你想在你的代码中强调它,你可以使用:

 public class MySub extends MySuper{
      public MySub(){
         super();
      }
   }

super()必须是构造函数体的第一个语句。

答案 1 :(得分:2)

你可以只调用super() - 也就是fyi,在你的特定例子中,你甚至不必在子类中编写构造函数,它会隐式调用超类的默认构造函数

答案 2 :(得分:1)

默认情况下,子类的默认构造函数将调用超类的默认构造函数,因此您只需编写

public MySub(){
    // super(); is automatically called at first line, so you no need call it
    // child init
}

或者你可以在子构造函数的第一行调用superclass的构造函数

public MySub(){
    super();
    // child init
}

如果超级类有你想要调用的构造函数public MySuper(int i),你可以写

public MySub(){
    super(100);
    // child init
}

答案 3 :(得分:1)

你通常不需要做任何事情。

调用子类构造函数时,会自动调用超类无参数构造函数。

如果你在超类中没有无参数构造函数,或者你想调用另一个重载版本,那么你必须通过super显式调用(否则你的代码将无法编译,因为超类必须调用构造函数,如果默认的no-arg构造函数不可用,则VM将不知道调用哪个重载。)

你这样做:

super()

 public class MySub extends MySuper{
      public MySub(){
         super();
      }
   }

 public class MySub extends MySuper{
      public MySub(int a, int b){
         super(a, b);
      }
   }

请参阅using super.

答案 4 :(得分:1)

You have no need to call super.MySuper() because super classe's default constructor always invoke implicitly because the first line of child class's constructor is super() by default.

public class MySuper{
   HashMap<String,String> foo;

   public MySuper(){
      foo = new HashMap<String,String>();
   }
}

public class MySub extends MySuper{

}