== クラス ==
クラスでは'''属性'''(性質)と'''動作'''(機能)を定義します。
属性はデータ構造(データの集まり)とも考えられます。
今回はクラスのデータについて説明します。
----
指示に従って作図しなさい。
プログラムを実行しないこと。
{{{#!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( "aは " + a.suit + a.rank );
System.out.println( "bは " + b.suit + b.rank );
System.out.println( "cは " + c.suit + c.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行目の変数宣言では 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を使って、このオブジェクトにアクセスできるようになります。
{{{
a.suit = "ハート";
}}}
これをCard型の変数に代入することで、このオブジェクトやオブジェクト内の変数にアクセスできるようになります。<
>
aのsuitは a.suit 、aのrankは a.rank とピリオドでつないで表します。
14行目でもうひとつCard型のオブジェクトが作られます。<
>
オブジェクトはいくつでも作ることができます。
18行目では変数bの値を、変数cに代入しています。
この結果、変数cは変数bと同じ値をもつことになり、同じオブジェクトを参照します。
19行目で c.rank の値を変更しています。
変数cとbは同一のオブジェクトを参照していましたから、
この後で b.rank の値を参照すると、この値も変わっているのが分かります。
{{attachment:card4.png}}