ジャワスーパー
Java スーパー
このチュートリアルでは、例を使って Java の super キーワードについて学びます。
super
Java のキーワードは、スーパークラスのメンバー (属性、コンストラクター、およびメソッド) にアクセスするためにサブクラスで使用されます。
super
について学ぶ前に キーワード、Java の継承について理解しておいてください。
スーパー キーワードの使用
<オール>これらの用途をそれぞれ理解しましょう。
1.スーパークラスのオーバーライドされたメソッドへのアクセス
スーパークラスとサブクラスの両方で同じ名前のメソッドが定義されている場合、サブクラスのメソッドがスーパークラスのメソッドをオーバーライドします。これはメソッドのオーバーライドと呼ばれます。
例 1:メソッドのオーバーライド
class Animal {
// overridden method
public void display(){
System.out.println("I am an animal");
}
}
class Dog extends Animal {
// overriding method
@Override
public void display(){
System.out.println("I am a dog");
}
public void printMessage(){
display();
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.printMessage();
}
}
出力
I am a dog
この例では、オブジェクト dog1 を作成することにより、 犬の クラス、そのメソッド printMessage() を呼び出すことができます 次に display()
を実行します
display()
以降 サブクラス Dog のメソッドは両方のクラスで定義されています スーパークラス Animal のメソッドをオーバーライドします .したがって、display()
のサブクラスが呼び出されます。
スーパークラスのオーバーライドされたメソッドを呼び出さなければならない場合は?
super.display()
を使用します オーバーライドされたメソッド display()
の場合 スーパークラス Animal の
例 2:スーパークラス メソッドを呼び出す super
class Animal {
// overridden method
public void display(){
System.out.println("I am an animal");
}
}
class Dog extends Animal {
// overriding method
@Override
public void display(){
System.out.println("I am a dog");
}
public void printMessage(){
// this calls overriding method
display();
// this calls overridden method
super.display();
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.printMessage();
}
}
出力
I am a dog I am an animal
ここで、上記のプログラムがどのように機能するかを説明します。
2.スーパークラスの属性にアクセス
スーパークラスとサブクラスは、同じ名前の属性を持つことができます。 super
を使用します スーパークラスの属性にアクセスするためのキーワード。
例 3:スーパークラス属性にアクセスする
class Animal {
protected String type="animal";
}
class Dog extends Animal {
public String type="mammal";
public void printType() {
System.out.println("I am a " + type);
System.out.println("I am an " + super.type);
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.printType();
}
}
出力 :
I am a mammal I am an animal
この例では、同じインスタンス フィールド type を定義しています。 スーパークラス Animal の両方で サブクラス Dog .
次に、オブジェクト dog1 を作成しました 犬の クラス。次に、printType()
メソッドは、このオブジェクトを使用して呼び出されます。
printType()
の内部 関数、
- タイプ サブクラス Dog の属性を参照します .
- super.type スーパークラス Animal の属性を参照します。
したがって、System.out.println("I am a " + type);
私は哺乳類です
.そして、System.out.println("I am an " + super.type);
私は動物です
.
3.スーパークラス コンストラクターにアクセスするための super() の使用
ご存知のように、クラスのオブジェクトが作成されると、そのデフォルト コンストラクターが自動的に呼び出されます。
サブクラス コンストラクターからスーパークラス コンストラクターを明示的に呼び出すには、super()
を使用します。 . super
の特別な形式です キーワード。
super()
サブクラスのコンストラクター内でのみ使用でき、最初のステートメントでなければなりません。
例 4:super() の使用
class Animal {
// default or no-arg constructor of class Animal
Animal() {
System.out.println("I am an animal");
}
}
class Dog extends Animal {
// default or no-arg constructor of class Dog
Dog() {
// calling default constructor of the superclass
super();
System.out.println("I am a dog");
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
}
}
出力
I am an animal I am a dog
ここで、オブジェクト dog1 の場合 犬の クラスが作成されると、そのクラスのデフォルトまたは引数なしのコンストラクターが自動的に呼び出されます。
サブクラス コンストラクター内では、super()
statement はスーパークラスのコンストラクターを呼び出し、その中のステートメントを実行します。したがって、
私は動物です
という出力が得られます .
その後、プログラムの流れはサブクラスのコンストラクターに戻り、残りのステートメントを実行します。したがって、 私は犬です 印刷されます。
ただし、 super()
を使用 必須ではありません。 super()
であっても がサブクラス コンストラクターで使用されていない場合、コンパイラーはスーパークラスの既定のコンストラクターを暗黙的に呼び出します。
では、コンパイラが自動的に super() を呼び出すのに、なぜ冗長なコードを使用するのでしょうか?
パラメータ化されたコンストラクタ (引数を取るコンストラクタ) の場合は必須です
パラメータ化された super()
サブクラスのコンストラクター本体の最初のステートメントでなければなりません。そうしないと、コンパイル エラーが発生します。
例 5:super() を使用してパラメーター化されたコンストラクターを呼び出す
class Animal {
// default or no-arg constructor
Animal() {
System.out.println("I am an animal");
}
// parameterized constructor
Animal(String type) {
System.out.println("Type: "+type);
}
}
class Dog extends Animal {
// default constructor
Dog() {
// calling parameterized constructor of the superclass
super("Animal");
System.out.println("I am a dog");
}
}
class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
}
}
出力
Type: Animal I am a dog
コンパイラは、引数なしのコンストラクターを自動的に呼び出すことができます。ただし、パラメーター化されたコンストラクターを呼び出すことはできません。
パラメーター化されたコンストラクターを呼び出す必要がある場合は、サブクラス コンストラクターで明示的に定義する必要があります。
上記の例では、パラメーター化されたコンストラクター super("Animal")
を明示的に呼び出していることに注意してください。 .この場合、コンパイラはスーパークラスのデフォルト コンストラクタを呼び出しません。
Java