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

Java 初始化超类成员的正确方法是什么?,java,subclassing,super,Java,Subclassing,Super,如果我有一个类,比如一个HashMap,它是在构造函数中初始化的,就像这样 public class MySuper{ HashMap<String,String> foo; public MySuper(){ foo = new HashMap<String,String>(); } } 所以,我很好奇正确的方法是什么。我必须在MySuper中创建一个单独的方法来进行初始化并调用super吗?我知道这会起作用,但我的印象是,有一种方法可

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

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

   public MySuper(){
      foo = new HashMap<String,String>();
   }
}
所以,我很好奇正确的方法是什么。我必须在MySuper中创建一个单独的方法来进行初始化并调用super吗?我知道这会起作用,但我的印象是,有一种方法可以对我所扩展的类调用super,并让它在其构造函数中执行正常的操作


TIA

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

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

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

但如果您想在代码中强调这一点,可以使用:

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

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

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

但如果您想在代码中强调这一点,可以使用:

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

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

默认情况下,子类的默认构造函数将调用super类的默认构造函数,因此您可以编写

public MySub(){
    // super(); is automatically called at first line, so you no need call it
    // child init
}
或者可以在子构造函数的第一行调用超类的构造函数

public MySub(){
    super();
    // child init
}
若超级类具有您希望调用的构造函数publicmysuperint i,那个么您可以编写

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

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

public MySub(){
    // super(); is automatically called at first line, so you no need call it
    // child init
}
或者可以在子构造函数的第一行调用超类的构造函数

public MySub(){
    super();
    // child init
}
若超级类具有您希望调用的构造函数publicmysuperint i,那个么您可以编写

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

你通常不需要做任何事情

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

如果在超类中没有无参数构造函数,或者希望调用另一个重载版本,则必须通过超显式调用,否则代码将无法编译,因为必须调用超类构造函数,并且如果默认的无参数构造函数不可用,VM不知道调用哪个重载

你可以这样做:

超级 或


参见

你通常不需要做任何事情

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

如果在超类中没有无参数构造函数,或者希望调用另一个重载版本,则必须通过超显式调用,否则代码将无法编译,因为必须调用超类构造函数,并且如果默认的无参数构造函数不可用,VM不知道调用哪个重载

你可以这样做:

超级 或


请参见

如果要在子构造函数中包含代码,应将超级句子添加为第一行。如果要在子构造函数中包含代码,应将超级句子添加为第一行。等等,你是说即使我不调用super foo,它也会在我的子类中初始化并准备好使用?这太棒了,但是现在我不太清楚super的意义是什么,如果你除了默认构造函数之外没有其他东西。我经常在人们的代码中看到它,但肯定有其他一些构造函数,他们通过调用一个没有参数的裸体超级来显式避免?这可能是他们的编码风格。如果您不这样做,Java编译器会自动插入调用。我通常只在希望显式调用带有args的超类构造函数时使用super。。。如果super类没有默认构造函数,那么您必须显式调用super。我认为,如果您没有,编译器会捕捉到这一点t@Dr.Dredel:即使没有必要,为了可读性,也可以将其明确无误。等等,你是说即使我不调用super foo,它也会在我的子类中初始化并准备好使用?这太棒了,但是现在我不太清楚super的意义是什么,如果你除了默认构造函数之外没有其他东西。我经常在人们的代码中看到它,但肯定有其他一些构造函数,他们通过调用一个没有参数的裸体超级来显式避免?这可能是他们的编码风格。如果您不这样做,Java编译器会自动插入调用。我通常只在希望显式调用带有args的超类构造函数时使用super。。。如果super类没有默认构造函数,那么您必须显式调用super。我认为,如果您没有,编译器会捕捉到这一点t@Dr.Dredel:即使没有必要,也可以将其明确化
事实上,super不一定是第一个语句。在它之前根本不可能有任何威胁,唉,定义威胁是相当复杂的。实际上,super不一定是第一个声明。在它之前根本没有任何威胁,而且,唉,定义威胁是相当复杂的。有人觉得有一种强烈的冲动要否决它是荒谬的,但我把它否决了,所以现在它是零。希望有人会提醒那个人,他/她曾经也是一个初学者,就像我们所有人一样;你应该叫super而不是super.MySuper。而且,同样如上所述,除非您需要提供一个不同于子构造函数的parm列表的参数列表,否则您不需要显式调用super。而且我总是需要一段时间才能记住,它只是Java的super-太多语言在我脑海中舞动,而且它们每个都做得不同。是的。。。我总是惊讶于这些反对票中的一些人是多么卑鄙!我是说。。。这是一个完全合理的问题,我努力证明我自己已经摸索并试图解决它,但真的。。。这个网站的全部目的不是为了让每个人都不用重新发明每一辆自行车吗?碰巧,我不是初学者。。。我只是不太使用Java,所以这里的语法很难理解。无论如何我真的很感谢你的帮助!谢谢大家。对于离题感到抱歉,请注意@Dr.Dredel:我不是说你一般都是初学者,只是从某种意义上说,你已经脱离了Java实践——就像几个月前我一样,直到我需要刷新/学习它;如果一个人不使用语言,他不练习是正常的;所以,我认为,投反对票的人真的很狭隘。离题演讲的结束有人觉得有人强烈要求投反对票是荒谬的,但我投了反对票,所以现在是零。希望有人会提醒那个人,他/她曾经也是一个初学者,就像我们所有人一样;你应该叫super而不是super.MySuper。而且,同样如上所述,除非您需要提供一个不同于子构造函数的parm列表的参数列表,否则您不需要显式调用super。而且我总是需要一段时间才能记住,它只是Java的super-太多语言在我脑海中舞动,而且它们每个都做得不同。是的。。。我总是惊讶于这些反对票中的一些人是多么卑鄙!我是说。。。这是一个完全合理的问题,我努力证明我自己已经摸索并试图解决它,但真的。。。这个网站的全部目的不是为了让每个人都不用重新发明每一辆自行车吗?碰巧,我不是初学者。。。我只是不太使用Java,所以这里的语法很难理解。无论如何我真的很感谢你的帮助!谢谢大家。对于离题感到抱歉,请注意@Dr.Dredel:我不是说你一般都是初学者,只是从某种意义上说,你已经脱离了Java实践——就像几个月前我一样,直到我需要刷新/学习它;如果一个人不使用语言,他不练习是正常的;所以,在我看来,下层选民真的是心胸狭窄。离题的结束