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

为什么我需要在这里显式编写一个构造函数?

凤柏
2023-03-14
问题内容

这就是我遇到问题的方式。我举一个例子:

package check;

public class Check {
  int a,b;
  Check (int i,int j) {
    a = i;
    b = j;
  }
}

这可以。现在,我想通过扩展创建一个子类Check。所以我写道:

class V extends Check {

}

一写完,Eclipse中就出现了一个十字架,单击它,我发现了一条消息:

implicit super constructor Check() is undefined for default constructor. Must define an explicit constructor.

我用谷歌搜索了问题并添加了

V (int i, int j) {
  super(i, j);
}

Eclipse也建议这样做。现在我有两个问题。

  1. 为什么必须强制使用构造函数class V?AFAIK不需要创建构造函数,因为JAVA编译器会自动创建默认构造函数以继续其操作。同样从消息中,似乎还需要一个默认的构造函数,但不是我编写的,但是正如我所说的,JAVA不会自动创建它吗?
  2. 另一件事,我将子类中的代码更改为V(int i, int j){ super.a=i; super.b=j}。,但是仍然出现错误。这是为什么?这段代码不super.a=i; super.b=j一样super(i,j)吗?另外,在V类中,我可能不需要使用b,那么为什么我需要通过构造函数对其进行初始化?

问题答案:

1)为什么必须对V类完全使用构造函数?AFAIK不需要创建构造函数,因为JAVA编译器会自动创建默认构造函数以继续其操作。同样从消息中,似乎还需要一个默认的构造函数,但不是我编写的,但是正如我所说的,JAVA不会自动创建它吗?

仅当不存在其他构造函数时才创建默认构造函数,当您创建该构造函数时,将Check(int i,int j)删除默认构造函数。

如果在构造函数中未包含对super的调用,则java会super()默认尝试进行调用。但是,由于父类中没有默认构造函数,因此无法执行此操作。

这种行为是好的,因为您可能不需要默认的构造函数。某些变量可能 必须
初始化才能使对象正常运行。因此,需要一种删除默认构造函数的方法,这是通过显式创建构造函数来完成的。

2)另一件事,我将子类中的代码更改为V(int i,int j){super.a = i; super.b =
j}。,但是我仍然遇到错误。这是为什么?这个代码不是super.a = i; super.b =
j与super(i,j)一样吗?另外,在V类中,我可能不需要使用b,那么为什么我需要通过构造函数对其进行初始化?

代码

V(int i, int j){ 
   super.a=i; super.b=j
}

仍然没有对父构造函数的调用,因此变成

V(int i, int j){ 
   super();
   super.a=i; super.b=j
}

再一次,super()不存在

必须存在对super的一些调用才能“设置”对象的父部分,一直到Object(所有对象隐式扩展)。因此,您不能仅仅因为您在子构造函数中执行了等效的操作就忽略了父构造函数



 类似资料:
  • 问题内容: 这对您来说可能听起来很愚蠢,但是为什么我需要在s中定义一个空的构造函数? 我看到的每个教程都说:每个实体都需要一个空的构造函数。 但是Java总是给您一个默认的不可见的空构造函数(如果您不重新定义一个的话)。 谢谢。 我认为这是一个语义问题。我所理解的“需求”是书面的。 含义:始终在您的实体中编写一个空的构造函数。 例: 但是,当您不重新定义Java时,Java总是会为您提供一个空的构

  • 问题内容: 如果您尝试封送引用了没有no-arg构造函数的复杂类型的类,例如: 与Java一起的JAXB实现,如下所示: JAXB会抛出一个 现在,我了解了为什么JAXB在解组时需要no-arg构造函数-因为它需要实例化该对象。但是为什么JAXB在编组时需要no-arg构造函数? 另外,还有一个问题,为什么Java的JAXB实现会在字段为null时抛出异常,并且无论如何都不会将其编组? 我是否缺少

  • 问题内容: 我对此代码有疑问:https : //github.com/reactjs/redux/blob/master/examples/async/containers/App.js 特别: 我猜这是一个两部分的问题。 为什么我需要将句柄更改设置为类的实例,我不能只对handleChange使用静态函数并直接在类中调用它 ? 我不知道这是怎么回事: 谢谢 问题答案: 以相反的顺序回答… 返回

  • 问题内容: 必须使用无参数构造函数(像Hibernate这样的工具会在此构造函数上使用反射来实例化对象)。 我得到了这个手挥手的答案,但是有人可以进一步解释吗?谢谢 问题答案: hibernate,并且通常通过反射创建对象的代码用于创建类的新实例。此方法需要一个公共的无参数构造函数才能实例化该对象。对于大多数用例,提供无参数构造函数不是问题。 有一些基于序列化的技巧可以解决没有no-arg构造函数

  • 我试图将构造函数注入模式应用于CDI应用程序中的bean,但遇到以下错误消息: 的确,为了使用构造函数注入模式,我有意地设计了一个需要参数的构造函数的类: 通过查看不可代理bean类型的CDI规范,我看到: 3.15.不可修复的bean类型 容器使用代理提供某些功能。容器不能代理某些合法bean类型: 没有不带参数的非私有构造函数的类, 被宣布为最终的类, 具有非静态的、具有公共可见性、受保护可见

  • 我是的新手,我正在练习。我创建了一个本地分支,但我发现当我执行时,我的分支没有上传到存储库。我实际上必须做:。 这是为什么?分支不是默认要推送的新变化吗?为什么我需要运行第二个命令?