現在、Javaコースでクラスの継承について学習していますが、super()
呼び出しを使用するタイミングがわかりませんか?
編集:super.variable
が使用されている次のコード例を見つけました。
class A
{
int k = 10;
}
class Test extends A
{
public void m() {
System.out.println(super.k);
}
}
したがって、ここでは、super
を使用してスーパークラスのk
変数にアクセスする必要があることを理解しています。しかし、それ以外の場合、super();
は何をしますか?そのままで?
exactlyを呼び出すと、super()
は常に冗長になります。そうでなければ、暗黙的に行われることを明示的に行っています。これは、スーパーコンストラクターの呼び出しを省略すると、引数のないスーパーコンストラクターが自動的に呼び出されるためです。悪いスタイルだと言わないでください。一部の人々は明示的であることを好む。
ただし、スーパーコンストラクターがサブクラスから渡したい引数を受け取る場合に役立ちます。
public class Animal {
private final String noise;
protected Animal(String noise) {
this.noise = noise;
}
public void makeNoise() {
System.out.println(noise);
}
}
public class Pig extends Animal {
public Pig() {
super("Oink");
}
}
super
は、親クラスのconstructor
、methods
、およびproperties
の呼び出しに使用されます。
サブクラスでメソッドをオーバーライドしたときに親クラスからメソッドを呼び出す場合は、サブクラスでsuper
キーワードを使用することもできます。
例:
public class CellPhone {
public void print() {
System.out.println("I'm a cellphone");
}
}
public class TouchPhone extends CellPhone {
@Override
public void print() {
super.print();
System.out.println("I'm a touch screen cellphone");
}
public static void main (strings[] args) {
TouchPhone p = new TouchPhone();
p.print();
}
}
ここで、super.print()
行は、スーパークラスCellPhone
のprint()
メソッドを呼び出します。出力は次のようになります。
I'm a cellphone
I'm a touch screen cellphone
スーパークラスコンストラクターを呼び出す場合-その中のフィールドを初期化します。使用するタイミングを理解するには、この記事をご覧ください。
http://download.Oracle.com/javase/tutorial/Java/IandI/super.html
これをサブクラスコンストラクターの最初の行として使用して、その親クラスのコンストラクターを呼び出します。
例えば:
public class TheSuper{
public TheSuper(){
eatCake();
}
}
public class TheSub extends TheSuper{
public TheSub(){
super();
eatMoreCake();
}
}
TheSub
のインスタンスを作成すると、eatCake()
とeatMoreCake()
の両方が呼び出されます
super()
を呼び出して、スーパークラスのコンストラクターを具体的に実行します。クラスに複数のコンストラクターがある場合、super()
またはsuper(param,param)
を使用して特定のコンストラクターを呼び出すことができ、Javaにそれを処理させて標準コンストラクターを呼び出すことができます。クラス階層に従うクラスは「is-a」関係に従うことに注意してください。
これを使用して、スーパークラスのメソッドを呼び出すことができます(そのようなメソッドをオーバーライドしているとき、super.foo()など)-これにより、その機能を保持し、オーバーライドされたものに他のものを追加することができます方法。
Superは親メソッドを呼び出します。参照: http://leepoint.net/notes-Java/oop/constructors/constructor-super.html
Super()にコメントして、試しました。 @Mark Petersが言ったようにコメントせずに同じことをする
package javaapplication6;
/**
*
* @author sborusu
*/
public class Super_Test {
Super_Test(){
System.out.println("This is super class, no object is created");
}
}
class Super_sub extends Super_Test{
Super_sub(){
super();
System.out.println("This is sub class, object is created");
}
public static void main(String args[]){
new Super_sub();
}
}
Oracleのドキュメントから ページ :
メソッドがスーパークラスのメソッドの1つをオーバーライドする場合、キーワード
super
を使用してオーバーライドされたメソッドを呼び出すことができます。
super
を使用して、非表示フィールドを参照することもできます(ただし、フィールドを非表示にすることはお勧めしません)。
サブクラスのコンストラクターでのsuper
の使用:
スーパークラスコンストラクターの呼び出しは、サブクラスコンストラクターの最初の行である必要があります。
スーパークラスコンストラクターを呼び出す構文は次のとおりです。
super();
または:
super(parameter list);
super()
を使用すると、引数なしのスーパークラスコンストラクターが呼び出されます。 super(parameter list)
を使用すると、一致するパラメーターリストを持つスーパークラスコンストラクターが呼び出されます。
注:コンストラクターが明示的にスーパークラスコンストラクターを呼び出さない場合、Javaコンパイラーはスーパークラスの引数なしコンストラクターへの呼び出しを自動的に挿入します。スーパークラスに引数なしのコンストラクタがない場合、コンパイル時エラーが発生します。
関連記事:
サブクラスのコンストラクターの最初の行は、super()
を呼び出して、スーパークラスのコンストラクターが呼び出されるようにする必要があります。