2017-04-09 36 views
3

我目前正在面对一个关于super关键字的理解问题。我知道super是对特定子类的下一个超类的引用。无论如何,我想告诉你,我的问题:什么是超级(s)在Child-class构造函数中?

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)做在子类?如果我将父类从公共更改为抽象,会发生什么?

回答

0

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

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

所以,当你调用super(s)它调用超级构造

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

嘿,忘了回答他的问题的第二部分。 :-P –

+1

@TilakMaddy这就是为什么你应该只问一个问题每个问题。 –

2

如果你的方法会覆盖其父类的方法之一,您可以通过使用关键字super的调用重写的方法。

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

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

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

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

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

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

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

如果你让父类的抽象,那么你就有机会添加抽象方法它。

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

什么行“超级(S)”不要在子类

它调用参数化的构造函数父亲class.Even的如果你还没有明确提出父亲的构造类,父类的默认构造函数将被调用。

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

    } 
} 

O/P:5我

如果更改父类摘要比也将是相同的 说明: 超(S)是用来调用父类的构造函数,因此只需要调用关键字如果将父类更改为抽象类,则父类(超类)带参数构造函数 那里的功能将与您未删除1参数构造函数的功能相同,因此它将以相同的方式调用您的抽象类构造函数