paw*_*ior 4 java oop inheritance class
我正在学习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 Pochodna extends Bazowa
{
/* Pochodna()
{
System.out.println("konstruktor pochodny bez parametru");
} */
Pochodna(int i)
{
super(i);
System.out.println("konstruktor pochodny z parametrem");
}
}
Run Code Online (Sandbox Code Playgroud)
因此,Pochodna类扩展了Bazowa类,我的练习是创建一个超类,它只包含带参数的构造函数和一个具有两种类型(有和没有)的子类.
当我在Pochodna课程中评论第一个构造函数时,一切正常,但我真的不知道如何在不评论该部分的情况下使其工作.我想我必须以某种方式从第一个调用构造函数,但不知道如何做到这一点.
保罗,任何帮助都会受到赞赏
小智 8
你Pochodna
默认调用的第一个构造函数super()
,一个你没有的构造函数Bazowa
.
您应该调用其中一个带有1或2个参数的基础构造函数Pochodna()
,或者在基类中创建一个没有参数的构造函数.
编辑:既然你说你正在学习Java,我会在答案中添加一些额外的解释.
每个类都必须有一个构造函数,所以当你没有显式声明一个时,编译器会为你这样做,创建一个没有参数的默认构造函数.如果您明确声明构造函数,则不会添加此构造函数.
在继承中,子类是父类的"特化".这意味着子类包含父类的属性和行为,并在它们上进行扩展.但是你没有再次声明父元素(除非你真的想要覆盖东西).因此,当您创建子实例时,必须以某种方式初始化从父项中获取的元素.为此你有super(...)
结构.
在子构造函数中必须要做的第一件事是调用,super(...)
以便在子项尝试对它们执行某些操作之前正确初始化从父项中获取的元素(您也可以调用另一个子项的构造函数this(...)
- 在这种情况下) ,调用链中的最后一个子构造函数将调用super(...)
).
因此,编译器将再次super()
为您添加一个默认调用- 没有参数 - 当您不在自己的孩子中这样做时.
在第一个构造函数中Pochodna
,由于您没有调用super(i)
或super(j, k)
自己,super()
因此默认情况下会调用.但是在父类中,您显式指定了构造函数,因此默认值不是由编译器创建的.从这里异常,你最终调用一个不存在的构造函数.
希望这样可以更容易地学习继承.干杯.