welcome: please sign in
location: "継承の例"の差分
12と13のリビジョン間の差分
2010-11-30 13:59:09時点のリビジョン12
サイズ: 3877
編集者: masahiko
コメント:
2010-12-01 00:36:10時点のリビジョン13
サイズ: 3872
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 1: 行 1:
#acl All:
行 48: 行 47:
このとき変数の値は、インスタンスのアドレス(参照)になります。 このとき変数の値は、インスタンスのアドレス(参照)と考えられます。

継承の例

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

  • card1.png

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

  • card2.png

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

  • 1行目にextends...があることに注意
       1 public class Card extends Chain
       2 {
       3         String suit;
       4         int rank;
       5 
       6         Card()
       7         {
       8         }
       9 
      10         Card(String suit, int rank)
      11         {
      12                 this.suit = suit;
      13                 this.rank = rank;
      14         }
      15 
      16         void show()
      17         {
      18                 System.out.printf("%s %d\n", suit, rank);
      19         }
      20 }
    

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

  •    1         public static void main(String[] args)
       2         {
       3                 Card a;
       4                 
       5                 a = new Card("ハート", 1);
       6                 a.show();
       7         }
    


代入

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

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

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

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

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

1番目はエラー、2番目は可能です。

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

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

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

このようになります。

  • card4.png

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


オブジェクトをつなぐ

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

  • card3.png

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

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

  • chain51.png

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

  •    1         public static void main(String[] args)
       2         {
       3                 Card a;
       4                 a = new Card();
       5                 
       6                 a.add(new  Card("ハート", 13));
       7                 a.add(new  Card("ハート", 12));
       8                 a.showContent();
       9         }
    

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

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

  • card5.png

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

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

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


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

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

  • card6.png

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

  •                 Card b;
                    b = new Card();

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

問題

  • 変数a,bが上の状態だとします。
  • この後、インスタンスをつなぎかえる処理だけで次の状態にしなさい。
    • 新しいインスタンスを作ったり、suitやrankに代入してはいけません。
  • 変数aの内容が変わってもよい。
  • card7.png

継承の例 (最終更新日時 2010-12-01 00:36:10 更新者 masahiko)