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