1

如果我有一个类,例如在构造函数中初始化的 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

4

5 回答 5

3

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

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

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

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

于 2012-05-27T01:54:42.763 回答
2

您可以只调用 super() - 另外,仅供参考,在您的特定示例中,您甚至不必在子类中编写构造函数,它会隐式调用超类默认构造函数

于 2012-05-27T01:54:22.030 回答
1

默认情况下,子类的默认构造函数会调用超类的默认构造函数,所以你可以写

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

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

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

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

public MySub(){
    super(100);
    // child init
}
于 2012-05-27T01:55:04.990 回答
1

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

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

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

你这样做:

super() 或者

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

或者

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

请参阅使用超级。

于 2012-05-27T01:56:33.863 回答
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{

}
于 2012-05-27T01:57:17.783 回答