4979
コメント:
|
5455
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 36: | 行 36: |
System.out.println( "aは " + a.suit + a.rank ); | |
行 38: | 行 37: |
System.out.println( "cは " + c.suit + c.rank ); | |
行 59: | 行 57: |
. 変数aに代入を行うと、aの横に描いた長方形の中に値が書かれる。 | . 変数aに代入を行うと、aの横に描いた長方形の中に値(基本データ型の場合は値、オブジェクトの場合は参照)が書かれると考える。 |
行 70: | 行 68: |
この図とクラスを表す図(UML)とが対応しています。 | このクラスをUMLで描くと次のようになります。 上の図との対応が分かります。 . {{attachment:cardclass.png}} |
行 91: | 行 91: |
どのクラスのインスタンスか明らかなときは省略して次のように書いても良い。 | どのクラスのインスタンスか明らかなときは省略して次のように書くこともある。 |
行 94: | 行 94: |
作られたオブジェクト(インスタンス)を変数aに代入すると | 作られたオブジェクト(インスタンス)を変数aに代入すると、 オブジェクトのアドレスが値として代入されて |
行 96: | 行 97: |
変数aを使って、このオブジェクトにアクセスできるようになります。 --- |
変数aを使って、このオブジェクトを参照できるようになります。 ---- |
行 104: | 行 105: |
a.オブジェクト内の変数名 | '''オブジェクト名.オブジェクト内の変数名''' |
行 111: | 行 112: |
にアクセスできるようになります。<<BR>> これをCard型の変数に代入することで、このオブジェクトやオブジェクト内の変数にアクセスできるようになります。<<BR>> aのsuitは a.suit 、aのrankは a.rank とピリオドでつないで表します。 14行目でもうひとつCard型のオブジェクトが作られます。<<BR>> |
. {{attachment:card3a.png}} ---- 16~18行目 {{{ b = new Card(); b.suit = "スペード"; b.rank = 3; }}} 16行目でもうひとつCard型のオブジェクトが作られます。 . 12行目で作られたオブジェクトとは別のオブジェクトです。 |
行 119: | 行 124: |
18行目まで実行されると、このようになります。 . {{attachment:card4a.png}} ---- 20行目 {{{ c = b; }}} 変数bの値を、変数cに代入しています。<<BR>> . 変数bはどのオブジェクトを指しているかの情報を保持しています。 . オブジェクトのアドレスを値として持っていると考えてよい。 この値を変数cに代入すると、 変数cは変数bと同じ値をもち、同じオブジェクトを参照することになります。 . {{attachment:card4b.png}} ---- 21行目 {{{ c.rank = 10; }}} 変数cが参照しているオブジェクト内の変数rankに、値10を代入します。<<BR>> |
|
行 120: | 行 144: |
18行目では変数bの値を、変数cに代入しています。 この結果、変数cは変数bと同じ値をもつことになり、同じオブジェクトを参照します。 19行目で c.rank の値を変更しています。 |
|
行 125: | 行 145: |
この後で b.rank の値を参照すると、この値も変わっているのが分かります。 | この後で b.rank の値を参照すると、この値も変わっています。 |
クラス
クラスでは属性(性質)と動作(機能)を定義します。
属性はデータ構造(データの集まり)とも考えられます。
今回はクラスのデータについて説明します。
指示に従って作図しなさい。 プログラムを実行しないこと。
1 public class Card
2 {
3 String suit;
4 int rank;
5
6 public static void main(String[] args)
7 {
8 Card a;
9 Card b;
10 Card c;
11
12 a = new Card();
13 a.suit = "ハート";
14 a.rank = 12;
15
16 b = new Card();
17 b.suit = "スペード";
18 b.rank = 3;
19
20 c = b;
21 c.rank = 10;
22
23 System.out.println( "bは " + b.suit + b.rank );
24 }
25 }
1.プログラムの構造を描きます
クラス全体を長方形で次のように囲みます。
クラスの中にあるメソッドを次のように囲みます。 今回はmainメソッド1つしかありませんが、通常は沢山のメソッドがあります。
2.宣言されている変数1つに対し1つの長方形を描きます。
- 変数宣言はsuit, rank, a, b, c の5つがあります。
- その横にそれぞれ長方形を描きます。
この5つの変数のうち、a,b,cの3つはmainメソッド内のローカル変数です。
- staticなメソッドのローカル変数は、いま長方形を描いたその場所に取られると考えてよい。
- 変数aに代入を行うと、aの横に描いた長方形の中に値(基本データ型の場合は値、オブジェクトの場合は参照)が書かれると考える。
2つの変数 suit と rank はクラスの中にあって、どのメソッドの中にも入っていません。
このような変数は、この場所に変数がとられるわけではありません。
インスタンス(そのクラスのオブジェクト)が作成されるときの型紙として使われます。
角の丸い点線の長方形で囲みます。
Cardというクラスオブジェクトの型紙であることを示します。
次のような図になりました。
このクラスをUMLで描くと次のようになります。 上の図との対応が分かります。
クラスは型にあたります。
プログラムの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 = 10;
変数cが参照しているオブジェクト内の変数rankに、値10を代入します。
変数cとbは同一のオブジェクトを参照していましたから、 この後で b.rank の値を参照すると、この値も変わっています。