繁体   English   中英

从超类扩展时,为什么他们应该在子类构造函数中覆盖超类参数化构造函数?

[英]why their should override super class parameterize constructor in sub class constructor when it extends from super class?

为什么在创建子类构造函数时需要在子类构造函数中使用代码super(0)进行编译?

public class Super {
    public Super(int i) {
        System.out.println("super(int i)");
    }
}

class Sub extends Super{
    public Sub(int i) {
        super(0); // why this code needed here to compile?
        System.out.println("Sub(int)");
    }
}

class Demo{
    public static void main(String[] args) {
        Sub s1=new Sub(100);
    }
}

在构造子类之前,应构造超类。

由于超类没有默认的构造函数,因此您必须调用super(0); 第一。

您可以在超类中添加默认构造函数:

public Super(){}

那么您不需要调用super(0); 在子类中。

当Sub类扩展Super类时,super类中的所有成员( 仅方法和变量,构造函数不是member )都扩展为Sub类。

从Demo类的主方法中调用Sub类的Sub(int)构造函数,然后Sub(int)构造函数中的第一条语句在Super类中进行super()调用,它将自动放入Java编译器。

但是上面的代码没有默认构造函数因为您编写的构造函数java编译器不会自动提供默认构造函数。您不需要参数构造函数(默认构造函数)就必须手动编写它 )所以您需要编写称为super(int)的代码手动。 因为您是在Super类中编写此构造函数的。 如果不是,则为编译错误。

然后输出如下:

super(int i)
Sub(int)

而不是将所有类放在一个包中,您必须将Demo类设为public(Super类除外)。 因为它有主要方法。

这是因为在Java中,每个子类都需要调用其父类的构造方法。 如果您在超类中有一个默认构造函数,则不需要像Java那样显式调用它,但是如果您在超类中没有任何不带参数的默认构造函数,而是有一些带有您需要在子类构造函数的第一行中调用该参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM