当前位置: 首页 > 面试题库 >

如果父类具有带参数的构造函数,为什么默认构造函数是必需的?

陈畅
2023-03-14
问题内容

如果父类中有带参数的构造函数,为什么需要默认构造函数(显式)

class A {    
  A(int i){    
  }
}

class B extends A {
}

class Main {    
  public static void main(String a[]){
    B b_obj = new B();
  }
}

这将是一个错误。


问题答案:

这里有两个方面的工作:

  • 如果 确实 明确指定了构造函数(如中所述A),则Java编译器将 不会 为您创建无参数构造函数。

  • 如果您未明确指定构造函数(如所示B),则Java编译器将为您创建一个无参数的构造函数,如下所示:

        B()
    {
        super();
    }

(可访问性取决于类本身的可访问性。)

试图调用超类无参数构造函数-因此它必须存在。您有三种选择:

  • 在以下位置显式提供无参数的构造函数 A
  • 显式提供无参数构造函数,在B该构造函数中,使用适当的int参数显式调用基类构造函数。
  • 提供一个参数化的构造函数,在B其中调用基类的构造函数


 类似资料:
  • 若类有参数化的构造函数,为什么Java不提供默认构造函数?考虑下面的例子 这里我明确需要添加默认构造函数。有什么原因,为什么Java没有为具有参数化构造函数的类提供默认构造函数?

  • 问题内容: 以下是两种方法: 具有所有类属性的构造函数 优点:我必须输入确切数量的参数类型,所以如果出现错误,编译器会警告我(顺便说一句,有什么方法可以防止错误地在参数列表中切换两个Integer的问题?) 缺点:如果我有很多属性,则实例化行可能会变得很长,并且可能跨越两行或更多行 setter和默认的空构造函数 优点:我可以清楚地看到自己的设置,因此,如果我做错了什么,我可以在键入时立即查明它(

  • 问题内容: 我有两个类,和,扩展了前一个类。 具有以下构造函数: 我将注意到所有实例变量都已设置为private。 同时,具有以下构造函数: 但是,这为我的构造函数引发了“找不到符号”错误。 我尝试使用,但是我的超类的私有范围阻止了这种情况。 我发现向我的构造函数中添加字段并允许我调用超级构造函数,但是我想知道是否存在一种无需在子类构造函数中传递其所有参数的情况下调用超级构造函数的方法? 问题答案

  • 在C#、C和Java中,当你创建一个带参数的构造函数时,默认的无参数构造函数就消失了。我一直只是接受这个事实,但现在我开始想为什么。 这种行为的原因是什么?这仅仅是一个“安全度量/猜测”,说“如果你已经创建了自己的构造函数,你可能不希望这个隐含的函数四处游荡”?或者它有一个技术原因,使得编译器不可能在你自己创建构造函数后添加一个?

  • 当Java中给出参数构造函数时,为什么默认的无参数构造函数会失败? 这个设计有什么意义? 例如:

  • 实际上,我不明白无参数构造函数和默认构造函数的区别是什么。 在创建名为cFrame的Test对象时,是否调用此类的默认构造函数?