クラスでは属性(性質)と動作(機能)を定義します。
属性はデータ構造(データの集まり)とも考えられます。
今回はクラスのデータについて説明します。
指示に従って作図しなさい。 プログラムを実行しないこと。
1 public class Card
2 {
3 String suit;
4 int rank;
5
6 static int sum;
7
8 public static void main(String[] args)
9 {
10 Card a;
11 Card b;
12 Card c;
13
14 a = new Card();
15 a.suit = "ハート";
16 a.rank = 12;
17
18 b = new Card();
19 b.suit = "スペード";
20 b.rank = 3;
21
22 c = b;
23 c.rank = a.rank - 2;
24
25 System.out.println( b.rank );
26
27 Card.sum = a.rank + b.rank + c.rank;
28 System.out.println( Card.sum );
29 }
30 }
1.プログラムの構造を描きます
クラス全体を長方形で次のように囲みます。
クラスの中にあるメソッドを次のように囲みます。 今回はmainメソッド1つしかありませんが、通常は沢山のメソッドがあります。
2.宣言されている変数1つに対し1つの長方形を描きます。
これらの変数のうち、a,b,cの3つはmainメソッド内のローカル変数です。
3つの変数 suit, rank, sum はクラスの中にあって、どのメソッドの中にも入っていません。
このうち static変数はクラスの中に取られます。
saticでない変数はインスタンス内に取られます。
インスタンスが作成されるときの型紙として使われます。
suit, rank の2つがこれに該当します。
次のような図になりました。
このクラスをUMLで描くと次のようになります。 上の図との対応が分かります。
staticな変数には下線を引いて表します。
クラスは型にあたります。
クラスを利用するには、まずその型(クラス)の変数を用意します。
プログラムの10~12行目の変数宣言では Cardという型(クラス)の変数 a, b, c を準備しています。
3.プログラムの実行をたどってみる
mainメソッドの実行は14行目から始まります。
a = new Card();
右辺の new Card() を行い変数aに代入しています。
new クラス名()
が行われるとそのクラスのオブジェクトが作られます。
Cardはここで定義しているクラスで、そのオブジェクト (インスタンス)は上で描いた型紙と同じ形をした実体です。
インスタンスにはクラス名をつけて上のように描くのが正しいのですが、 どのクラスのインスタンスか明らかなときは省略して次のように書くこともある。
作られたオブジェクト(インスタンス)を変数aに代入すると、 オブジェクトのアドレスが値として代入されて
変数aを使って、このオブジェクトを参照できるようになります。
15,16行目
a.suit = "ハート"; a.rank = 12;
Card型の変数aが参照しているオブジェクト内の変数を参照するには
オブジェクト名.オブジェクト内の変数名
のように、2つの名前をピリオドで繋いで書きます。
で、変数aが参照しているオブジェクト内の変数suitに、文字列"ハート"を代入します。
で、変数aが参照しているオブジェクト内の変数rankに、整数値12を代入します。
18~20行目
b = new Card(); b.suit = "スペード"; b.rank = 3;
18行目でもうひとつCard型のオブジェクトが作られます。
オブジェクトはいくつでも作ることができます。
20行目まで実行されると、このようになります。
22行目
c = b;
変数bの値を、変数cに代入しています。
この値を変数cに代入すると、 変数cは変数bと同じ値をもち、同じオブジェクトを参照することになります。
23行目
c.rank = a.rank - 2;
代入文です。
したがって 変数cが参照しているオブジェクト内の変数rankに、値10が代入されます。
ここまでの結果を図示するとこのようになります。
25行目
System.out.println( b.rank );
変数bが参照しているオブジェクト内の変数rankの値を表示します。
変数bとcは同一のオブジェクトを参照しています。 この時点では b.rank の値は10になっています。
27行目
Card.sum = a.rank + b.rank + c.rank;
変数aが指しているオブジェクトのrankの値と、 変数bが指しているオブジェクトのrankの値と、 変数cが指しているオブジェクトのrankの値を足し算し、 結果を クラスCardのstatic変数sumに代入します。
同じクラス内ではクラス名を省略して
と書いても良い。