4410
コメント:
|
6138
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 9: | 行 9: |
---- | ----- |
行 19: | 行 19: |
static int sum; |
|
行 24: | 行 26: |
行 32: | 行 34: |
c = b; c.rank = a.rank - 2; |
|
行 33: | 行 38: |
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 ); |
System.out.println( b.rank ); Card.sum = a.rank + b.rank + c.rank; System.out.println( Card.sum ); |
行 59: | 行 62: |
. 変数aに代入を行うと、aの横に描いた長方形の中に値が書かれる。 | . 変数aに代入を行うと、aの横に描いた長方形の中に値(基本データ型の場合は値、オブジェクトの場合は参照)が書かれると考える。 |
行 61: | 行 64: |
2つの変数 suit と rank はクラスの中にあって、どのメソッドの中にも入っていません。<<BR>> このような変数は、この場所に変数がとられるわけではありません。<<BR>> |
3つの変数 suit, rank, sum はクラスの中にあって、どのメソッドの中にも入っていません。 このうち static変数はここ(クラスの中)に取られます。 一方、 suit, rank の2つは、この場所に変数がとられるわけではありません。<<BR>> |
行 70: | 行 77: |
この図とクラスを表す図(UML)とが対応しています。 | このクラスをUMLで描くと次のようになります。 上の図との対応が分かります。 . {{attachment:cardclass.png}} staticな変数には下線を引きます。 |
行 73: | 行 83: |
プログラムの8行目の変数宣言では Cardという型(クラス)の変数 a, b, c を準備しています。 | プログラムの8~10行目の変数宣言では Cardという型(クラス)の変数 a, b, c を準備しています。 |
行 75: | 行 85: |
---- | ----- |
行 91: | 行 101: |
どのクラスのインスタンスか明らかなときは省略して次のように書いても良い。 | どのクラスのインスタンスか明らかなときは省略して次のように書くこともある。 |
行 94: | 行 104: |
作られたオブジェクト(インスタンス)を変数aに代入すると | 作られたオブジェクト(インスタンス)を変数aに代入すると、 オブジェクトのアドレスが値として代入されて |
行 96: | 行 107: |
変数aを使って、このオブジェクトにアクセスできるようになります。 | 変数aを使って、このオブジェクトを参照できるようになります。 ---- 13,14行目 |
行 100: | 行 112: |
a.rank = 12; | |
行 101: | 行 114: |
これをCard型の変数に代入することで、このオブジェクトやオブジェクト内の変数にアクセスできるようになります。<<BR>> aのsuitは a.suit 、aのrankは a.rank とピリオドでつないで表します。 |
Card型の変数aが参照しているオブジェクト内の変数を参照するには '''オブジェクト名.オブジェクト内の変数名''' のように、2つの名前をピリオドで繋いで書きます。 |
行 104: | 行 118: |
14行目でもうひとつCard型のオブジェクトが作られます。<<BR>> | 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行目で作られたオブジェクトとは別のオブジェクトです。 |
行 107: | 行 134: |
18行目まで実行されると、このようになります。 . {{attachment:card4a.png}} ---- 20行目 {{{ c = b; }}} 変数bの値を、変数cに代入しています。<<BR>> . 変数bはどのオブジェクトを指しているかの情報を保持しています。 . オブジェクトのアドレスを値として持っていると考えてよい。 この値を変数cに代入すると、 変数cは変数bと同じ値をもち、同じオブジェクトを参照することになります。 . {{attachment:card4b.png}} ---- 21行目 {{{ c.rank = a.rank - 2; }}} 代入文です。 . 右辺の値を計算します。 . 変数aが参照しているオブジェクト内の変数rankの値から2を引いて、値は10となります。 . 左辺で指定した変数に、この値を代入します。 したがって 変数cが参照しているオブジェクト内の変数rankに、値10が代入されます。 |
|
行 108: | 行 159: |
18行目では変数bの値を、変数cに代入しています。 この結果、変数cは変数bと同じ値をもつことになり、同じオブジェクトを参照します。 |
ここまでの結果を図示するとこのようになります。 . {{attachment:card4.png}} |
行 111: | 行 162: |
19行目で c.rank の値を変更しています。 変数cとbは同一のオブジェクトを参照していましたから、 この後で b.rank の値を参照すると、この値も変わっているのが分かります。 |
---- 23行目 {{{ System.out.println( b.rank ); }}} 変数bが参照しているオブジェクト内の変数rankの値を表示します。 |
行 115: | 行 169: |
{{attachment:card4.png}} | 変数bとcは同一のオブジェクトを参照しています。 この時点では b.rank の値は10になっています。 |
クラス
クラスでは属性(性質)と動作(機能)を定義します。
属性はデータ構造(データの集まり)とも考えられます。
今回はクラスのデータについて説明します。
指示に従って作図しなさい。 プログラムを実行しないこと。
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つの長方形を描きます。
- 変数宣言はsuit, rank, a, b, c の5つがあります。
- その横にそれぞれ長方形を描きます。
この5つの変数のうち、a,b,cの3つはmainメソッド内のローカル変数です。
- staticなメソッドのローカル変数は、いま長方形を描いたその場所に取られると考えてよい。
- 変数aに代入を行うと、aの横に描いた長方形の中に値(基本データ型の場合は値、オブジェクトの場合は参照)が書かれると考える。
3つの変数 suit, rank, sum はクラスの中にあって、どのメソッドの中にも入っていません。
このうち static変数はここ(クラスの中)に取られます。
一方、 suit, rank の2つは、この場所に変数がとられるわけではありません。
インスタンス(そのクラスのオブジェクト)が作成されるときの型紙として使われます。
角の丸い点線の長方形で囲みます。
Cardというクラスオブジェクトの型紙であることを示します。
次のような図になりました。
このクラスをUMLで描くと次のようになります。 上の図との対応が分かります。
staticな変数には下線を引きます。
クラスは型にあたります。
プログラムの8~10行目の変数宣言では Cardという型(クラス)の変数 a, b, c を準備しています。
3.プログラムの実行をたどってみる
mainメソッドの実行は12行目から始まります。
a = new Card();
右辺の new Card() を行い変数aに代入しています。
new クラス名()
が行われるとそのクラスのオブジェクトが作られます。
Cardはここで定義しているクラスで、そのオブジェクト (インスタンス)は上で描いた型紙と同じ形をした実体です。
インスタンスにはクラス名をつけて上のように描くのが正しいのですが、 どのクラスのインスタンスか明らかなときは省略して次のように書くこともある。
作られたオブジェクト(インスタンス)を変数aに代入すると、 オブジェクトのアドレスが値として代入されて
変数aを使って、このオブジェクトを参照できるようになります。
13,14行目
a.suit = "ハート"; a.rank = 12;
Card型の変数aが参照しているオブジェクト内の変数を参照するには
オブジェクト名.オブジェクト内の変数名
のように、2つの名前をピリオドで繋いで書きます。
- a.suit = "ハート";
で、変数aが参照しているオブジェクト内の変数suitに、文字列"ハート"を代入します。
- a.rank = 12;
で、変数aが参照しているオブジェクト内の変数rankに、整数値12を代入します。
16~18行目
b = new Card(); b.suit = "スペード"; b.rank = 3;
16行目でもうひとつCard型のオブジェクトが作られます。
- 12行目で作られたオブジェクトとは別のオブジェクトです。
オブジェクトはいくつでも作ることができます。
18行目まで実行されると、このようになります。
20行目
c = b;
変数bの値を、変数cに代入しています。
- 変数bはどのオブジェクトを指しているかの情報を保持しています。
- オブジェクトのアドレスを値として持っていると考えてよい。
この値を変数cに代入すると、 変数cは変数bと同じ値をもち、同じオブジェクトを参照することになります。
21行目
c.rank = a.rank - 2;
代入文です。
- 右辺の値を計算します。
- 変数aが参照しているオブジェクト内の変数rankの値から2を引いて、値は10となります。
- 左辺で指定した変数に、この値を代入します。
したがって 変数cが参照しているオブジェクト内の変数rankに、値10が代入されます。
ここまでの結果を図示するとこのようになります。
23行目
System.out.println( b.rank );
変数bが参照しているオブジェクト内の変数rankの値を表示します。
変数bとcは同一のオブジェクトを参照しています。 この時点では b.rank の値は10になっています。