【问题标题】:Do i need super when creating a subclass or not?创建子类时是否需要超级?
【发布时间】:2016-03-26 02:32:12
【问题描述】:

在这个程序中,不需要super 来访问超类的构造函数:

class Base{

    Base(){

        System.out.println("Base");
    }
}

public class test2 extends Base{

    test2() {

        //super();
        System.out.print("test2"); 
    }

    public static void main(String argv[]){

        test2 c = new test2();
    }    
}

但是这个程序需要super 并且在quest1 构造函数中给出错误提示

构造函数 quest 不能应用于给定类型:需要 int,找不到参数

class Quest {

    Quest(int y){

        System.out.print("A:"+y);
    }
}

class Quest1 extends Quest {

    Quest1(int x){

        //super(x+1); 
        System.out.print("B:"+x);
    }
}

class Test {

    public static void main(String argv[]){

        Quest1 q = new Quest1(5); 
    }
}

【问题讨论】:

  • 您的问题得到解答了吗?
  • @user1803551 我明白我什么时候需要超级,但是当我们需要超级时答案令人困惑。所以我没有选择一个。
  • 很公平,但是你应该要求回答者澄清,这就是 cmets 的目的,解释和补充答案是他们的工作。
  • 我如何将答案编辑到我的帖子末尾?当我们使用带参数的方法时,我们使用 super 对吗?如果没有像我的第一个示例那样的参数,我们不使用超级。但是,如果有像我的 2. 示例这样的参数,我们使用参数对吗?
  • 不要在您的问题中包含其他人的答案。您可以编辑您的问题以使其更清晰或添加信息。关于super(...) 的用法,您可以在方法中使用它来调用被覆盖的方法,而不管参数如何。有无参数不影响super。您的问题专门针对规则与其他“常规”方法不同的构造函数,但我所说的仍然有效。

标签: java constructor arguments super


【解决方案1】:

当且仅当您的父级 class 没有默认构造函数(接受无参数)时,您才需要调用 super()

在所有其他情况下(存在零参数的构造函数)您不必编写代码。无论如何它都是隐式调用的。

这些规则适用:

  • 如果你的父类根本没有构造函数,它有默认构造函数,不带参数 -> 不需要super()
  • 你的父类声明了一个没有参数的构造函数 -> 不需要super()
  • 你的类有一个带参数的构造函数,但没有没有参数的构造函数 -> 你需要用数学参数调用定义的构造函数之一通过super()

【讨论】:

    【解决方案2】:

    JLS 8.8.7。构造函数体

    如果构造函数体不是以显式构造函数调用开始并且被声明的构造函数不是原始类Object的一部分,则构造函数体隐式地以超类构造函数调用“super();”开始,这是一个调用不带参数的直接超类的构造函数。

    class Base {
    
        Base() {
    
        }
    }
    
    public class test2 extends Base {
    
        test2() {
    
            //super();
            System.out.print("test2"); 
        }  
    }
    

    注释掉的行是自动添加的,由于定义了超类的无参数构造函数,所以没有错误。

    如果是

    class Quest {
    
        Quest(int y) {
    
            System.out.print("A:"+y);
        }
    }
    
    class Quest1 extends Quest {
    
        Quest1(int x) {
    
            //super(x+1); 
            System.out.print("B:"+x);
        }
    }
    

    隐式调用super()试图调用超类中未定义的构造函数,导致错误

    隐式超级构造函数 Quest() 未定义。必须显式调用另一个构造函数。

    取消对显式构造函数调用的注释将替换隐式调用,从而解决问题。或者,在超类中定义一个无参数的构造函数。

    【讨论】:

      【解决方案3】:

      如果你在超类中创建构造函数,你应该在调用子类构造函数之前调用超类构造函数(例如:super())。

      【讨论】:

      • 在调用子类构造函数之前不能调用超级构造函数。它必须是你在子类构造函数中做的第一件事。
      • 是的,我的电话也一样。请理解我的回答。你所理解的:super();子类 obj = new SubClass();每个人都知道这是Worng。我的回答是:SubClass{ super();子类(){} }
      • 为什么不把答案写清楚?按照现在的写法,是错的。
      • 我之前说的。不是“你应该在调用子类构造函数之前调用超类构造函数”,而是你应该在子类构造函数调用中首先调用超类构造函数 .即使这样 should 也应该是 can 因为只有当 super 构造函数有参数时这才是正确的。
      猜你喜欢
      • 2014-11-29
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 2016-03-24
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多