== クラス ==
クラスでは'''属性'''(性質)と'''動作'''(機能)を定義します。
属性はデータ構造(データの集まり)とも考えられます。
今回はクラスのデータについて説明します。
-----
指示に従って作図しなさい。
プログラムを実行しないこと。
{{{#!java
public class Card
{
String suit;
int rank;
public static void main(String[] args)
{
Card a;
Card b;
Card c;
a = new Card();
a.suit = "ハート";
a.rank = 12;
b = new Card();
b.suit = "スペード";
b.rank = 3;
c = b;
c.rank = 10;
System.out.println( "bは " + b.suit + b.rank );
}
}
}}}
----
1.プログラムの構造を描きます
クラス全体を長方形で次のように囲みます。
. {{attachment:class2.png}}
クラスの中にあるメソッドを次のように囲みます。
今回はmainメソッド1つしかありませんが、通常は沢山のメソッドがあります。
. {{attachment:class3.png}}
----
2.宣言されている変数1つに対し1つの長方形を描きます。
. 変数宣言はsuit, rank, a, b, c の5つがあります。
. その横にそれぞれ長方形を描きます。
この5つの変数のうち、a,b,cの3つはmainメソッド内のローカル変数です。
. staticなメソッドのローカル変数は、いま長方形を描いたその場所に取られると考えてよい。
. 変数aに代入を行うと、aの横に描いた長方形の中に値が書かれる。
2つの変数 suit と rank はクラスの中にあって、どのメソッドの中にも入っていません。<
>
このような変数は、この場所に変数がとられるわけではありません。<
>
インスタンス(そのクラスのオブジェクト)が作成されるときの'''型紙'''として使われます。<
><
>
角の丸い点線の長方形で囲みます。<
>
Cardというクラスオブジェクトの型紙であることを示します。
次のような図になりました。
. {{attachment:card1.png}}
この図とクラスを表す図(UML)とが対応しています。
----
'''クラス'''は型にあたります。<
>
プログラムの8~10行目の変数宣言では Cardという型(クラス)の変数 a, b, c を準備しています。
-----
3.プログラムの実行をたどってみる
mainメソッドの実行は12行目から始まります。
{{{
a = new Card();
}}}
右辺の new Card() を行い変数aに代入しています。
. '''new クラス名()'''
が行われるとそのクラスのオブジェクトが作られます。
Cardはここで定義しているクラスで、そのオブジェクト
(インスタンス)は上で描いた型紙と同じ形をした実体です。
. {{attachment:card2a.png}}
インスタンスにはクラス名をつけて上のように描くのが正しいのですが、
どのクラスのインスタンスか明らかなときは省略して次のように書いても良い。
. {{attachment:card2.png}}
作られたオブジェクト(インスタンス)を変数aに代入すると
. {{attachment:card3.png}}
変数aを使って、このオブジェクトにアクセスできるようになります。
----
13,14行目
{{{
a.suit = "ハート";
a.rank = 12;
}}}
Card型の変数aが参照しているオブジェクト内の変数を参照するには
a.オブジェクト内の変数名
のように、2つの名前をピリオドで繋いで書きます。
a.suit = "ハート";
で、変数aが参照しているオブジェクト内の変数suitに、文字列"ハート"を代入します。
a.rank = 12;
で、変数aが参照しているオブジェクト内の変数rankに、整数値12を代入します。
. {{attachment:card3a.png}}
----
16~18行目
{{{
b = new Card();
b.suit = "スペード";
b.rank = 3;
}}}
16行目でもうひとつCard型のオブジェクトが作られます。
. 12行目で作られたオブジェクトとは別のオブジェクトです。
オブジェクトはいくつでも作ることができます。
18行目まで実行されると、このようになります。
. {{attachment:card4a.png}}
----
20行目
{{{
c = b;
}}}
変数bの値を、変数cに代入しています。<
>
. 変数bはどのオブジェクトを指しているかの情報を保持しています。
. オブジェクトのアドレスを値として持っていると考えてよい。
この値を変数cに代入すると、
変数cは変数bと同じ値をもち、同じオブジェクトを参照することになります。
. {{attachment:card4b.png}}
----
21行目
{{{
c.rank = 10;
}}}
変数cが参照しているオブジェクト内の変数rankに、値10を代入します。<
>
変数cとbは同一のオブジェクトを参照していましたから、
この後で b.rank の値を参照すると、この値も変わっています。
{{attachment:card4.png}}