superキーワードはさまざまな状況で使用されます。この投稿を始める前に、理解を深めるために Java の継承について学ぶことをお勧めします。
Javaのスーパーキーワードとは何ですか?
Superは、スーパークラスのオーバーライドされたメソッドを呼び出したり、スーパークラスの非表示フィールドを参照したりするために使用できるキーワードです。super キーワードをいつ、なぜ使用するのですか?
Java superキーワードには 3 つの明示的な用途があります。- 子クラスにも同じ名前のデータメンバーがある場合、親クラスのデータ メンバーにアクセスします。
- 子クラスで親クラスのデフォルトまたはパラメーター化されたコンストラクターを呼び出します。
- 子クラスにオーバーライドされたメソッドがある場合は、子クラスで親クラスのメソッドを呼び出します。
例 1 - 親のデータ メンバーにアクセスする
例 1 は、 Carタイプの子クラスでVehicleクラスの属性またはデータ メンバーにどのようにアクセスできるかを示しています。よく理解するために、以下のスニペットを実行してください。
class Vehicle {
String name = "vehicle";
}
class Car extends Vehicle {
String name = "car";
public void printMyName() {
System.out.println(name);
}
public void printParentName() {
// use super keyword to access
// parent's data member / attribute
System.out.println(super.name);
}
public static void main(String[] args) {
Car myCar = new Car();
System.out.print("My Car's Name: ");
myCar.printMyName();
// printing the parent's name
// using the super keyword
System.out.print("My Parent Vehicle's Name: ");
myCar.printParentName();
}
}
出力
私の車の名前:車 私の親車両の名前:車
例 2 - 子クラスの親のコンストラクターにアクセスする
super()を明示的に呼び出すと、子クラス内の親クラスのデフォルトまたはパラメーター化されたコンストラクターの両方にアクセスできるようになります。以下はパラメーター化されたコンストラクターの例です。親 ie Shapeクラスのコンストラクターは、子 ie Triangleクラスで ( super()を使用して) 呼び出され、属性を設定します。以下のプログラムを実行して、出力を自分でテストしてください。
public class Shape {
String name;
public Shape(String n) {
System.out.println("Shape() parameterized constructor called!");
name = n;
}
}
class Triangle extends Shape {
int sides = 3;
String color;
public Triangle(String n, String c) {
// The super keyword calls the parameterized
// constructor of the parent (Shape) with
// 'n' as a parameter
super(n);
System.out.println("Triangle() parameterized constructor called!");
this.color = c;
}
public static void main(String[] args) {
Triangle myTriangle = new Triangle("Triangle Alpha", "Yellow");
System.out.println(myTriangle.name);
System.out.println(myTriangle.color);
}
}
出力
Shape() パラメータ化されたコンストラクターが呼び出されました。Triangle() パラメーター化されたコンストラクターが呼び出されました。トライアングルアルファイエロー
クイック チャレンジ: 学習内容をテストするために、デフォルトのコンストラクターを使用して上記のプログラムを再設計します。また、super()がsuper(arg)とどのように異なるのかも確認してください。
例 3 - 子クラスの親のオーバーライドされたメソッドにアクセスする
例 3 は、子クラスでも定義されている親クラスのメソッドにアクセスする方法を示しています。以下のプログラムの親クラスSound は、メソッドvoice()を定義します。子クラスDrumにも同じ名前のメソッド、つまりvoice()があります。これは、メソッドの音声がサブクラスによってオーバーライドされることを意味します。以下のプログラムを実行して、子クラスで親クラスのメソッドを使用するために superキーワードがどのように必要であるかを学習します。
public class Sound {
public void voice() {
System.out.println("Play sound!");
}
}
class Drum extends Sound {
public void voice() {
System.out.println("Play drums!");
}
public void play() {
// The super keyword calls the
// voice() method of the parent
super.voice();
voice();
}
public static void main(String[] args) {
Drum myDrum = new Drum();
myDrum.play();
}
}
出力
Shape() パラメータ化されたコンストラクターが呼び出されました。Triangle() パラメーター化されたコンストラクターが呼び出されました。トライアングルアルファイエロー
GO TO FULL VERSION