Revised: Dec./30th/2001; Since: Dec./30th/2001
super
サブクラスでオーバーライドしたメソッドを呼び出すとき、オーバーライドされたスーパークラスのメソッドの方を呼び出すことも出来ます。このとき、メソッドのプレフィックスはインスタンス名ではなく、 super
になります。実行中のメソッドを指す this
キーワードと同じように使います。
super
キーワードは、「実行中のインスタンスがインスタンス化されたクラスのスーパークラス」を意味します。一つ上の階層の実装になければその上の階層が探され、最後に Object クラス内の実装が探されて、それでもなければコンパイル・エラーになります。従って、一層上の実装を飛び越えて、二階層以上離れたスーパークラスのメソッドは指定できません。
super
メソッド次の例では、三つのクラスが定義されています。 main()
メソッドが定義されているクラスのほか、 Oya
クラスとそれを継承している Ko
クラスです。
TestOverride.java
:
class Oya { void meth() { System.out.println("スーパークラスで実装したメソッド"); } } class Ko extends Oya { //オーバーライド void meth() { System.out.println("サブクラスでオーバーライドしたメソッド"); } void methOya() { // スーパークラスのメソッド呼び出し super.meth(); } } class TestOverride { public static void main(String[] args) { Ko obj=new Ko(); obj.meth(); obj.methOya(); } }
Ko
クラスは Oya
クラスのサブクラスで、 meth()
メソッドをオーバーライドしています。同時に、 methOya()
クラスでは、スーパークラスのメソッドを呼び出しています。
C:\Java>javac TestOverride.java C:\Java>java TestOverride サブクラスでオーバーライドしたメソッド スーパークラスで実装したメソッド
super
変数次のサンプルは、三つのクラスが定義されています。 Ko
クラスは Oya
クラスを継承しています。
SuperVarDemo.java
:
class Oya {
int x;
void setVar() {
x = 100;
}
}
class Ko extends Oya {
int x;
int y;
void getVar() {
x = 10;
y = super.x; // スーパークラスのメンバ変数 x を代入
}
}
class SuperVarDemo {
public static void main(String[] args) {
//インスタンス化
Ko obj = new Ko();
//メソッド呼び出し
obj.setVar(); //Oyaクラスで定義
obj.getVar(); //Koクラスで定義
System.out.println("obj.x: " + obj.x);
System.out.println("obj.y: " + obj.y);
}
}
main()
メソッドで Ko
クラスをインスタンス化して obj
変数を定義しています。 obj.setVar()
で Oya
クラスで定義されたメソッドが呼び出され、 Oya
クラスのメンバ変数 x
が100にセットされます。
obj.getVar()
で Ko
クラスで定義されたメソッドが呼び出され、 Ko
クラスのメンバ変数 x
が10にセットされ、y
は Oya
クラスのメンバ変数 x
の値にセットされます。
結果、 obj.x
は10、 obj.y
は100にセットされました。
C:\Java>javac SuperVarDemo.java C:\Java>java SuperVarDemo obj.x: 10 obj.y: 100
尚、適切にカプセル化されていれば、メンバー変数は全て private 修飾されているはずです。このようなメンバー変数には、サブクラスといえどもアクセスできません。super キーワードを使っても同様です。アクセッサー・メソッドを使うべきです。