Java中的类inheritance问题,有和没有参数的构造函数

我正在学习Java(二年级IT学生),我遇到了一些问题。 inheritance要准确。 这是代码:

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课程中评论第一个构造函数时,一切正常,但我真的不知道如何在不评论该部分的情况下使其工作。 我想我必须以某种方式从第一个调用构造函数,但不知道如何做到这一点。

保罗,谢谢任何帮助

Pochodna第一个构造函数默认调用super() ,这是Bazowa没有的构造Bazowa

您应该在Pochodna()调用一个带有1或2个参数的基础构造函数,或者在基类中创建一个没有参数的构造函数。

编辑:既然你说你正在学习Java,我会在答案中添加一些额外的解释。

每个类都必须有一个构造函数,所以当你没有显式地声明一个时,编译器会为你这样做,创建一个没有参数的默认构造函数。 如果您明确声明构造函数,则不会添加此构造函数。

在inheritance中,子类是父类的“特化”。 这意味着子类包含父类的属性和行为,并在它们上进行扩展。 但是你不再声明父元素(除非你真的想要覆盖东西)。 因此,当您创建子实例时,必须以某种方式初始化从父项中获取的元素。 为此你有super(...)构造。

在子构造函数中必须要做的第一件事就是调用super(...)以便在子项尝试对它们执行某些操作之前正确初始化从父项中获取的元素(您也可以调用另一个child的构造函数this(...) – 在这种情况下,调用链中的最后一个子构造函数将调用super(...) )。

因此,编译器将再次添加对super()的默认调用 – 没有参数 – 当你不在自己的孩子中这样做时。

Pochodna的第一个构造函数中,由于你没有自己调用super(i)super(j, k) ,默认情况下会调用super() 。 但是在父类中您明确指定了构造函数,因此默认值不是由编译器创建的。 从这里exception,你最终调用一个不存在的构造函数。

希望这样可以更容易地学习inheritance。 干杯。

你需要指定这样的东西:

 Pochodna() { super(0); } 

这里的技巧是,既然你为超类指定了一个构造函数,编译器就不会为你创建一个no-arg构造函数。 当您在超类中创建零arg构造函数时,它会尝试在子类中调用no-arg构造函数,但无法找到任何内容。

简而言之,在构造函数中调用另一个构造函数(在超类或同一个类中)不是可选的。 您可以显式指定另一个构造函数,也可以插入对超类’zero-arg构造函数的调用。

由于基类没有无参数构造函数,因此需要使用super显式调用构造函数,从而提供某种默认值。

例如:

 Pochodna() { super(0); System.out.println("konstruktor pochodny bez parametru"); } 

或者,您可以在基类中创建protected参数构造函数。 它不能从外部直接访问,但派生类将能够使用它。

其他答案处理对超级构造函数的调用。

请注意,您也可以这样做:

 Pochodna() { this(0); System.out.println("konstruktor pochodny bez parametru"); } 

这会把你的其他构造函数称为Pochodna。 只是另一种选择。 研究输出以了解正在发生的事情。

由于父项中不存在默认构造函数,因此必须在子构造函数中调用其他构造函数:

 Pochodna() { super(10); }