フィールド・メソッドを追加する
継承を使うと、クラスにフィールドやメソッドを追加することができます。
/**
* 普通のクラス。
* (SuperClassと全く同じクラスです)
*/
class NormalSuper
{
// int型変数のdataフィールドです。
int data;
/**
* フィールドを出力するメソッドです。
*/
void printData()
{
System.out.println( data );
}
}
/**
* NormalSuperクラスから継承した、サブクラス。
* フィールドとメソッドを追加しています。
*/
class AddedSub extends NormalSuper
{
// int型変数のdataSubフィールドです。
int dataSub;
/**
* フィールドを出力するメソッドです。
*/
void printDataSub()
{
// このクラスで追加したフィールドを出力。
System.out.println( dataSub );
// ついでにスーパークラスのフィールドも出力。
System.out.println( data );
}
}
/**
* 実行用クラス。このクラスを実行してください。
*/
class AddedSubRunner
{
public static void main( String[] args )
{
// インスタンスを1つ作り数値を入れます。
AddedSub ref = new AddedSub();
// スーパークラスのフィールドに値を入れて出力します。
ref.data = 100;
ref.printData();
// 出力結果:
// 100
// サブクラスのフィールドに値を入れて出力します。
ref.dataSub = 200;
ref.printDataSub();
// 出力結果:
// 200
// 100
}
}
// AddedSubRunner.java /** * 普通のクラス。 * (SuperClassと全く同じクラスです) */ class NormalSuper { // int型変数のdataフィールドです。 int data; /** * フィールドを出力するメソッドです。 */ void printData() { System.out.println( data ); } } /** * NormalSuperクラスから継承した、サブクラス。 * フィールドとメソッドを追加しています。 */ class AddedSub extends NormalSuper { // int型変数のdataSubフィールドです。 int dataSub; /** * フィールドを出力するメソッドです。 */ void printDataSub() { // このクラスで追加したフィールドを出力。 System.out.println( dataSub ); // ついでにスーパークラスのフィールドも出力。 System.out.println( data ); } } /** * 実行用クラス。このクラスを実行してください。 */ class AddedSubRunner { public static void main( String[] args ) { // インスタンスを1つ作り数値を入れます。 AddedSub ref = new AddedSub(); // スーパークラスのフィールドに値を入れて出力します。 ref.data = 100; ref.printData(); // 出力結果: // 100 // サブクラスのフィールドに値を入れて出力します。 ref.dataSub = 200; ref.printDataSub(); // 出力結果: // 200 // 100 } }
まず、フツーのクラス、NormalSuperクラスがあります。
* 普通のクラス。
* (SuperClassと全く同じクラスです)
*/
class NormalSuper
{
// int型変数のdataフィールドです。
int data;
/**
* フィールドを出力するメソッドです。
*/
void printData()
{
System.out.println( data );
}
}
/** * 普通のクラス。 * (SuperClassと全く同じクラスです) */ class NormalSuper { // int型変数のdataフィールドです。 int data; /** * フィールドを出力するメソッドです。 */ void printData() { System.out.println( data ); } }
これは前ページのSuperClassと中身は全く同じです。
このクラスはフィールドとメソッドを持つ普通のクラスです。
このNormalSuperクラスのサブクラス、AddedSubクラスを作ります。
* NormalSuperクラスから継承した、サブクラス。
* フィールドとメソッドを追加しています。
*/
class AddedSub extends NormalSuper
{
// int型変数のdataSubフィールドです。
int dataSub;
/**
* フィールドを出力するメソッドです。
*/
void printDataSub()
{
// このクラスで追加したフィールドを出力。
System.out.println( dataSub );
// ついでにスーパークラスのフィールドも出力。
System.out.println( data );
}
}
/** * NormalSuperクラスから継承した、サブクラス。 * フィールドとメソッドを追加しています。 */ class AddedSub extends NormalSuper { // int型変数のdataSubフィールドです。 int dataSub; /** * フィールドを出力するメソッドです。 */ void printDataSub() { // このクラスで追加したフィールドを出力。 System.out.println( dataSub ); // ついでにスーパークラスのフィールドも出力。 System.out.println( data ); } }
サブクラスという点では前ページのSubClassクラスと同じです。
違うのはフィールドとメソッドがあるということです。
このように、サブクラスにフィールド・メソッドを持たせると、スーパークラスにフィールド・メソッドを追加することになります。
サブクラスのインスタンスを作るとその中にスーパークラスのインスタンスが作られます。
AddedSub ref = new AddedSub();
// インスタンスを1つ作り数値を入れます。 AddedSub ref = new AddedSub();
この時、スーパークラスのインスタンスはスーパークラスのフィールド・メソッドを持ち、サブクラスのインスタンスはサブクラスのフィールド・メソッドを持ちます。
スーパークラスのインスタンスが持っているフィールド・メソッドに加えて、サブクラスのインスタンスでも自分のフィールドとメソッドを持っています。
これら、サブクラスのフィールド・メソッドも、同じように使うことができます。
ref.dataSub = 200;
ref.printDataSub();
// 出力結果:
// 200
// 100
// サブクラスのフィールドに値を入れて出力します。 ref.dataSub = 200; ref.printDataSub(); // 出力結果: // 200 // 100
スーパークラスのフィールド・メソッドを使うのと同じように、サブクラスのフィールド・メソッドを使うことができます。
というか、こちらの方がむしろ自然ですね。サブクラスのフィールド・メソッドを使うのと同じように、スーパークラスのフィールド・メソッドも使うことができる、という方が正しいかもしれません。
使う側から見ると、スーパークラスのフィールド・メソッドも、サブクラスのフィールド・メソッドも同じように使うことができます。
それはつまり、スーパークラスにサブクラスのフィールド・メソッドを追加したように見える、ということです。
これが継承のメリットです。
つまり、継承を使うとあるクラスにフィールド・メソッドを追加できるということです。
この継承の機能がないと、スーパークラスにあたるクラスをコピペして、そこにフィールド・メソッドを書き足すことになります。そうすると同じプログラムがどんどん増えることになります。無駄が増えることになりますし、コピペした部分にミスがあると全部修正しなければなりません。
つまり、継承を使うことでプログラムの使い回しが簡単にできるということです。まずは継承のメリットとして、この機能を使ってみましょう。