Child-class构造函数中的super(s)是什么意思?

5

我当前遇到了一个有关 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);
    }
}

在Sub类中,super(s)这行代码是什么意思?如果我将Father类从public改为abstract会发生什么?

4个回答

2

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

如果我们谈论构造函数,则:

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

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

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

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

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

1
如果我将Father类从public更改为abstract会发生什么?
如果您将Father类改为抽象类,则可以向其中添加抽象方法的机会。
由于抽象类可能有或可能没有抽象方法,因此在您的代码中将Father类变为抽象类不会产生任何错误。
"super(s)"这一行在子类中是什么意思?
它调用了Father类的带参数构造函数。即使您没有显式调用Father类的构造函数,Father类的默认构造函数也会被调用。

0

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

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

因此,当您调用super(s)时,它会调用超级构造函数。

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

嘿,你忘记回答他问题的第二部分了。:-P - Tilak Madichetti
1
@TilakMaddy 这就是为什么你应该每次只提出一个问题的原因。 - Mark Rotteveel

0
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");

    }
}

输出:5 I

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接