welcome: please sign in
location: "クラス"の差分
6と38のリビジョン間の差分 (その間の編集: 32回)
2008-10-24 12:02:22時点のリビジョン6
サイズ: 2354
編集者: masahiko
コメント:
2011-10-27 05:41:48時点のリビジョン38
サイズ: 6893
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 3: 行 3:
指示に従って作図しなさい。<<BR>> クラスでは'''属性'''(性質)と'''動作'''(機能)を定義します。

属性はデータ構造(データの集まり)とも考えられます。

今回はクラスのデータについて説明します。

-----
指示に従って作図しなさい。
行 12: 行 19:
 static int sum;
行 14: 行 23:
  Card a, b, c;
  
  Card a;
  Card
b;
  Card
c;
行 23: 行 34:

  c = b;
  c.rank = a.rank - 2;
行 24: 行 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 );
行 33: 行 45:
----
1.プログラムの構造を描きます
行 34: 行 48:
プログラムの構造と、宣言されている変数を図示するとこのようになります。 クラス全体を長方形で次のように囲みます。
 . {{attachment:class2.png}}
クラスの中にあるメソッドを次のように囲みます。
今回はmainメソッド1つしかありませんが、通常は沢山のメソッドがあります。
 . {{attachment:class3.png}}
----
2.宣言されている変数1つに対し1つの長方形を描きます。
行 36: 行 56:
クラスの中にある2つの変数 suit と rank はこの場所に変数がとられるわけではありません。<<BR>>
インスタンス(そのクラスのオブジェクト)が作成されるときの'''型紙'''として使われます。<<BR>>
角の丸い点線の長方形で囲んで Cardというクラスオブジェクトの型紙であることを示します。
 . 変数宣言はsuit, rank, sum, a, b, c の6つがあります。
 . その横にそれぞれ長方形を描きます。
行 40: 行 59:
'''クラス'''は型にあたります。<<BR>>
プログラムの8行目の変数宣言では Cardという型(クラス)の変数 a, b, c を準備しています。
これらの変数のうち、a,b,cの3つはmainメソッド内のローカル変数です。
行 43: 行 61:
 {{attachment:card1.png}}  . staticなメソッドのローカル変数は、いま長方形を描いたその場所に取られると考えてよい。
 . 変数aに代入を行うと、aの横に描いた長方形の中に値(基本データ型の場合は値、オブジェクトの場合は参照)が書かれると考える。
行 45: 行 64:
10行目の new Card() が行われると、Cardクラスのオブジェクトが作られます。
先の型紙と同じ形で実体があります。
3つの変数 suit, rank, sum はクラスの中にあって、どのメソッドの中にも入っていません。
行 48: 行 66:
 {{attachment:card2.png}} このうち static変数はクラスの中に取られます。
 . sum の値はここに記録されると考えてよい。
行 50: 行 69:
これをCard型の変数に代入することで、このオブジェクトやオブジェクト内の変数にアクセスできるようになります。<<BR>>
aのsuitは a.suit 、aのrankは a.rank とピリオドでつないで表します。
saticでない変数はインスタンス内に取られます。
 . インスタンスが作成されるときの'''型紙'''として使われます。
 . インスタンスはそのクラスのオブジェクトのこと。
 . インスタンスごとに別の属性値をとることができる。
行 53: 行 74:
14行目でもうひとつCard型のオブジェクトが作られます。<<BR>> suit, rank の2つがこれに該当します。
 . 角の丸い点線の長方形で囲みます。
 . Cardというクラスオブジェクトの型紙であることを示します。

次のような図になりました。
 . {{attachment:card1.png}}

このクラスをUMLで描くと次のようになります。
上の図との対応が分かります。
 . {{attachment:cardclass.png}}
staticな変数には下線を引いて表します。
----
'''クラス'''は型にあたります。

クラスを利用するには、まずその型(クラス)の変数を用意します。

プログラムの10~12行目の変数宣言では Cardという型(クラス)の変数 a, b, c を準備しています。

-----
3.プログラムの実行をたどってみる

mainメソッドの実行は14行目から始まります。
 {{{
 a = new Card();
 }}}

右辺の new Card() を行い変数aに代入しています。
 . '''new クラス名()'''
が行われるとそのクラスのオブジェクトが作られます。

Cardはここで定義しているクラスで、そのオブジェクト
(インスタンス)は上で描いた型紙と同じ形をした実体です。
 . {{attachment:card2a.png}}
インスタンスにはクラス名をつけて上のように描くのが正しいのですが、
どのクラスのインスタンスか明らかなときは省略して次のように書くこともある。
 . {{attachment:card2.png}}

作られたオブジェクト(インスタンス)を変数aに代入すると、
オブジェクトのアドレスが値として代入されて
 . {{attachment:card3.png}}
変数aを使って、このオブジェクトを参照できるようになります。
----
15,16行目
 {{{
 a.suit = "ハート";
 a.rank = 12;
 }}}
Card型の変数aが参照しているオブジェクト内の変数を参照するには
 '''オブジェクト名.オブジェクト内の変数名'''
のように、2つの名前をピリオドで繋いで書きます。

 a.suit = "ハート";
で、変数aが参照しているオブジェクト内の変数suitに、文字列"ハート"を代入します。
 a.rank = 12;
で、変数aが参照しているオブジェクト内の変数rankに、整数値12を代入します。
 . {{attachment:card3a.png}}
----
18~20行目
 {{{
 b = new Card();
 b.suit = "スペード";
 b.rank = 3;
 }}}
18行目でもうひとつCard型のオブジェクトが作られます。
 . 14行目で作られたオブジェクトとは別のオブジェクトです。
行 56: 行 141:
 {{attachment:card3.png}} 20行目まで実行されると、このようになります。
 . {{attachment:card4a.png}}
----
22行目
 {{{
 c = b;
 }}}
変数bの値を、変数cに代入しています。<<BR>>
 . 変数bはどのオブジェクトを指しているかの情報を保持しています。
 . オブジェクトのアドレスを値として持っていると考えてよい。
この値を変数cに代入すると、
変数cは変数bと同じ値をもち、同じオブジェクトを参照することになります。
 . {{attachment:card4b.png}}
----
23行目
 {{{
 c.rank = a.rank - 2;
 }}}
代入文です。
 . 右辺の値を計算します。
 . 変数aが参照しているオブジェクト内の変数rankの値から2を引いて、値は10となります。
 . 左辺で指定した変数に、この値を代入します。
したがって
変数cが参照しているオブジェクト内の変数rankに、値10が代入されます。
行 58: 行 166:
18行目では変数bの値を、変数cに代入しています。
この結果、変数cは変数bと同じ値をもつことになり、同じオブジェクトを参照します。
ここまでの結果を図示するとこのようになります。
 . {{attachment:card4.png}}
行 61: 行 169:
19行目で c.rank の値を変更しています。
変数cとbは同一のオブジェクトを参照していましたから、
この後で b.rank の値を参照すると、この値も変わっているのが分かります。
----
25行目
 {{{
 System.out.println( b.rank );
 }}}
変数bが参照しているオブジェクト内の変数rankの値を表示します。
行 65: 行 176:
 {{attachment:card4.png}} 変数bとcは同一のオブジェクトを参照しています。
この時点では b.rank の値は10になっています。

----
27行目
 {{{
 Card.sum = a.rank + b.rank + c.rank;
 }}}
変数aが指しているオブジェクトのrankの値と、
変数bが指しているオブジェクトのrankの値と、
変数cが指しているオブジェクトのrankの値を足し算し、
結果を クラスCardのstatic変数sumに代入します。

 . 値は 12 + 10 + 10 で 32

同じクラス内ではクラス名を省略して
 . sum = a.rank + b.rank + c.rank;
と書いても良い。

クラス

クラスでは属性(性質)と動作(機能)を定義します。

属性はデータ構造(データの集まり)とも考えられます。

今回はクラスのデータについて説明します。


指示に従って作図しなさい。 プログラムを実行しないこと。

   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.プログラムの構造を描きます

クラス全体を長方形で次のように囲みます。

  • class2.png

クラスの中にあるメソッドを次のように囲みます。 今回はmainメソッド1つしかありませんが、通常は沢山のメソッドがあります。

  • class3.png


2.宣言されている変数1つに対し1つの長方形を描きます。

  • 変数宣言はsuit, rank, sum, a, b, c の6つがあります。
  • その横にそれぞれ長方形を描きます。

これらの変数のうち、a,b,cの3つはmainメソッド内のローカル変数です。

  • staticなメソッドのローカル変数は、いま長方形を描いたその場所に取られると考えてよい。
  • 変数aに代入を行うと、aの横に描いた長方形の中に値(基本データ型の場合は値、オブジェクトの場合は参照)が書かれると考える。

3つの変数 suit, rank, sum はクラスの中にあって、どのメソッドの中にも入っていません。

このうち static変数はクラスの中に取られます。

  • sum の値はここに記録されると考えてよい。

saticでない変数はインスタンス内に取られます。

  • インスタンスが作成されるときの型紙として使われます。

  • インスタンスはそのクラスのオブジェクトのこと。
  • インスタンスごとに別の属性値をとることができる。

suit, rank の2つがこれに該当します。

  • 角の丸い点線の長方形で囲みます。
  • Cardというクラスオブジェクトの型紙であることを示します。

次のような図になりました。

  • card1.png

このクラスをUMLで描くと次のようになります。 上の図との対応が分かります。

  • cardclass.png

staticな変数には下線を引いて表します。


クラスは型にあたります。

クラスを利用するには、まずその型(クラス)の変数を用意します。

プログラムの10~12行目の変数宣言では Cardという型(クラス)の変数 a, b, c を準備しています。


3.プログラムの実行をたどってみる

mainメソッドの実行は14行目から始まります。

  •  a = new Card();

右辺の new Card() を行い変数aに代入しています。

  • new クラス名()

が行われるとそのクラスのオブジェクトが作られます。

Cardはここで定義しているクラスで、そのオブジェクト (インスタンス)は上で描いた型紙と同じ形をした実体です。

  • card2a.png

インスタンスにはクラス名をつけて上のように描くのが正しいのですが、 どのクラスのインスタンスか明らかなときは省略して次のように書くこともある。

  • card2.png

作られたオブジェクト(インスタンス)を変数aに代入すると、 オブジェクトのアドレスが値として代入されて

  • card3.png

変数aを使って、このオブジェクトを参照できるようになります。


15,16行目

  •  a.suit = "ハート";
     a.rank = 12;

Card型の変数aが参照しているオブジェクト内の変数を参照するには

  • オブジェクト名.オブジェクト内の変数名

のように、2つの名前をピリオドで繋いで書きます。

  • a.suit = "ハート";

で、変数aが参照しているオブジェクト内の変数suitに、文字列"ハート"を代入します。

  • a.rank = 12;

で、変数aが参照しているオブジェクト内の変数rankに、整数値12を代入します。

  • card3a.png


18~20行目

  •  b = new Card();
     b.suit = "スペード";
     b.rank = 3;

18行目でもうひとつCard型のオブジェクトが作られます。

  • 14行目で作られたオブジェクトとは別のオブジェクトです。

オブジェクトはいくつでも作ることができます。

20行目まで実行されると、このようになります。

  • card4a.png


22行目

  •  c = b;

変数bの値を、変数cに代入しています。

  • 変数bはどのオブジェクトを指しているかの情報を保持しています。
  • オブジェクトのアドレスを値として持っていると考えてよい。

この値を変数cに代入すると、 変数cは変数bと同じ値をもち、同じオブジェクトを参照することになります。

  • card4b.png


23行目

  •  c.rank = a.rank - 2;

代入文です。

  • 右辺の値を計算します。
  • 変数aが参照しているオブジェクト内の変数rankの値から2を引いて、値は10となります。
  • 左辺で指定した変数に、この値を代入します。

したがって 変数cが参照しているオブジェクト内の変数rankに、値10が代入されます。

ここまでの結果を図示するとこのようになります。

  • card4.png


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に代入します。

  • 値は 12 + 10 + 10 で 32

同じクラス内ではクラス名を省略して

  • sum = a.rank + b.rank + c.rank;

と書いても良い。

クラス (最終更新日時 2011-10-27 05:41:48 更新者 masahiko)