Java では、すでに作成したクラスをもとにして、新しいクラスを作成することが出来ます。このように新しいクラスを作成することをクラスを拡張する
(extends) といいます。新しいクラスは既存のクラスに新しく必要となる性質や機能をつけたしていくことが出来ます。この時、継承されたクラスをスーパークラス
(superclass) 継承したクラスをサブクラス (subclass) と呼びます。
簡単な例を言うと、「ラジオカセット」クラスを継承して、「CD」機能を追加した「CDラジオカセット」クラスを作る。ということになります。
以下は、あるクラス(スーパークラス)を継承し、そのクラスの機能を持ったクラス(サブクラス)を作成する。という構文の例です。
class サブクラス名 extends スーパークラス名{
サブクラスに追加するメンバ
サブクラスのコンストラクタ(){
処理 ;
}
}
以下はスーパークラスの例です。
public class ExtendsTest {
//スーパークラス Test の宣言
private int n;
public ExtendsTest() {
n = 0;
}
public void superTest(int n) {
System.out.println("スーパークラスに" + n + "が入力されました。");
}
}
以下はスーパークラスを継承したサブクラスの例です。
public class SubTest extends ExtendsTest {
//サブクラス SubTest の宣言
private int sub;
public SubTest() {
sub = 0;
}
public void subSubTest(int sub) {
System.out.println("サブクラスに" + sub + "が入力されました。");
}
}
以下が上記のスーパークラス、サブクラスを呼び出すメイン関数を持つクラスです。
public class MainTest {
public static void main(String[] args) {
SubTest st = new SubTest();
st.subSubTest(10);
st.superTest(5);
}
}
そして、以下がプログラムの実行結果になります。
サブクラスに10が入力されました。
スーパークラスに5が入力されました。
このようにスーパークラスを継承したサブクラスを new してインスタンスを作成するとサブクラスだけではなくスーパークラスをも呼び出すことが可能になります。
スーパークラス内とサブクラス内にメソッド名・引数の型・引数の数が同じであるメソッドが存在した場合は、どちらが呼び出されるのでしょうか?
スーパークラスとサブクラスの継承の関係では、サブクラス内で新しく定義されたメソッドが呼び出されることになります。このことをオーバーライド(overriding)といいます。
以下がそのプログラムの簡単な例になります。(スーパークラスの作成)
public class ExtendsTest {
//スーパークラス Test の宣言
private int n;
public ExtendsTest() {
n = 0;
}
public void superTest(int n) {
System.out.println("スーパークラスに" + n + "が入力されました。");
}
public void over(){
System.out.println("スーパークラスのメソッドが呼ばれました。");
}
}
以下はサブクラスの作成です。
public class SubTest extends ExtendsTest {
//サブクラス SubTest の宣言
private int sub;
public SubTest() {
sub = 0;
}
public void subSubTest(int sub) {
System.out.println("サブクラスに" + sub + "が入力されました。");
}
public void over(){
System.out.println("サブクラスが呼び出されました。");
}
}
以下が上記のスーパークラス、サブクラスを呼び出すメイン関数を持つクラスです。
public class MainTest {
public static void main(String[] args) {
SubTest st = new SubTest();
st.subSubTest(10);
st.superTest(5);
st.over();
}
}
以下が実行結果です。
サブクラスに10が入力されました。
スーパークラスに5が入力されました。
サブクラスが呼び出されました。
以上の実行結果をみてわかる通り、サブクラスの over メソッドが呼びされていることがわかります。 しかし、アクセス修飾子については注意しなければなりません。アクセス修飾子は、アクセス制限を弱める方向でオーバーライドできます。即ち、protected メソッドは public に変更できますが、アクセス修飾子のないメソッドを private 宣言することはできません。さらに、アクセス修飾子の規則の例外として、private修飾されたメソッドはオーバーライドできません。
サブクラスでオーバーライドされたスーパークラスのメソッドは、呼び出すことができます。以下は、上記であった「メソッドのオーバーライド」のプログラムを実行するプログラムの例です。
public class MainTest {
public static void main(String[] args) {
SubTest st = new SubTest();
st.subSubTest(10);
st.superTest(5);
super.over();
}
}
以下は上記で実行したプログラムの例です。
サブクラスに10が入力されました。上記のようにプログラムの指定すると、スーパークラスのメソッドが呼び出されることがわかります。
スーパークラスに5が入力されました。
スーパークラスのメソッドが呼ばれました。
コンストラクタは、オブジェクトを生成するための特殊なメソッドのようなものですが、クラスのメンバーではなく、継承はされません。このため、クラスの継承時の振る舞いも、通常のメソッドとは異なり、以下の規則があります。