【问题标题】:How initialization works of the super class constructor when calling the sub class constructor调用子类构造函数时超类构造函数的初始化如何工作
【发布时间】:2012-06-16 00:44:05
【问题描述】:

假设我有一个父类和一个子类,并调用子类的构造函数。我是否必须同时拥有子构造函数参数和父构造函数参数并使用 super() 来初始化父级。这是否意味着如果我重载了父构造函数,我需要让构造函数匹配每个孩子的构造函数......所以如果我有两个父构造函数

parent(int a);
parent(int a,int b);

和两个子构造函数

child(int c);
child(int c,int d);

我必须让 child(int a) 实际上是两个构造函数的形式

child(int a, int c) 
{
super(a)

c = this.c;
}

child ( int a, int b, int c)
{
super(a,b)

c = this.c;
 }

并且有 child(int c, int d) 实际上有两个构造函数

child(int a, int c, int d)
{
super(a);

c = this.c;
d = this.d;
}

或者我可以通过

child(int a,int b, int c, int d)
{
super(a,b);

c = this.c;
d = this.d;
}

}

【问题讨论】:

    标签: java


    【解决方案1】:

    总是调用父构造函数。如果不是显式的,它将是隐式的。由您来定义调用父构造函数的参数。

    如果 parent 没有提供默认构造函数(不需要任何参数的构造函数),您需要从子类中显式调用它。

    没有什么可以禁止您使用通用构造函数,正如您在 child(int a, int b, int c, int d) 的情况下所评论的那样,并调用父类的构造函数位于 super(a,b)

    如果您在父类上有一些构造函数,并不一定意味着您需要在子类上“传播”它们。

    关于构造函数链接here 有一段很好的文字。

    【讨论】:

    • 如果我使用 super 显式调用父构造函数,我必须在子类构造函数中传递它的所有参数?
    • @ChrisOkyen 您需要从某个地方获取它,例如:如果您的父类需要 (int a, int b) 并且您的子类需要另一个参数,您可以在子类上编写一个构造函数,例如 (int a, int b, String c){super(a,b); this.c = c;}。另一种方法是生成这个值(如果有意义的话......)假设参数 a 对于那个特定的子类总是相同的,所以你可以做类似(int b, String c) {super(3,b); this.c = c;}
    • 谢谢,重载方法似乎真的很重复。
    • 这取决于您的需求 ;)
    【解决方案2】:

    这取决于您要编写多少个重载版本的构造函数,但请记住,如果父类中没有 arg 构造函数,子类的每个构造函数都会隐式调用其 super() 而没有 arg,它会给您编译时错误。但是如果你明确地打电话,你可以调用任何超级构造器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 2016-12-29
      相关资源
      最近更新 更多