2002 -0620 ver 1.00 発行予定 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  執筆&編集 斎藤末広 suehiro@he.mirai.ne.jp  ┃ ┃'&┃&''*┃*''%┃%'  発行    江口昌宏 jmaga@yscon.co.jp    ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 前回の発行部数 6425部 まぐまぐ:5308 melma!:701 Pubzine:416 ★解除・登録 広告募集:http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第19号 2002/06/20  構築子(コンストラクタ) ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項:  Windows98SE, SDK(JDK) 1.3.1,IE 5.5 を前提としています。  拡張子を表示するに設定してください。 ------------------------------------------------------------------------ ▼ コンストラクタとは  前号の JavaScript のサンプルで,配列を宣言するところで, 例 j18-02.htm http://www.yscon.co.jp/j/java/jmaga/j18/18-02.htm (部分) xque = new Array(3); xans = new Array(3); xseikaku = new Array(8);  というプログラム文がありました。前号では,生成また構築(コンストラクト) という用語を使っていませんが,このプログラム文は,配列のインスタンスを生 成して,それを xque という名前にしています。これをオブジェクト指向の用語 では,構築(コンストラクト)といいます。new は,生成演算子,この場合の Array は,構築子(コンストラクタ)といいます。  Javaの変数では基本型(整数や実数,真偽)以外は,参照型と言われて,参照型 は,ただ,番地が入るだけです。その番地に実際に参照されるものがなくてはい けません。それを作成するために,構築子が必要です。  new は,前号で扱った配列のインスタンスの生成だけでなく,クラスからイン スタンスを生成するときに使用します。この号では,Java の Color クラスの 構築子(コンストラクタ)を例にして解説します。  生成と構築は同じ意味で使用しています。日本語として文の中で使用するとき は,「生成」を使う方がしっくりする場合が多いので,文章の中では,「生成す る」を使用して,コンストラクタを指すときは,構築子(コンストラクタ)を使 います。 ------------------------------------------------------------------------ ▼ インスタンス生成のサンプル  次のようなサンプルを用意しました。 色の帯を6本表示します。 例 j19-01 xSmpColor.java ソース http://www.yscon.co.jp/j/java/jmaga/j19/xSmpColor.java 動作  http://www.yscon.co.jp/j/java/jmaga/j19/xSmpColor.htm (行番号無しのソースは最後にあります) 1: import java.applet.Applet; 2: import java.awt.Color; 3: import java.awt.Graphics; 4: 5: public class xSmpColor extends Applet{ 6: 7: Color xc1 = new Color(255,0,0); // ←注目 生成方法 赤 100% 8: Color xc2, xc3, xc4, xc5; 9: 10: public void init(){ 11: xc2 = new Color(0x00FF00); // ← 注目 生成方法 緑 100% 12: xc3 = new Color(0.0f, 0.0f, 1.0f); // ← 注目 生成方法 青 100% 13: xc4 = Color.orange; // ← 注目 new なし 14: } 15: 16: public void paint(Graphics xg){ 17: 18: xg.setColor(xc1); 19: xg.fillRect(0,0,100,20); 20: 21: xg.setColor(xc2); 22: xg.fillRect(0,21,100,20); 23: 24: xg.setColor(xc3); 25: xg.fillRect(0,42,100,20); 26: 27: xg.setColor(xc4); 28: xg.fillRect(0,70,100,20); 29: 30: xc5 = xc3; // ← 注目 xc5 は,newなし 31: xg.setColor(xc5); 32: xg.fillRect(0,91,100,20); 33: 34: xg.setColor(new Color(100, 250, 200)); // ← 注目 直接法 35: xg.fillRect(0,112,100,20); 36: } 37: }  この xSmpClolor.java の構造は,  import 部  本体 宣言部 init()定義 paint()定義  です。  宣言部で,Color のインスタンスを宣言しています。その宣言部で,xc1 は, 宣言部で色も決定しています。xc2, xc3, xc4 は,init()定義の中で色を決めて います。xc5は,paint定義で色を決めています。そのpaint定義でそれらの色を長 方形(rectangle)の形で表示しています。  new のところが,今回説明する構築子(コンストラクタ)のところです。以下, 順に解説をします。 ------------------------------------------------------------------------ ▼ まず,new に注目 7: Color xc1 = new Color(255,0,0); // ←注目 生成方法 赤 100%  これが,構築子(コンストラクタ)を利用したもっとも基本的な書き方です。  クラス名 インスタンス名 = new クラス名(引数の並び)  です。new の 後のクラス名は,左に代入するインスタンスに代入可能である インスタンスを生成できるクラスである必要があります。クラス名を使いますが 正式には,構築子(コンストラクタ)といいます。  このプログラム文の意味は,「Color クラスのインスタンス xc1 用意し,Colorク ラスのインスタンスを255, 0, 0 のパラメータを使って主記憶上に構築し,そのア ドレスを,xc1 に代入する」です。  このプログラム文は,  Color xc1; // Color クラスのインスタンス xc1を用意する。  xc1 = new Color(255,0,0); // 主記憶上にColorクラスのインスタンスを生成 // して,その番地をxc1に代入する  のように書くこともできます。その場合,new の方の式は,書く場所に制限が あり,このプログラムであれば,init() か,paint() の定義の中に書く必要が あります。  分離した書き方が,init()の定義に書いてあります。 11: xc2 = new Color(0x00FF00); // ← 注目 生成方法 緑 100% 12: xc3 = new Color(0.0f, 0.0f, 1.0f); // ← 注目 生成方法 青 100% です。 ------------------------------------------------------------------------ ▼ 構築子(コンストラクタ)の書式解説 Color xc1 = new Color(255,0,0); // ←注目 生成方法 赤 100%   ----------  の下線の部分は,Color クラスのインスタンス xc1 を用意するでした。インス タンスを宣言する一般的な書き方です。 Color xc1 = new Color(255,0,0); // ←注目 生成方法 赤 100%         -------------------  new は,生成演算子といい,それに続く Color(255,0,0)の部分は,構築子(コ ンストラクタ)と呼ばれます。構築子(コンストラクタ)の書式は,関数(メソッド) に準じて,  生成するクラス名(パラメータ並び)  例 Color(255, 0, 0) です。多くの本で,構築子(コンストラクタ)は,返値型を持たない特殊なメソッ ドと説明されています。特殊なメソッドという認識はいいですが,返値型が省略 されてみるのは妥当ではありません。省略されているのは,メソッド名で,返値型 はそのクラス名です。   new 生成するクラス名 省略される関数名 (パラメータ並び)   new Color (255,0,0) と考えます。構築子(コンストラクタ)を実行すると,クラスのインスタンスが返 ります。 ------------------------------------------------------------------------ ▼ Colorクラスの構築子(コンストラクタ)は複数あり  特定のクラスの構築子(コンストラクタ)は,複数用意できます。  Color クラスの場合は,次の3種類の構築子(コンストラクタ)がこのプログラ ムで登場しています。  new Color(255,0,0);  new Color(0.0f, 0.0f, 1.0f);  new Color(0x00FF00);  Color クラスは,光の粉をもった妖精のようなクラスです。光の粉は3種類 あり,赤(RED),緑(GREEN),青(BLUE)です。併せて,RGB といいます。生成す る場合は,この光の粉の量を指定します。指定の仕方に,3種類あります。  Color(整数,整数,整数)  順にR, G, B の値を,0から255(=16進数だとFF)で指定します。  Color(実数, 実数,実数)  R, G, B の値を,0.0f 〜 1.0f の間で指定します。実数の型は,単精度です ので,1.0f のように数値の後にfを付けます。付けないと倍精度と解釈されて, コンパイルエラーとなります。  Color(整数)  16 進の表記で,0xRRGGBB で表わす数字で指定します。例えば,0x00FF00 は,  緑です。 ------------------------------------------------------------------------ ▼ new が必要ないとき  次のプログラムの部分のうち,xc4 のところを注目して下さい。 10: public void init(){ 11: xc2 = new Color(0x00FF00); // ← 注目 生成方法 緑 100% 12: xc3 = new Color(0.0f, 0.0f, 1.0f); // ← 注目 生成方法 青 100% 13: xc4 = Color.orange; // ← 注目 new なし 14: }  xc4 のところは,new がありません。これには,Color.orange の値(アドレス) が代入されます。つまり,すでに,Color.orange で 用意されているものを利用 しているため,new をする必要がありません。  Color.orange は,Color クラスが事前に用意してインスタンスです。  次のプログラムの部分をみて下さい。 30: xc5 = xc3; // ← 注目 xc5 は,newなし 31: xg.setColor(xc5); 32: xg.fillRect(0,91,100,20);  この xc5 も上の xc4 と同様に,すでに xc3 の値(アドレス)が利用されるの で,new をする必要がありません。 ------------------------------------------------------------------------ ▼ 無名インスタンス  次のプログラムの部分を見てください。 xg.setColor(new Color(100, 250, 200)); // ← 注目 直接法  xg.setColor で,xg に色の設定します。そのときに,Color クラスのインスタ ンスを生成しています。この場合,生成されるインスタンスには,名前が付きま せん。無名インスタンスといいます。直接法を利用しています。  Jマガ17号で説明した  xg.drawString("Hello, World",100, 120);  も直接法でした。直接法の特色は,一時的な変数やインスタンスを利用せず, 必要となるところに,直接書くことでした。  new がプログラムで登場するとプログラムが分かりにくくなります。それは, この無名インタンスや無名クラス(次号説明)使われているのが大きな要因です。  無名xxを利用した直接法を次号に詳しく扱います。 参考:Jマガ17号 http://www.yscon.co.jp/j/java/jmaga/jmaga017.txt ------------------------------------------------------------------------ ▼ まとめ  サンプルプログラムでは,長方形の形で,6つの色を表示しました。  それぞれ色を違う生成方法で生成(構築)しました。  最後の色は,色指定は,無名インタンスを利用しました。直接法でやりました。  参考に今回のサンプルプログラムを掲載しておきます。動作させながら,読みと りをして下さい。 例 j19-01 xSmpColor.java ソース http://www.yscon.co.jp/j/java/jmaga/j19/xSmpColor.java 動作  http://www.yscon.co.jp/j/java/jmaga/j19/xSmpColor.htm import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; public class xSmpColor extends Applet{ Color xc1 = new Color(255,0,0); // ←注目 生成方法 赤 100% Color xc2, xc3, xc4, xc5; public void init(){ xc2 = new Color(0x00FF00); // ← 注目 生成方法 緑 100% xc3 = new Color(0.0f, 0.0f, 1.0f); // ← 注目 生成方法 青 100% xc4 = Color.orange; // ← 注目 new なし } public void paint(Graphics xg){ xg.setColor(xc1); xg.fillRect(0,0,100,20); xg.setColor(xc2); xg.fillRect(0,21,100,20); xg.setColor(xc3); xg.fillRect(0,42,100,20); xg.setColor(xc4); xg.fillRect(0,70,100,20); xc5 = xc3; // ← 注目 xc5 は,newなし xg.setColor(xc5); xg.fillRect(0,91,100,20); xg.setColor(new Color(100, 250, 200)); // ← 注目 直接法 xg.fillRect(0,112,100,20); } } ------------------------------------------------------------------------ ▼ 次号の予定  イベント処理と無名クラス  感想は,斎藤まで, suehiro@he.mirai.ne.jp  広告等のお問い合わせ: jmaga@yscon.co.jp ------------------------------------------------------------------------ ▼ 誤字・脱字等の修正,プログラムの修正など,以下の場所で確認できます。 過去の修正版等  http://www.yscon.co.jp/j/java/jmaga/ 登録・削除および広告の案内  http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ フが所有しますが,商用を含めて,再利用,改変,発表を制限しません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 広告募集 http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号のJマガは役立ったあるいは勉強になりましたか? 該当するものだけ残してください。 5: 大いに,YES 4: YES 3: 普通 2: NO 1: 大いに,NO その他