継承の例

前回までに作成した Chainクラス を継承して Cardクラス を作ります。

Cardクラスのインスタンスは３つの変数(属性)を持ちます。

コンストラクタとshowメソッドを記述するとこのようになります。

１行目にextends...があることに注意

public class Card extends Chain
{
String suit;
int rank;
Card()
{
}
Card( String suit, int rank)
{
this. suit = suit;
this. rank = rank;
}
void show()
{
System. out. printf( "%s %d\n", suit, rank);
}
}

コンストラクタとshowメソッドはこのように使えます。

public static void main( String[] args)
{
Card a;
a = new Card( "ハート", 1);
a. show();
}

代入

同じ型の変数にそのクラスのインスタンスを代入することができました。

このとき変数の値は、インスタンスのアドレス(参照)と考えられます。

Card a = new Card(); Chain c = new Chain();

どんなインスタンスでも代入されるときはアドレスだとすると、 型の異なる変数への代入は可能でしょうか？

Card a = new Chain(); Chain c = new Card();

１番目はエラー、２番目は可能です。

親クラスの型をもつ変数へ、サブクラスのインスタンスを代入することはできます。

次の２行をmainメソッドに記述して実行してみると

Chain c = new Card(); System.out.println(c);

このようになります。

変数はChain型ですが、代入されているインスタンスはCard型です。

オブジェクトをつなぐ

CardクラスはChainクラスを継承して作成したので、 Chainクラスのときと同様につなぐことができます。

変数nextへの代入によってつなぐことも可能ですが、 以下ではメソッドを使って操作することにします。

Chainクラスで作成したaddとdelの２つのメソッドは 図の青で囲んだ部分に対して、追加や削除を行うものでした。

親クラスで定義されているメソッドはサブクラスでも利用できます。

public static void main( String[] args)
{
Card a;
a = new Card();
a. add( new Card( "ハート", 13));
a. add( new Card( "ハート", 12));
a. showContent();
}

ここでもChain型の変数nextにサブクラスCardのインスタンスが代入されます。

このmainメソッドを実行するとこのようになります。

１番目のインスタンスの変数suitとrankには値が代入されていないことに注意してください。

２番目以降につながっているインスタンスだけをリストの内容として扱うことにします。

このため、表示にはshowContentを使っています。

オブジェクトをつなぎなおす

変数bがこのようになっているとします。

先頭のインスタンスだけがあり、 リストの内容に対応するインスタンスはつながっていない状態です。

Card b; b = new Card();

を行うとこの状態になります。

問題

変数a,bが上の状態だとします。

この後、インスタンスをつなぎかえる処理だけで次の状態にしなさい。

新しいインスタンスを作ったり、suitやrankに代入してはいけません。

変数aの内容が変わってもよい。