オーバーライド
前ページでは、サブクラスでフィールド・メソッドを追加できることを説明しました。
では、追加したのが同じ名前の場合、どうなるでしょう。
/**
* 普通のクラス。
* メソッド1つ持ちます。
*/
class HasOneMethodSuper
{
/**
* 自クラスの名前を出力するメソッドです。
*/
void printMyName()
{
System.out.println( "HasOneMethodSuper" );
}
}
/**
* HasOneMethodSuperクラスから継承した、サブクラス。
* メソッドを追加しています。
*/
class OverridedSub extends HasOneMethodSuper
{
/**
* 自クラスの名前を出力するメソッドです。
* オーバーライドしています。
*/
void printMyName()
{
System.out.println( "OverridedSub" );
}
}
/**
* 実行用クラス。このクラスを実行してください。
*/
class OverridedSubRunner
{
public static void main( String[] args )
{
// インスタンスを1つ作ります。
OverridedSub ref = new OverridedSub();
// printMyName()メソッドを呼び出します。
ref.printMyName();
// 出力結果:
// OverridedSub
}
}
// OverridedSubRunner.java /** * 普通のクラス。 * メソッド1つ持ちます。 */ class HasOneMethodSuper { /** * 自クラスの名前を出力するメソッドです。 */ void printMyName() { System.out.println( "HasOneMethodSuper" ); } } /** * HasOneMethodSuperクラスから継承した、サブクラス。 * メソッドを追加しています。 */ class OverridedSub extends HasOneMethodSuper { /** * 自クラスの名前を出力するメソッドです。 * オーバーライドしています。 */ void printMyName() { System.out.println( "OverridedSub" ); } } /** * 実行用クラス。このクラスを実行してください。 */ class OverridedSubRunner { public static void main( String[] args ) { // インスタンスを1つ作ります。 OverridedSub ref = new OverridedSub(); // printMyName()メソッドを呼び出します。 ref.printMyName(); // 出力結果: // OverridedSub } }
まず、フツーのクラス、HasOneMethodSuperクラスがあります。
* 普通のクラス。
* メソッド1つ持ちます。
*/
class HasOneMethodSuper
{
/**
* 自クラスの名前を出力するメソッドです。
*/
void printMyName()
{
System.out.println( "HasOneMethodSuper" );
}
}
/** * 普通のクラス。 * メソッド1つ持ちます。 */ class HasOneMethodSuper { /** * 自クラスの名前を出力するメソッドです。 */ void printMyName() { System.out.println( "HasOneMethodSuper" ); } }
このクラスはメソッドを1つ持つ普通のクラスです。
このクラスのprintMyName()メソッドは、クラス名を出力します。
このHasOneMethodSuperクラスのサブクラス、OverridedSubクラスを作ります。
* HasOneMethodSuperクラスから継承した、サブクラス。
* メソッドを追加しています。
*/
class OverridedSub extends HasOneMethodSuper
{
/**
* 自クラスの名前を出力するメソッドです。
* オーバーライドしています。
*/
void printMyName()
{
System.out.println( "OverridedSub" );
}
}
/** * HasOneMethodSuperクラスから継承した、サブクラス。 * メソッドを追加しています。 */ class OverridedSub extends HasOneMethodSuper { /** * 自クラスの名前を出力するメソッドです。 * オーバーライドしています。 */ void printMyName() { System.out.println( "OverridedSub" ); } }
このクラスはprintMyName()メソッドを持っています。
そう、スーパークラスのprintMyName()メソッドと同じ名前です。
このように、スーパークラスが持つメソッドと同じ名前・引数のメソッドをサブクラスで作ることを「オーバーライド」と言います。
メソッドをオーバーライドしても、インスタンスの作られ方は同じです。
OverridedSub ref = new OverridedSub();
// インスタンスを1つ作ります。 OverridedSub ref = new OverridedSub();
ただ、メソッドをオーバーライドすると、オーバーライドされた側からオーバーライドした側へひもが付きます。
「ひもが付く」とどうなるかというと、オーバーライドされたメソッドを呼び出そうとすることで、自動的にオーバーライドしたメソッドが呼び出されます。
ref.printMyName();
// 出力結果:
// OverridedSub
// printMyName()メソッドを呼び出します。 ref.printMyName(); // 出力結果: // OverridedSub
printMyName()メソッドはスーパークラスとサブクラスの両方にあります。
両方にある場合、サブクラスのprintMyName()メソッドが「オーバーライドしている」ことになるので、このサブクラスのprintMyName()メソッドが呼び出されます。
これはつまり、オーバーライドしたことでメソッドを「上書き」したことになります。
スーパークラスにあるメソッドをサブクラスで上書きすることで、スーパークラスの機能を「書き換える」わけです。
サブクラスではスーパークラスにフィールドやメソッドを追加することができました。
それに加え、このオーバーライドという機能を使うことでスーパークラスのメソッドを修正することができるというわけです。