Java中的类继承问题,带参数和不带参数的构造函数
我正在学习Java(IT二年级学生),我有一个小问题。确切地说是继承。代码如下:Java中的类继承问题,带参数和不带参数的构造函数,java,class,inheritance,oop,Java,Class,Inheritance,Oop,我正在学习Java(IT二年级学生),我有一个小问题。确切地说是继承。代码如下: class Bazowa { public Bazowa(int i) { System.out.println("konstruktor bazowy 1"); } public Bazowa(int j, int k) { System.out.println("konstruktor bazowy 2")
class Bazowa
{
public Bazowa(int i)
{
System.out.println("konstruktor bazowy 1");
}
public Bazowa(int j, int k)
{
System.out.println("konstruktor bazowy 2");
}
}
class Pochodna extends Bazowa
{
/* Pochodna()
{
System.out.println("konstruktor pochodny bez parametru");
} */
Pochodna(int i)
{
super(i);
System.out.println("konstruktor pochodny z parametrem");
}
}
Pochodna类扩展了Bazowa类,我的练习是创建一个只有带参数的构造函数的超类和一个同时具有两种类型(带和不带)的子类
当我对Pochodna类中的第一个构造函数进行注释时,一切都很好,但如果不对该部分进行注释,我真的不知道如何使它工作。我想我必须从第一个构造函数开始调用构造函数,但我不知道如何去做
任何帮助都将不胜感激,
Paul您需要指定如下内容:
Pochodna()
{
super(0);
}
这里的技巧是,由于您为超类指定了构造函数,编译器不会为您创建无参数构造函数。当您在超类中创建零参数构造函数时,它尝试调用子类中的无参数构造函数,但找不到任何内容
简而言之,在构造函数中调用另一个构造函数(在超类中或在同一个类中)不是可选的。要么显式指定另一个构造函数,要么将插入对超类“zero arg构造函数”的调用。默认情况下,来自
Pochodna
的第一个构造函数调用super()
,一个在Bazowa
中没有的构造函数
您应该在Pochodna()
中使用1或2个参数调用一个基构造函数,或者创建一个基类中没有参数的构造函数
编辑:既然你说你正在学习Java,我将在我的回答中添加一些额外的解释
每个类都必须有一个构造函数,因此当您没有显式声明构造函数时,编译器会为您这样做,创建一个没有参数的默认构造函数。如果显式声明构造函数,则不会添加此构造函数
在继承中,子类是父类的“专门化”。这意味着子类包含父类的属性和行为,并对其进行扩展。但是您不会再次声明父元素(除非您真的想覆盖这些内容)。因此,当您创建子对象的实例时,从父对象获取的元素也必须初始化。为此,您有了super(…)
构造
子构造函数中必须包含的第一件事是调用super(…)
,以便在子构造函数尝试使用父构造函数之前正确初始化从父构造函数中获取的元素(您也可以调用另一个子构造函数this(…)
–在这种情况下,调用链中的最后一个子构造函数将调用super(…)
)
因此,当您自己在子对象中不这样做时,编译器将再次为您添加对super()
(无参数)的默认调用
在Pochodna
的第一个构造函数中,由于您自己没有调用super(i)
或super(j,k)
,因此默认情况下会调用super()
。但是在父类中,您显式指定了构造函数,因此默认值不是由编译器创建的。从这里开始,例外情况是,您最终调用了一个不存在的构造函数
希望这能让学习继承变得更容易。干杯。由于基类没有无参数构造函数,您需要使用
super
显式调用构造函数,并提供某种默认值
例如:
Pochodna()
{
super(0);
System.out.println("konstruktor pochodny bez parametru");
}
或者,您可以在基类中创建一个受保护的无参数构造函数。它不能从外部直接访问,但派生类可以使用它。其他答案处理对超级构造函数的调用 请注意,您也可以这样做:
Pochodna() {
this(0);
System.out.println("konstruktor pochodny bez parametru");
}
这将调用另一个Pochodna构造函数。只是另一种选择。研究输出以了解发生了什么。由于父构造函数中不存在默认构造函数,因此必须调用子构造函数中的其他构造函数:
Pochodna() {
super(10);
}