Java -- 継承・オーバーライド

継承

新しく拡張したクラスが既存のクラスのメンバを受け継ぐこと

サブクラスの宣言
class サブクラス名 extends スーパークラス名 {
	サブクラスに追加するメンバ
	サブクラスのメソッド(引数リスト) {
		.....	
	}
}

元になる既存のクラスはスーパークラスで新しいクラスはサブクラスとなります。
サブクラスでは継承したスーパークラスのフィールド、メソッドをすべて扱うことができます。
サブクラスはいくつでも作れるが継承は一つのクラスからしか出来ない。つまり、スーパークラスは一つしか持てないと言うことです。

オーバーライド

サブクラスで新しくメソッドを記述するときは、スーパークラスと同じメソッド、引数の数、型をもつメソッドを定義することが出来る。
サブクラスのメソッドが、スーパークラスのメソッドに代わって機能することです。

オーバーライドの例
class A {
	void calc(int i) {
		int x = i * 10;	
	}
}
class B extends A {
	void calc(int i) {
		int x = i * 10;
		System.out.println(x);
	}
}

1. スーパークラスAで引数に指定された数を10倍にするメソッドcalcを作成。
2. サブクラスBでスーパークラスAで作成したcalcメソッドをオーバーライドし、結 果を表示する機能を追加します。

スーパークラスと同じ名前のメンバを使う

サブクラス内でsuper.をつけてメソッドやフィールドを呼び出すと、スーパークラスのメソッドやフィールドを呼び出すことが出来ます。

class A {
	int x;	//スーパークラスAに変数xを宣言
	....
}
class B extends A {
	int x;	//サブクラスBにも変数xを宣言
	....
	public void disp() {
		x = 10;		//サブクラスBのフィールド変数xに10を代入	
		super.x = 20;	//スーパークラスAのフィールド変数xに20を代入
	}
}
finalをつける

サブクラスによってオーバーライドされたくないメソッドにはメソッドの先頭にfinalをつけると、オーバーライドされないようにすることが出来ます。

class A {
	public final void A() {
		.....	
	}
}

サブクラス自体を拡張してほしくない場合にはクラスの先頭にfinalをつけておくこともできます。

final class A {
	.....	
}

フィールドの値を変更されたくない場合には、finalをフィールドの先頭につけておきます。

class A {
	static final int NUM = 4;	
}

この場合は宣言したときには必ず初期化しなければなりません。