在以下代码中:
import java.io.*;
public class MyClass1
{
MyClass1()
{
System.out.println("base class");
}
public void print()
{
System.out.println("base print");
}
}
class ChildClass extends MyClass1
{
public ChildClass()
{
System.out.println("child class");
}
public void print()
{
System.out.println("child print");
}
}
为什么在创建childclass类型的示例时,基类的构造函数也会被执行??
3条答案
按热度按时间ax6ht2ek1#
因为您的子类扩展了基类-它是基类的示例,并且具有所有相同的字段和变量等。因此基类也必须示例化。
作为一个具体的例子,假设您的基类中有以下内容:
最后一个变量保证在构造类时示例化。你的孩子班将有一个
id
字段(即使它不能用子方法直接访问它),而且由于这个字段是私有的,所以不能用子构造函数示例化它-所以必须调用基类构造函数。请记住,这不仅仅是最终变量的问题,也不是您可能使用的任何特定功能所特有的问题—因为您的子类是基类,所以需要将其正确地示例化为基类。
ztigrdn82#
因为这是应该发生的:-)
派生类使用基类作为基础。在oo语言中,它是一个基类。基类还需要初始化自身,因此必须调用其构造函数。
从您的示例中看不出这一点,但是如果您给基类一些(受保护的)成员,这将更有意义。在基构造函数中初始化它们,因此在构造时从派生类中查看它们时,它们将具有预期的值。
见下文。田野
value
在子类中可见。您希望初始化值是什么?j0pj023g3#
因为编译器默认情况下会在未指定的子类构造函数中添加super()构造函数。如果没有继承,每个构造函数都应该有this(),如果有继承,每个构造函数都应该有super()方法。为了说明这一点,我举了这个例子。
车辆是父类
汽车是儿童班
在上面的代码片段中,当我在编译期间编译testcar.java文件时,编译器会查找car构造函数并检查car类是否有任何父类只要它检查car类扩展父类vehicle,它就会检查用户是否在继承树中提供了super()。如果不是,那就加一个。
希望这有帮助!