【问题标题】:Class inheritance problem in Java, constructors with and without paramsJava中的类继承问题,带参数和不带参数的构造函数
【发布时间】:2011-01-02 01:55:04
【问题描述】:

我正在学习 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");
        }
    }

所以,Pochodna 类扩展了 Bazowa 类,我的练习是创建一个超类,它只有带参数的构造函数和一个同时具有两种类型(有和没有)的子类。

当我评论 Pochodna 类中的第一个构造函数时,一切正常,但如果不评论那部分,我真的不知道如何使它工作。我想我必须以某种方式从第一个调用构造函数,但不知道该怎么做。

任何帮助将不胜感激, 保罗

【问题讨论】:

    标签: java class inheritance oop


    【解决方案1】:

    由于父构造函数中没有默认构造函数,所以必须在子构造函数中调用另一个构造函数:

    Pochodna() {
        super(10);
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

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

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

      希望这能让学习继承更容易。干杯。

      【讨论】:

        【解决方案3】:

        您需要指定如下内容:

        Pochodna() 
        {
          super(0);
        }
        

        这里的技巧是,由于您为超类指定了构造函数,编译器不会为您创建无参数构造函数。当您在超类中创建零参数构造函数时,它会尝试调用子类中的无参数构造函数并且找不到任何东西。

        简而言之,在构造函数中调用另一个构造函数(在超类中或在同一个类中)不是可选的。要么显式指定另一个构造函数,要么将插入对超类的零参数构造函数的调用。

        【讨论】:

          【解决方案4】:

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

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

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

          这将调用 Pochodna 的其他构造函数。只是另一种选择。研究输出以了解发生了什么。

          【讨论】:

            【解决方案5】:

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

            例如:

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

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

            【讨论】:

              猜你喜欢
              • 2015-06-16
              • 1970-01-01
              • 2018-03-31
              • 2015-08-22
              • 2014-02-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多