【问题标题】:What does super(s) in Child-class constructor?子类构造函数中的 super(s) 是什么?
【发布时间】:2017-09-04 11:30:41
【问题描述】:

我目前正面临super 关键字的理解问题。我知道super 是对特定子类的下一个超类的引用。无论如何,我想向您展示我的问题:

public class Father{
    int length; 

    Father(String s){
        length = s.length(); 
    } 
}

public class Sub extends Father {
    char c; 

    Sub(String s) {
        super(s);
        c = s.charAt(0);
    }
}

super(s) 行在 Sub 类中做了什么?如果我将父亲类从 public 更改为 abstract 会发生什么?

【问题讨论】:

    标签: java abstract-class subclass superclass super


    【解决方案1】:

    如果您的方法覆盖其超类的方法之一,您可以通过使用关键字super 调用被覆盖的方法。

    如果我们谈论的是构造函数,那么:

    • 使用super(),调用超类无参数构造函数;
    • 使用super(param list),调用具有匹配参数列表的超类构造函数。

    在您的示例中,子类构造函数中的super(s) 将从父类调用适当的构造函数。

    如果我将父亲类从 public 更改为 abstract 会发生什么?

    简短的回答 - 当一个类被声明为抽象时,它不能被实例化:

    Father father = new Father("Name"); // Error => 'Father' is abstract;
    Father father = new Sub("Name");    // Works, if non-abstract Sub extends Father
    

    【讨论】:

      【解决方案2】:

      如果我将父亲类从公共更改为抽象会发生什么?

      如果你将父类抽象化,那么你就有机会添加抽象方法

      由于一个抽象类可能有也可能没有抽象方法,所以在你的代码中制作父类抽象不会报任何错误。

      “super(s)”行在子类中做了什么

      调用Father类的参数化构造函数。即使你没有显式调用Father类的构造函数,也会调用Father类的默认构造函数

      【讨论】:

        【解决方案3】:

        super 关键字总是用于引用超类。

        super(s) 表示调用具有匹配参数的超类构造函数。

        所以当你调用super(s) 时它会调用超级构造函数

        Father(String s){
               length = s.length(); 
            } 
        

        【讨论】:

        • 你好,忘了回答他问题的第二部分。 :-P
        • @TilakMaddy 这就是为什么你应该每个问题只问一个问题。
        【解决方案4】:
        public class Sub extends Father {
          char c; 
           Sub(String s) {
           super(s);
           c = s.charAt(0);
           System.out.println(c);
           }
        }
        
        public class Sub extends Father {
          char c; 
           Sub(String s) {
           super(s);
           c = s.charAt(0);
           System.out.println(c);
           }
        }
        
        public class MainClass {
        
            public static void main(String[] args) {
                Sub s = new Sub("INDIA");
        
            }
        }
        

        O/P:5 I

        如果您将父类更改为 Abstract 也将相同 解释: super(s) 是用于调用超类构造函数的关键字,因此它只是调用带有参数构造函数的父类(超) 如果您将父类更改为抽象类,则功能将与您不删除 1 参数构造函数相同,因此调用抽象类构造函数的方式相同

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-25
          • 2014-02-17
          • 2012-05-17
          • 2021-05-07
          • 2013-06-05
          • 2013-02-18
          • 1970-01-01
          • 2018-05-06
          相关资源
          最近更新 更多