【问题标题】:why their should override super class parameterize constructor in sub class constructor when it extends from super class?为什么当它从超类扩展时,他们应该在子类构造函数中覆盖超类参数化构造函数?
【发布时间】:2018-08-19 15:36:59
【问题描述】:

为什么在创建子类构造器的时候需要在子类构造器中编译代码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);
    }
}

【问题讨论】:

    标签: java subclass superclass


    【解决方案1】:

    先构造超类,再构造子类。

    由于超类没有默认构造函数,所以必须先调用super(0);

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

    public Super(){}
    

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

    【讨论】:

      【解决方案2】:

      当子类扩展超类时,超类中的所有成员(只有方法和变量,构造函数不是成员)都扩展到子类。

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

      但上面的代码没有默认构造函数因为你写了任何构造函数java编译器不会自动给出默认构造函数。你不需要参数构造函数(默认构造函数)你必须编写它是手动的)所以你需要手动编写 super(int) 调用。因为你在 Super 类中编写了这个构造函数。 如果不是就是编译错误。

      然后输出如下:

      super(int i)
      Sub(int)
      

      您必须 Demo 类是公共的(除了超级类),而不是一个包中的所有类。因为它有 main 方法。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2021-01-17
          • 1970-01-01
          • 1970-01-01
          • 2015-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-26
          • 2016-03-26
          相关资源
          最近更新 更多