┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  合格☆Java(無料)                 ┃ ┃&&&&&&******%%%%%%  http://www.yscon.co.jp/j/mag          ┃ ┃'&┃&''*┃*''%┃%'             (C)2006 斎藤末広    ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第3号 2006/05/15  JDK 1.5 環境設定,拡張 for 文,Generics(ジェネリックス) ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 目次 ▼ JDK 1.5 時代へ ▼ JDK 1.5(Java2 5.0) をインストールしよう ▼ 要素繰り返し for 文 ▼ Generics(ジェネリックス)とは ▼ Generics(ジェネリックス)のメリット ========================================================================= ▼ JDK 1.5 時代へ  情報処理技術者試験センターより,次の秋から,基本情報技術者試験の Java は JDK 1.5(別名 Java2 5.0) 対応になることが発表されました。 以下のように発表されました。 http://www.jitec.jp/1_00topic/topic_20060417_java.html ┏------------------------------------------------------------┓ Java 言語仕様の変更のお知らせ The Java Language Specification, Third Edition(JLS 3.0) http://java.sun.com/docs/books/jls/index.html (英文))  なお、JLS 3.0で追加された機能については、主に次の機能を問題中 で使用します。ただし、これらの3機能に限定するものではありません。 ・Generics(総称) ・拡張されたfor文 ・enum(列挙)型  また、メタデータは範囲外とします。 (一部省略) ┗------------------------------------------------------------┛  JLS 3.0 というのは,『Java言語仕様 第3版』(日本版未発売)のことで,言語 のバージョンは,JDK 1.5 (別名 Java2 5.0 と言われます) です。試験センター の上のお知しらでは, ・Generics(総称) ・拡張されたfor文 ・enum(列挙)型 をあげていますが,JDK 1.5 には,他にもいくつか,特徴があります。  JDK 1.5 の主な機能アップは,以下の8つです。(他にもあります)  1 要素繰り返しfor文(拡張されたfor文)  2 Generics(ジェネリックス,総称)  3 列挙型  4 printfメソッド  5 可変長パラメータ  6 static インポート  7 Auto-Boxing  8 メタデータ(アノテーション)  「メタデータは範囲外とします」とされていますので,上記の 1 から 7 まで が,試験問題に関係すると思われます。「合格☆Java」では,試験センターが, あげた,Generics,拡張されたfor文,enum型の説明に加えて,4 から 7 までの 項目を順に解説してきます。他にも,JDK 1.5 で,機能アップされたところがあ りますが,試験にはほとんど関係ない部分と思われます。  しばらく「合格☆Java」では,JDK 1.5 の新機能の説明です。  この号では,要素繰り返しfor 文と Generics(ジェネリックス)を扱います。 ========================================================================= ▼ Java2 5.0 をインストールしよう  まず,JDK 1.5 をパソコンにインストールしましょう。  2006/5/15現在の最新版は,JDK 1.5 update 6 です。JDK 1.5 の最新版を サンマイクロシステムズ社のサイトよりダウンロードして下さい。サイズは, 50 Mバイトを超えてますので,ADSL や光で接続していない方は,雑誌の付録等を 利用して下さい。  ダウンロードサイトは,日本語でJava@末広ページからリンクしてあります。  http://www.yscon.co.jp/j/java/index.htm  次,はい,等で答えていけばインストールできます。10分程度はかかます。  普通にダウンロード&インストールすると,コンパイラと実行環境は,  C:\Program Files\Java\jdk1.5.0_06\bin  にインストールされます。  次に,Java のプログラムを作成する作業用のフォルダを用意して下さい。 c:\jwork フォルダーを作ったという前提で以下を説明します。  次に,jstart.bat を次のように作ってください。ここでは,あなたの Java プログラムの作業フォルダを,c:\jwork に作ってあるとしてあります。自分で 他のフォルダーを作成した人は,自分用に以下を読みかえて下さい。  雑誌等の付録CD から,JDK 1.5 をインストールすると,  C:\Program Files\Java\jdk1.5.0_06\bin -------------  の,下線部のところが違ってきます。C:\Program Files\Java フォルダを自分 で開いて確認し, jstart.bat の path "C:\Program Files\Java\jdk1.5.0_06\bin";%path% を正しく修正して下さい。 ダウンロードサイトから,最新版(JDK 1.5 update 6)をインストールした場合, ○WinXP,NTの場合 jstart.bat rem Javaの開発作業を行う。 path "C:\Program Files\Java\jdk1.5.0_06\bin";%path% set CLASSPATH= subst j: /D subst j: c:\jwork j: cmd ○Win95の場合 jstart.bat の中身 rem Javaの開発作業を行う。 path "C:\Program Files\Java\jdk1.5.0_06\bin";%path% subst j: /D subst j: c:\jwork doskey j: command です。 この jstart.bat をダブルクリックで実行すると,DOS画面が開いて,Java の コンパイル&実行環境が設定去れ,c:\jwork フォルダが, j:\ になります。 最初に動作させるとき,上のバッチファイルの subst j: /D のところで, 「無効なパラメータです - J:」と出ますが,無視をして下さい。 jstart.bat を実行すると,いろいろ表示されて,最後は, DOSプロンプト画面 ┏------------------------------------------------------------┓ J:\> ┗------------------------------------------------------------┛ が出ます。ここで, DOSプロンプト画面 ┏------------------------------------------------------------┓ J:\>javac ┗------------------------------------------------------------┛ で,Enterキーを押すと,コンパイラのメッセージが出ます。そうし ら成功です。 DOSプロンプト画面 ┏------------------------------------------------------------┓ J:\>javac 'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 ┗------------------------------------------------------------┛ と出たら,設定が失敗しています。 jstart.bat の path "C:\Program Files\Java\jdk1.5.0_06\bin";%path% ------------------ の部分を訂正して下さい。 ここで,いつもの,xHello.java プログラムをコンパイルし,実行してみて ください。順調に出来ましたか? http://www.yscon.co.jp/j/java/jmaga/jsmp/gj003/xHello.java 1: /* 2: Java 基本プログラム "Hello"を表示 3: */ 4: public class xHello { 5: public static void main(String[] xargs){ 6: System.out.println("Hello"); 7: } 8: } ------------------------------------------------------------------------ ▼ 要素繰り返しfor文 (拡張されたfor文)  for 文に,新しい書式,要素繰り返し型 for 文(注意1)が追加になりました。 サンプルを見て下さい。 http://www.yscon.co.jp/j/java/jmaga/jsmp/gj003/xJ5For.java 1: /* 2: jdk 1.5 for サンプル 3: */ 4: public class xJ5For { 5: public static void main(String[] xargs){ 6: 7: String[] xstrArray ={"おはよう", "こんにちは", "こんばんは"}; 8: 9: // 要素繰り返し for 文 (拡張されたfor文) 10: for(String xs: xstrArray){ 11: System.out.println(xs); 12: } 13: 14: //従来からの for 文 15: for(int i = 0; i < xstrArray.length; i++){ 16: System.out.println(xstrArray[i]); 17: } 18: } 19: }  要素繰り返し for 文は,繰り返しを制御する変数(例では,i)を書く必要が ありません。要素を全て処理する場合,記述を簡単に書くことができます。 注意1:  "要素繰り返しfor文"という用語は,私が作りました。一般的には, "拡張されたfor文"といわれてます。 ------------------------------------------------------------------------ ▼ Generics(ジェネリックス)とは  ジェネリックス(generics)という言葉を,ジェネリックス医薬品という言葉で 聞いたことがあるのではないでしょうか?  ジェネリックスとは,"一般的・総称的"という意味です。反対語は,スペシ フィック(specific,明示的な,具体的な,明確な)です。  ジェネリックス医薬品とは,著名で高価な医薬品の変わりに,同じ効能で, 廉価な医薬品をさします。薬の名前にこだわらないということで,ジェネリック 医薬品といわれます。  Java の Generics(ジェネリックス) は,クラス定義の中に登場する型を,曖昧に しておき,そのクラスのインスタンス生成時に明確にするというものです。  曖昧=総称的(ジェリックス)で書いておくということで,ジェネリックスです。 ------------------------------------------------------------------------ ▼ Generics(ジェネリックス)の簡単な例  従来は,型が曖昧なものを扱う時は,Objectクラス型を利用しました。以下の 例は,N3Boxクラス定義で,Generics を利用せずに,Objectクラス型を利用して ます。配列 xn3Box の配列の要素は Object 型になっており,文字列,Date型の インスタンスを保存することができます。コンストラクターの引数の型も, Object型になっています。 http://www.yscon.co.jp/j/java/jmaga/jsmp/gj003/xGen00.java 1: /* 2: jdk 1.5 Generics サンプル Generics 未使用 3: */ 4: import java.util.Date; 5: 6: class xN3Box { 7: private Object[] xn3Box = new Object[3]; 8: 9: public xN3Box(Object x, Object y, Object z){ 10: xn3Box[0] = x; 11: xn3Box[1] = y; 12: xn3Box[2] = z; 13: } 14: 15: public Object getItem(int i){ 16: return xn3Box[i]; 17: } 18: } 19: 20: public class xGen00 { 21: public static void main(String[] xargs){ 22: 23: xN3Box xn3Box 24: = new xN3Box("おはよう", new Date(), "こんばんは"); 25: 26: for(int i = 0; i < 3; i++){ 27: System.out.println(xn3Box.getItem(i)); 28: } 29: } 30: } ここで, 23: xN3Box xn3Box 24: = new xN3Box("おはよう", new Date(), "こんばんは");  xn3Box では,オブジェクト型で3つの要素を保存できます。文字列と 日付型インスタンスを保存しました。  ジェネリックスを利用した例を上げます。コンパイルとすると ┏------------------------------------------------------------┓ 注: xGen01.java の操作は、未チェックまたは安全ではありません。 注: 詳細については、-Xlint:unchecked オプションを指定して再コン パイルしてください。 エラー 1 個 ┗------------------------------------------------------------┛ と警告メッセージが出ますが無視をしてください。このエラーは,ジェネリックス とは無関係です。 http://www.yscon.co.jp/j/java/jmaga/jsmp/gj003/xGen01.java 1: /* 2: jdk 1.5 Generics サンプル Generics 使用 3: */ 4: import java.util.Date; 5: 6: class xN3Box { 7: 8: // private xT[] xn3Box = new xT[]; はできない。型変数の配列は不可 9: private Object[] xn3Obj = new Object[3]; 10: 11: public xN3Box(xT x, xT y, xT z){ 12: xn3Obj[0] = (Object)x; 13: xn3Obj[1] = (Object)y; 14: xn3Obj[2] = (Object)z; 15: } 16: 17: public xT getItem(int i){ 18: return (xT)xn3Obj[i]; 19: } 20: } 21: 22: public class xGen01 { 23: public static void main(String[] xargs){ 24: 25: xN3Box xn3Box 26: = new xN3Box("おはよう", "こんにちは", "こんばんは"); 27: 28: for(int i = 0; i < 3; i++){ 29: System.out.println(xn3Box.getItem(i)); 30: } 31: } 32: } ここで,ジェネリックスを使っていない例と使った例を比較しながら説明します。 上が使っていない例,下が使った例です。 (ジェリックスを使用しない例) 6: class xN3Box { (ジェリックスを使用した例) 6: class xN3Box {  ジェネリックスを使った例では,xN3Boxクラス定義内で使う型を,xT と呼ぶと 宣言してます。この xT を型変数といいます。通常は,T を利用します。「合格☆ Java」では,自由に名前が付けれるものは,x 付きで書くという約束で,xT です。 コンストラクター部分 (ジェリックスを使用しない例) 9: public xN3Box(Object x, Object y, Object z){ 10: xn3Box[0] = x; 11: xn3Box[1] = y; 12: xn3Box[2] = z; 13: } (ジェリックスを使用した例) 11: public xN3Box(xT x, xT y, xT z){ 12: xn3Obj[0] = (Object)x; 13: xn3Obj[1] = (Object)y; 14: xn3Obj[2] = (Object)z; 15: }  引数の型の注目して下さい。ジェネリックスを利用していない場合は,Object 型としてます。ジェネリックスを利用した方は,型変数の xT としてます。  代入される内部配列 xn3Obj は,ともにオブジェクト型の配列です。ジェネリッ クを利用した配列はできませんので,配列はオブジェクト型配列のままです。 よって, 12: xn3Obj[0] = (Object)x; のように,代入するときに,Object型に変換しています。  この xN3Box クラスを利用する側では (ジェリックスを使用しない例) 23: xN3Box xn3Box 24: = new xN3Box("おはよう", new Date(), "こんばんは"); (ジェリックスを使用した例) 25: xN3Box xn3Box 26: = new xN3Box("おはよう", "こんにちは", "こんばんは"); ジェネリックスを利用していない方は,従来からの書き方です。ジェネリックスを 利用した方は,型定義で利用した,xT の型を,String 型であると,ここで, 定義してます。この定義により, 11: public xN3Box(xT x, xT y, xT z){ 12: xn3Obj[0] = (Object)x; 13: xn3Obj[1] = (Object)y; 14: xn3Obj[2] = (Object)z; 15: } が,実行時に, public xN3Box(String x, String y, String z){ xn3Obj[0] = (Object)x; xn3Obj[1] = (Object)y; xn3Obj[2] = (Object)z; } と同等となります。 これにより,ジェネリックスを使った例では xN3Box xn3Box = new xN3Box("おはよう", new Date(), "こんばんは"); とすることはできません。もし,このようにすると,コンパイルエラーで ┏------------------------------------------------------------┓ xGen01.java:26: シンボルを見つけられません。 シンボル: コンストラクタ xN3Box(java.lang.String,java.util.Date,java.lang .String) ┗------------------------------------------------------------┛ が出ます。この場合は,(文字列,Date,文字列)のコンストラクターはないという エラーメッセージが出ています。つまり,(文字列,文字列,文字列)しかコンパイル を通さないということになります ------------------------------------------------------------------------ ▼ Generics(ジェネリックス)のメリット  ジェネリックスを利用せず,Object型を利用して,クラスを定義することが できます。しかし,ジェネリックスを利用すると,代入できる型のチェックが 厳しくなり,コンパイル時にチェックされます。これが,ジェリックスのメリット です。  上の例では,Generics を利用して,コンストラクタのチェックを厳しくしま した。 ------------------------------------------------------------------------ ▼ この号で勉強したこと  この号では,  1 JDK 1.5 の環境設定  2 拡張For文  3 Generics(ジェネリックス) を勉強しました。  次号も,引き続き,JDK 1.5 の新機能を説明していきます。 ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開している,プログラムソースは,著作権を当方スタッ フが所有しますが,プログラムソースの利用は,原則,商用を含めて,再利用, 改変,発表を制限しません。どんどんご利用下さい。  質問コーナのプログラムソースは,著作権に問題がある場合があるかもしれま せん。原則を適用しません。再利用の許可をしません。  画像や音などの素材は,それぞれ著作権があります。著作者に承諾なしに再利 用はできません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。お問い合わせ下さい。 ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号の意見をお待ちしています。ぜひ,ご返信下さい。 この号の内容 1 良かった 2 普通 3 良くなかった コメント,リクエスト,質問もお待ちしています。遠慮せずにどうぞ。