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

Java构造函数继承

常睿范
2023-03-14
问题内容

我想知道为什么在Java中不继承构造函数?你知道当你上这样的课时:

public class Super {

  public Super(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){
    this.serviceA = serviceA;
    //etc
  } 

}

稍后当你从继承时Super,java会抱怨没有定义默认的构造函数。解决方案显然是这样的:

public class Son extends Super{

  public Son(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){
    super(serviceA,serviceB,serviceC);
  }

}

这段代码是重复的,而不是干的和无用的(IMHO)…因此再次带来了问题:

为什么Java不支持构造函数继承?不允许这种继承有什么好处?


问题答案:

假设构造函数是继承的…则因为每个类最终都派生自Object,所以每个类最终都将带有无参数构造函数。那是个坏主意。你究竟期望什么:

FileInputStream stream = new FileInputStream();

去做?

现在可能应该有一种方法可以轻松地创建相当普遍的“直通”构造函数,但是我认为它不是默认设置。构造子类所需的参数通常与超类所需的参数不同。



 类似资料:
  • 问题内容: 在为期末考试而学习时,我在正在学习的书中遇到了以下陈述。考虑以下代码: 是否必须在类B(super(x))的构造函数中调用类A的构造函数。本书指出这不是强制性的,因为它们具有确切数量和类型的参数。但是,当我在Java编译器中尝试此操作时,会抛出以下错误: 类A中的构造函数A不能应用于给定类型;必需:发现整数:无参数原因:实际和正式参数列表的长度不同 问题答案: 编译器会自动插入开头。

  • 问题内容: 我想要一个构造函数,其参数会自动被所有子类继承,但是Java不允许我这样做 我不希望有写,等等。每个子类。有没有更聪明的方法来解决这个问题? 解决方案#1。构造一个可以在构造函数之后调用的方法。尽管对我的特定设计而言,这是可行的,但是我希望要求用户在构造函数中指定在编译时经过验证的某些参数(例如,不通过varargs / reflection)。 问题答案: 你不能 如果要在基类中有一

  • 人们有时会对类成员函数或成员变量的作用域问题感到困惑,尤其是,当基类与派生类的同名成员不在同一个作用域内时: struct B { void f(double); }; struct D : B { void f(int); }; B b; b.f(4.5); // OK // 调用的到底是B::f(doube)还是D::f(int)呢? // 实际情况往往会让人感到意外

  • 所以,我正在做一个家庭作业,我很难遵循一些指示,我把作业贴在下面: 创建一个由五个类组成的层次结构,加上一个作为变量包含在里面的类: Person有四个字符串变量:姓名,地址,电话,电子邮件 学生是Person的子类,有一个额外的int变量状态,其值为1,2,3或4,代表大一,大二,大三,大四 MyDate有三个int变量,分别为年、月和日 员工是Person的子类,有一个String变量offi

  • 我有一个继承自父类Point的子类行,我没有在子类中使用基类的构造函数,但是我得到了这个错误: '形状。点“不包含接受0个参数的构造函数 这是我的父类: 这是我的孩子班:

  • 本文向大家介绍Java构造函数,包括了Java构造函数的使用技巧和注意事项,需要的朋友参考一下 构造函数与方法相似,但在以下方面有所不同。 它们没有任何返回类型。 构造函数的名称与类的名称相同。 每个类都有一个构造函数。如果我们未为类明确编写构造函数,则Java编译器将为该类建立默认构造函数。 每次创建一个新对象时,将至少调用一个构造函数。 一个类可以具有多个构造函数。 示例 输出结果