<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>クラス</title><revhistory><revision><revnumber>38</revnumber><date>2011-10-27 05:41:48</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>37</revnumber><date>2011-10-27 05:30:46</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>36</revnumber><date>2011-10-26 05:03:54</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>35</revnumber><date>2011-10-26 03:54:24</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>34</revnumber><date>2011-10-26 03:46:55</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>33</revnumber><date>2009-10-22 01:18:48</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>32</revnumber><date>2009-10-21 06:31:28</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>31</revnumber><date>2009-10-21 06:30:31</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>30</revnumber><date>2009-10-21 06:27:40</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>29</revnumber><date>2009-10-21 06:23:56</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>28</revnumber><date>2009-10-21 06:15:31</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>27</revnumber><date>2009-10-21 06:12:30</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>26</revnumber><date>2009-10-21 01:24:27</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>25</revnumber><date>2009-10-21 01:23:40</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>24</revnumber><date>2009-10-21 01:05:57</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>23</revnumber><date>2009-10-21 01:01:03</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>22</revnumber><date>2009-10-21 00:52:21</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>21</revnumber><date>2009-10-21 00:44:04</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>20</revnumber><date>2009-10-20 13:02:06</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>19</revnumber><date>2009-10-20 13:01:24</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>18</revnumber><date>2009-10-20 12:59:02</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>17</revnumber><date>2009-10-20 12:54:07</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>16</revnumber><date>2009-10-20 12:50:21</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>15</revnumber><date>2009-10-20 12:48:05</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>14</revnumber><date>2009-10-20 12:33:18</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>13</revnumber><date>2009-10-20 12:23:26</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>12</revnumber><date>2009-10-20 12:20:29</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>11</revnumber><date>2009-10-20 12:16:00</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>10</revnumber><date>2009-10-20 12:03:29</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>9</revnumber><date>2009-10-20 11:59:23</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>8</revnumber><date>2009-10-20 11:58:35</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>7</revnumber><date>2008-10-25 00:56:58</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>6</revnumber><date>2008-10-24 12:02:22</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>5</revnumber><date>2008-10-24 12:01:37</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>4</revnumber><date>2008-10-24 07:24:19</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>3</revnumber><date>2008-10-24 07:23:40</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>2</revnumber><date>2008-10-23 06:55:57</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>1</revnumber><date>2008-10-23 06:11:07</date><authorinitials>masahiko</authorinitials></revision></revhistory></articleinfo><section><title>クラス</title><para>クラスでは<emphasis role="strong">属性</emphasis>(性質)と<emphasis role="strong">動作</emphasis>(機能)を定義します。 </para><para>属性はデータ構造（データの集まり）とも考えられます。 </para><para>今回はクラスのデータについて説明します。 </para><!--rule (<hr>) is not applicable to DocBook--><para> 指示に従って作図しなさい。 プログラムを実行しないこと。 </para><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[class]]></token><![CDATA[ ]]><methodname><![CDATA[Card]]></methodname>
<![CDATA[{]]>
<![CDATA[        ]]><methodname><![CDATA[String]]></methodname><![CDATA[ ]]><methodname><![CDATA[suit]]></methodname><![CDATA[;]]>
<![CDATA[        ]]><token><![CDATA[int]]></token><![CDATA[ ]]><methodname><![CDATA[rank]]></methodname><![CDATA[;]]>
<![CDATA[        ]]>
<![CDATA[        ]]><token><![CDATA[static]]></token><![CDATA[ ]]><token><![CDATA[int]]></token><![CDATA[ ]]><methodname><![CDATA[sum]]></methodname><![CDATA[;]]>

<![CDATA[        ]]><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[static]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[main]]></methodname><![CDATA[(]]><methodname><![CDATA[String]]></methodname><![CDATA[[] ]]><methodname><![CDATA[args]]></methodname><![CDATA[)]]>
<![CDATA[        {]]>
<![CDATA[                ]]><methodname><![CDATA[Card]]></methodname><![CDATA[ ]]><methodname><![CDATA[a]]></methodname><![CDATA[;]]>
<![CDATA[                ]]><methodname><![CDATA[Card]]></methodname><![CDATA[ ]]><methodname><![CDATA[b]]></methodname><![CDATA[;]]>
<![CDATA[                ]]><methodname><![CDATA[Card]]></methodname><![CDATA[ ]]><methodname><![CDATA[c]]></methodname><![CDATA[;]]>

<![CDATA[                ]]><methodname><![CDATA[a]]></methodname><![CDATA[ = ]]><token><![CDATA[new]]></token><![CDATA[ ]]><methodname><![CDATA[Card]]></methodname><![CDATA[();]]>
<![CDATA[                ]]><methodname><![CDATA[a]]></methodname><![CDATA[.]]><methodname><![CDATA[suit]]></methodname><![CDATA[ = ]]><phrase><![CDATA["ハート"]]></phrase><![CDATA[;]]>
<![CDATA[                ]]><methodname><![CDATA[a]]></methodname><![CDATA[.]]><methodname><![CDATA[rank]]></methodname><![CDATA[ = 12;]]>
<![CDATA[                ]]>
<![CDATA[                ]]><methodname><![CDATA[b]]></methodname><![CDATA[ = ]]><token><![CDATA[new]]></token><![CDATA[ ]]><methodname><![CDATA[Card]]></methodname><![CDATA[();]]>
<![CDATA[                ]]><methodname><![CDATA[b]]></methodname><![CDATA[.]]><methodname><![CDATA[suit]]></methodname><![CDATA[ = ]]><phrase><![CDATA["スペード"]]></phrase><![CDATA[;]]>
<![CDATA[                ]]><methodname><![CDATA[b]]></methodname><![CDATA[.]]><methodname><![CDATA[rank]]></methodname><![CDATA[ = 3;]]>

<![CDATA[                ]]><methodname><![CDATA[c]]></methodname><![CDATA[ = ]]><methodname><![CDATA[b]]></methodname><![CDATA[;]]>
<![CDATA[                ]]><methodname><![CDATA[c]]></methodname><![CDATA[.]]><methodname><![CDATA[rank]]></methodname><![CDATA[ = ]]><methodname><![CDATA[a]]></methodname><![CDATA[.]]><methodname><![CDATA[rank]]></methodname><![CDATA[ - 2;]]>
<![CDATA[                ]]>
<![CDATA[                ]]><methodname><![CDATA[System]]></methodname><![CDATA[.]]><methodname><![CDATA[out]]></methodname><![CDATA[.]]><methodname><![CDATA[println]]></methodname><![CDATA[( ]]><methodname><![CDATA[b]]></methodname><![CDATA[.]]><methodname><![CDATA[rank]]></methodname><![CDATA[ );]]>
<![CDATA[                ]]>
<![CDATA[                ]]><methodname><![CDATA[Card]]></methodname><![CDATA[.]]><methodname><![CDATA[sum]]></methodname><![CDATA[ = ]]><methodname><![CDATA[a]]></methodname><![CDATA[.]]><methodname><![CDATA[rank]]></methodname><![CDATA[ + ]]><methodname><![CDATA[b]]></methodname><![CDATA[.]]><methodname><![CDATA[rank]]></methodname><![CDATA[ + ]]><methodname><![CDATA[c]]></methodname><![CDATA[.]]><methodname><![CDATA[rank]]></methodname><![CDATA[;]]>
<![CDATA[                ]]><methodname><![CDATA[System]]></methodname><![CDATA[.]]><methodname><![CDATA[out]]></methodname><![CDATA[.]]><methodname><![CDATA[println]]></methodname><![CDATA[( ]]><methodname><![CDATA[Card]]></methodname><![CDATA[.]]><methodname><![CDATA[sum]]></methodname><![CDATA[ );]]>
<![CDATA[        }]]>
<![CDATA[}]]>
</programlisting><!--rule (<hr>) is not applicable to DocBook--><para> １．プログラムの構造を描きます </para><para>クラス全体を長方形で次のように囲みます。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%AF%E3%83%A9%E3%82%B9?action=AttachFile&amp;do=get&amp;target=class2.png"/></imageobject><textobject><phrase>class2.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>クラスの中にあるメソッドを次のように囲みます。 今回はmainメソッド１つしかありませんが、通常は沢山のメソッドがあります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%AF%E3%83%A9%E3%82%B9?action=AttachFile&amp;do=get&amp;target=class3.png"/></imageobject><textobject><phrase>class3.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--><para> ２．宣言されている変数１つに対し１つの長方形を描きます。 </para><itemizedlist><listitem override="none"><para>変数宣言はsuit, rank, sum, a, b, c の６つがあります。 </para></listitem><listitem override="none"><para>その横にそれぞれ長方形を描きます。 </para></listitem></itemizedlist><para>これらの変数のうち、a,b,cの３つはmainメソッド内のローカル変数です。 </para><itemizedlist><listitem override="none"><para>staticなメソッドのローカル変数は、いま長方形を描いたその場所に取られると考えてよい。 </para></listitem><listitem override="none"><para>変数aに代入を行うと、aの横に描いた長方形の中に値(基本データ型の場合は値、オブジェクトの場合は参照)が書かれると考える。 </para></listitem></itemizedlist><para>３つの変数 suit, rank, sum はクラスの中にあって、どのメソッドの中にも入っていません。 </para><para>このうち static変数はクラスの中に取られます。 </para><itemizedlist><listitem override="none"><para>sum の値はここに記録されると考えてよい。 </para></listitem></itemizedlist><para>saticでない変数はインスタンス内に取られます。 </para><itemizedlist><listitem override="none"><para>インスタンスが作成されるときの<emphasis role="strong">型紙</emphasis>として使われます。 </para></listitem><listitem override="none"><para>インスタンスはそのクラスのオブジェクトのこと。 </para></listitem><listitem override="none"><para>インスタンスごとに別の属性値をとることができる。 </para></listitem></itemizedlist><para>suit, rank の２つがこれに該当します。 </para><itemizedlist><listitem override="none"><para>角の丸い点線の長方形で囲みます。 </para></listitem><listitem override="none"><para>Cardというクラスオブジェクトの型紙であることを示します。 </para></listitem></itemizedlist><para>次のような図になりました。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%AF%E3%83%A9%E3%82%B9?action=AttachFile&amp;do=get&amp;target=card1.png"/></imageobject><textobject><phrase>card1.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>このクラスをUMLで描くと次のようになります。 上の図との対応が分かります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%AF%E3%83%A9%E3%82%B9?action=AttachFile&amp;do=get&amp;target=cardclass.png"/></imageobject><textobject><phrase>cardclass.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>staticな変数には下線を引いて表します。 </para><!--rule (<hr>) is not applicable to DocBook--><para> <emphasis role="strong">クラス</emphasis>は型にあたります。 </para><para>クラスを利用するには、まずその型(クラス)の変数を用意します。 </para><para>プログラムの１０～１２行目の変数宣言では Cardという型(クラス)の変数 a, b, c を準備しています。 </para><!--rule (<hr>) is not applicable to DocBook--><para> ３．プログラムの実行をたどってみる </para><para>mainメソッドの実行は14行目から始まります。 </para><itemizedlist><listitem override="none"><screen><![CDATA[ a = new Card();]]></screen></listitem></itemizedlist><para>右辺の new Card() を行い変数aに代入しています。 </para><itemizedlist><listitem override="none"><para><emphasis role="strong">new クラス名()</emphasis> </para></listitem></itemizedlist><para>が行われるとそのクラスのオブジェクトが作られます。 </para><para>Cardはここで定義しているクラスで、そのオブジェクト (インスタンス)は上で描いた型紙と同じ形をした実体です。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%AF%E3%83%A9%E3%82%B9?action=AttachFile&amp;do=get&amp;target=card2a.png"/></imageobject><textobject><phrase>card2a.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>インスタンスにはクラス名をつけて上のように描くのが正しいのですが、 どのクラスのインスタンスか明らかなときは省略して次のように書くこともある。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%AF%E3%83%A9%E3%82%B9?action=AttachFile&amp;do=get&amp;target=card2.png"/></imageobject><textobject><phrase>card2.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>作られたオブジェクト(インスタンス)を変数aに代入すると、 オブジェクトのアドレスが値として代入されて </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%AF%E3%83%A9%E3%82%B9?action=AttachFile&amp;do=get&amp;target=card3.png"/></imageobject><textobject><phrase>card3.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>変数aを使って、このオブジェクトを参照できるようになります。 </para><!--rule (<hr>) is not applicable to DocBook--><para> 15,16行目 </para><itemizedlist><listitem override="none"><screen><![CDATA[ a.suit = "ハート";
 a.rank = 12;]]></screen></listitem></itemizedlist><para>Card型の変数aが参照しているオブジェクト内の変数を参照するには </para><itemizedlist><listitem override="none"><para><emphasis role="strong">オブジェクト名.オブジェクト内の変数名</emphasis> </para></listitem></itemizedlist><para>のように、２つの名前をピリオドで繋いで書きます。 </para><itemizedlist><listitem override="none"><para>a.suit = &quot;ハート&quot;; </para></listitem></itemizedlist><para>で、変数aが参照しているオブジェクト内の変数suitに、文字列&quot;ハート&quot;を代入します。 </para><itemizedlist><listitem override="none"><para>a.rank = 12; </para></listitem></itemizedlist><para>で、変数aが参照しているオブジェクト内の変数rankに、整数値12を代入します。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%AF%E3%83%A9%E3%82%B9?action=AttachFile&amp;do=get&amp;target=card3a.png"/></imageobject><textobject><phrase>card3a.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--><para> 18～20行目 </para><itemizedlist><listitem override="none"><screen><![CDATA[ b = new Card();
 b.suit = "スペード";
 b.rank = 3;]]></screen></listitem></itemizedlist><para>18行目でもうひとつCard型のオブジェクトが作られます。 </para><itemizedlist><listitem override="none"><para>14行目で作られたオブジェクトとは別のオブジェクトです。 </para></listitem></itemizedlist><para>オブジェクトはいくつでも作ることができます。 </para><para>20行目まで実行されると、このようになります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%AF%E3%83%A9%E3%82%B9?action=AttachFile&amp;do=get&amp;target=card4a.png"/></imageobject><textobject><phrase>card4a.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--><para> 22行目 </para><itemizedlist><listitem override="none"><screen><![CDATA[ c = b;]]></screen></listitem></itemizedlist><para>変数bの値を、変数cに代入しています。</para><itemizedlist><listitem override="none"><para>変数bはどのオブジェクトを指しているかの情報を保持しています。 </para></listitem><listitem override="none"><para>オブジェクトのアドレスを値として持っていると考えてよい。 </para></listitem></itemizedlist><para>この値を変数cに代入すると、 変数cは変数bと同じ値をもち、同じオブジェクトを参照することになります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%AF%E3%83%A9%E3%82%B9?action=AttachFile&amp;do=get&amp;target=card4b.png"/></imageobject><textobject><phrase>card4b.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--><para> 23行目 </para><itemizedlist><listitem override="none"><screen><![CDATA[ c.rank = a.rank - 2;]]></screen></listitem></itemizedlist><para>代入文です。 </para><itemizedlist><listitem override="none"><para>右辺の値を計算します。 </para></listitem><listitem override="none"><para>変数aが参照しているオブジェクト内の変数rankの値から２を引いて、値は10となります。 </para></listitem><listitem override="none"><para>左辺で指定した変数に、この値を代入します。 </para></listitem></itemizedlist><para>したがって 変数cが参照しているオブジェクト内の変数rankに、値10が代入されます。 </para><para>ここまでの結果を図示するとこのようになります。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%82%AF%E3%83%A9%E3%82%B9?action=AttachFile&amp;do=get&amp;target=card4.png"/></imageobject><textobject><phrase>card4.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--><para> 25行目 </para><itemizedlist><listitem override="none"><screen><![CDATA[ System.out.println( b.rank );]]></screen></listitem></itemizedlist><para>変数bが参照しているオブジェクト内の変数rankの値を表示します。 </para><para>変数bとcは同一のオブジェクトを参照しています。 この時点では b.rank の値は10になっています。 </para><!--rule (<hr>) is not applicable to DocBook--><para> 27行目 </para><itemizedlist><listitem override="none"><screen><![CDATA[ Card.sum = a.rank + b.rank + c.rank;]]></screen></listitem></itemizedlist><para>変数aが指しているオブジェクトのrankの値と、 変数bが指しているオブジェクトのrankの値と、 変数cが指しているオブジェクトのrankの値を足し算し、 結果を クラスCardのstatic変数sumに代入します。 </para><itemizedlist><listitem override="none"><para>値は 12 + 10 + 10 で 32 </para></listitem></itemizedlist><para>同じクラス内ではクラス名を省略して </para><itemizedlist><listitem override="none"><para>sum = a.rank + b.rank + c.rank; </para></listitem></itemizedlist><para>と書いても良い。 </para></section></article>