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 キーワードを使っても同様です。アクセッサー・メソッドを使うべきです。