super

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にセットされ、yOya クラスのメンバ変数 x の値にセットされます。

結果、 obj.x は10、 obj.y は100にセットされました。

C:\Java>javac SuperVarDemo.java
C:\Java>java SuperVarDemo
obj.x: 10
obj.y: 100

尚、適切にカプセル化されていれば、メンバー変数は全て private 修飾されているはずです。このようなメンバー変数には、サブクラスといえどもアクセスできません。super キーワードを使っても同様です。アクセッサー・メソッドを使うべきです。



Copyright © 2001 SUGAI, Manabu. All Rights Reserved.
SEO [PR] !uO z[y[WJ Cu