広告

■□■□■□■□■□■□■□■□■□■□■□■□■□■□■
                      2011年12月27日

   Java総合講座 - 初心者から達人へのパスポート
                 2009年11月開講コース 053号

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■


-------------------------------------------------------
・現在、このメールマガジンは以下の2部構成になっています。
[1] 当初からのコース:vol.xxx(xxxは番号)が振られています。
   これは現在、中級レベルになっています。
[2] 2009年11月開講コース:xxx号(xxxは番号)が振られています。
   これは現在、初心者向けのレベルになっています。
・このメールマガジンは、画面を最大化して見てください。
小さな画面で見ていると、不適切な位置で行が切れてしまう
など、問題を起すことがあります。
・このメールマガジンに掲載されているソース・コード及び
文章は特に断らない限り、すべて筆者が著作権を所有してい
ます。また、これらのソース・コードは学習用のためだけに
提供しているものです。
-------------------------------------------------------


========================================================
◆ 01.アプリケーションの起動とJARファイル
========================================================

これまでJavaのアプリケーションを起動するときにはEclipse
から起動していましたが、Eclipseを使わずに直接起動するには
どうしたらよいでしょうか。

一番基本的なやり方としては、002号のように、コマンド・
プロンプトを開いてコマンドを実行して起動するという方法が
あります。

簡単な例として、以前作成したCalendarConverterWindowを使っ
て説明しましょう。

まずCalendarConverterWindowはJStudy1というプロジェクトの中
のjp.co.flsi.lecture.uiというパッケージの中に入れていました。
この場合、Eclipseでは、ワークスペースのフォルダー(我々の
場合はJavaWorksというフォルダー名でワークスペースを作成して
いた)の中にJStudy1というフォルダーが作られています。これが
プロジェクトのフォルダーです。

そして、このフォルダーの中にはソース・ファイルを入れるための
srcというフォルダーと、バイナリー・ファイルを入れるための
binというフォルダーが入っています。
つまり、コンパイルされる前のファイルはsrcフォルダーに入って
いますが、コンパイルされた後の実行可能なファイルはbinフォル
ダーに入っていますので、Javaのアプリケーションを起動する(実
行する)ためにはbinフォルダーのほうを使うことになります。
(なお、srcフォルダーやbinフォルダーの使用は、Eclipseの設定で
変更できますので、場合によってはsrcフォルダーやbinフォルダーを
使用しないこともできるし、フォルダーの名称を変えることもでき
ます。)

そして(JStudy1フォルダーの中の)このbinフォルダーの中には
さらにjpフォルダー、さらにその中にはcoフォルダー、さらに
その中にはflsiフォルダー、さらにその中にはlectureフォルダー、
さらにその中にuiというフォルダーが作られています。

これがjp.co.flsi.lecture.uiというパッケージの実体です。
つまり、Javaのパッケージというのは、コンピューターの内部で
は階層構造のフォルダー(ディレクトリーとも呼ぶ)によって表現
されるのです。

この場合、CalendarConverterWindowを実行するためには

(1) コマンドプロンプトを開く。

(2) 次のコマンドを実行する。
cd  C:\JavaWorks\JStudy1\bin

(このcdというコマンドは、作業を行うフォルダー(ディレクトリー)を
変更するためのコマンドですが、この作業の対象となるディレクトリーを
カレント・ディレクトリー(current directory =現在のディレクトリー
という意味)と呼びます。ちなみにcdというコマンドはchange directory
という言葉を略したものです。)

(3) 次のコマンドを実行する。
java  jp.co.flsi.lecture.ui.CalendarConverterWindow

という操作をします。


でも、CalendarConverterWindowを実行するために毎回毎回この操作
をするのは面倒だし、あまり格好よくないですね。


そこで、もっと簡単に起動できるようにするために、スクリプト・
ファイルを使用する方法を紹介します。

スクリプト・ファイルというのはコンパイルなどしなくてもOS(もしく
はOSを補助するソフト)が直接読み取って実行できるようなプログラム
を意味し、スクリプト言語と呼ばれる言語で書かれたソース・コードを
入れておくものです。

スクリプト言語は、Javaのような高度な技術は駆使できないけれど簡単
なプログラムは作れるという、いわゆる簡易言語です。

では、(ワードパッドなどで)CalendarConv.jsというファイル名のファ
イルを作成し、次のソース・コードを書き込みましょう。

--------------------------------------------------------
var WshShell = WScript.CreateObject ("WScript.Shell");
WshShell.CurrentDirectory = "C:\\JavaWorks\\JStudy1\\bin";
WshShell.Exec("javaw jp.co.flsi.lecture.ui.CalendarConverterWindow");
--------------------------------------------------------

ここで、「.js」という拡張子はJScriptというスクリプト言語で書かれた
スクリプト・ファイルであることをOSに知らせるためのものです。
この拡張子は変更してはいけません。
一方、「CalendarConv」というファイル名は適当につけた名前ですから、
他の名前でもかまいません。
(「\」の一文字はエスケープ・シーケンス(016号参照)を表すための
記号なので、文字列のリテラルの中で普通の\という文字を表すためには
使用できません。普通の文字としての\を表したいときは、代わりに「\\」
を使う必要があります。上のソース・コードの中で「\\」と書かれている
のは、そのためです。)

このソース・コードのうち、1行目はシェル・プログラム(コマンドプロ
ンプトを動かすプログラム)を取り出してWshShellという変数に保存し、
以下の行でその変数を通してシェル・プログラムに命令をしています。

2行目ではカレント・ディレクトリーを「C:\JavaWorks\JStudy1\bin」に
変更しています。これは、つまり、上の(2)と同じことをしているのです。

3行目では「javaw jp.co.flsi.lecture.ui.CalendarConverterWindow」を
実行しています。これは、つまり、上の(3)と同じことをしているのです。
ただし、JVMを起動するときに「java」ではなく「javaw」というコマンド
を使っています。どちらもJVMを起動しますが、javaではコマンドプロン
プトを開いてしまうのに対して、javawではコマンドプロンプトを開かない
ので、(コマンドプロンプトを開くと見苦しいので)javawを使っています。

このCalendarConv.jsはどこに保管してもいいですので、わかりやすいフォ
ルダー(マイドキュメントでもよい)に保管しておいたり、スタート・
メニューにショートカットを組み込んだりしておくと便利でしょう。

保管したら、CalendarConv.jsのアイコンをダブル・クリックして起動して
みてください。
ちゃんとアプリケーションが起動しますね。

JScriptはJavaとは関係のない別の言語ですが、Javaを知っている人には
容易に理解できる言語(JavaScriptをベースにして、Windowsのコマンドを
使えるようにした言語)です。
なお、当メールマガジンではJScript自体の説明はしませんので、もっと
詳しく知りたい人は

http://www.microsoft.com/japan/msdn/scripting/

などを参照してください。


では次に、HumanResourceJFrameを起動してみましょう。
さっきのCalendarConverterWindowと同じようにして起動しようとして、
コマンドプロンプトで(カレント・ディレクトリーは先ほどと同じ
\JavaWorks\JStudy1\binにしておいて)

java  jp.co.flsi.lecture.ui.HumanResourceJFrame

というコマンドを打ち込んでもエラーになってしまいますね。(もちろん
事前にH2 Database Engineは起動済みにしておいた上での話です。それで
もH2がらみのエラーが出ます。)
これは、このアプリケーションが使用しているorg.h2.Driverというクラス
が見つからないためにエラーになります。(org.h2.Driverが何だったか
忘れた人は022号あたりを復習して下さい。)

アプリケーションが使用するクラスは、以前(022号で)お話したクラス・
ローダーと呼ばれるソフトによってメモリー上にロードされますが、このと
き、クラスを探す場所を登録してあるものがクラスパス(CLASSPATH)です。
クラスパスが明示されていない場合は、カレント・ディレクトリーがクラス
を探す場所になりますが、使用するクラスがそれ以外の場所に存在する場合
には、クラスの所在場所をクラスパスに明示的に指定しておかなければなり
ません。
org.h2.Driverは、(標準的なインストールでは「C:\Program Files\H2\bin」
フォルダーの中にはいっている)h2-1.2.132.jar(この1.2.132の部分はバー
ジョン番号で、インストールされた時点によって異なる可能性がある)という
ファイルの中にはいっているので、このファイルをクラスパスに指定しましょ
う。(この拡張子が「.jar」のファイルをJARファイルと呼ぶが、JARファイル
の詳細については後述する。)
javaやjavawコマンドでは、クラスパスは「-cp」または「-classpath」(コマ
ンド行オプション)を使って「-cp 場所;場所;場所;場所」というふうに指定
できますので、さっきのコマンドは、

java  -cp .;"C:\Program Files\H2\bin\h2-1.2.132.jar" jp.co.flsi.lecture.ui.HumanResourceJFrame

というふうに修正すればいいのです。
(このように「-cp」の後ろにブランク(スペース)をあけてから必要なクラ
スが存在するディレクトリー(フォルダー)やJARファイルを指定しますが、
複数あるときはセミコロン(;)で区切ります。)
カレント・ディレクトリーはピリオド(.)で表しますので、上の例では、ク
ラスパスの先頭に「.」を指定しています。(実行したいjp.co.flsi.lecture.ui.HumanResourceJFrame
がカレント・ディレクトリーにあることを想定しています。)
なお、「C:\Program Files\H2\bin\h2-1.2.132.jar」を2つの"で囲んでいるのは、間に
ブランクがあるからです。ブランクのない連続した文字列になっていれば"で
囲む必要はありません。


同様に、スクリプト・ファイルを作るときは、そのソース・コードは

--------------------------------------------------------
var WshShell = WScript.CreateObject ("WScript.Shell");
WshShell.CurrentDirectory = "C:\\JavaWorks\\JStudy1\\bin";
WshShell.Exec("javaw  -cp .;\"C:\\Program Files\\H2\\bin\\h2-1.2.132.jar\" jp.co.flsi.lecture.ui.HumanResourceJFrame");
--------------------------------------------------------

のようにすればいいのです。とりあえず、これをhr.jsというファイル名で
作成してみてください。
hr.jsを保管しましたら、そのアイコンをダブル・クリックして起動してみ
てください。
ちゃんと、HumanResourceJFrameのアプリケーションが起動しますね。
(上のソース・コードの中で「\"」と書かれているのは、"の一文字を表わ
すエスケープ・シーケンスです。2つの"で囲まれている文字列のリテラルの
中で"を表すためにエスケープ・シーケンスを使っています。)


なお、クラスパスは環境変数のCLASSPATHでも指定できますが、環境変数の
場合にはすべてのアプリケーションに影響してしまうため、上記の「-cp」
または「-classpath」を使用するほうが推奨されています。

クラスパスについてもっと詳細を知りたい人は、

http://java.sun.com/javase/ja/6/docs/ja/technotes/tools/windows/classpath.html

などを読んでみてください。


ところで、これらのアプリケーションを他のコンピューターなどにコピーし
て使いたいときには、関連するクラスをすべてパッケージのフォルダーごと
いっしょにコピーしなければなりません。HumanResourceJFrameなどになると、
パッケージがたくさんありますから、面倒な作業になります。

こういう面倒くささを解消するために便利なのが、JARファイルです。

JARは、ZIP(アーカイブ・ユーティリティーの一つ)の技術を使って作られて
おり、複数のファイルを一つにまとめて圧縮することができます。
したがって、コピーしたりインターネットからダウンロードしたりするのも楽
になります。

また、JARファイルをダブル・クリックするだけでアプリケーションを起動で
きるようにすることもでき、起動を容易にするためにも役立ちます。

JARファイルはjarツールと呼ばれるユーティリティーを使って作成することが
できます。
JARはJava Archiveの略で、このツールはUnixなどで使われているTAR
(Tape Archiveの略)というユーティリティーに類似したコマンド形式を持っ
ています。したがって、Unixを使い慣れている人はjarツールも容易に使いこな
せます。


当メールマガジンではjarツールは使わずに、Eclipseを使って簡単にJARファ
イルを作成する方法を説明します。

まずは、CalendarConverterWindowを起動するためにJARファイルを作りましょう。

では、Eclipseを起動してください。

(1) パッケージ・エクスプローラーの中のJStudy1を右クリックし、
「エクスポート」を選択します。

(2) 「エクスポート」ウインドウの中で、「Java」の中の「JARファイル」を
選択(クリック)し、「次へ」ボタンをクリックします。

(3) 「JARエクスポート」ウインドウの中で「JStudy1」の配下を展開し、その
配下の「src」の配下の「jp.co.flsi.lecture.ui」と「jp.co.flsi.lecture.util」
にはチェック・マークがついたままにし、他のパッケージのチェック・マークは
はずします。
(jp.co.flsi.lecture.uiにはCalendarConverterWindowがはいっており、
jp.co.flsi.lecture.utilにはCalendarConverterWindowが使用している
CalendarConverterがはいっているのでチェック・マークをつけたままにする
のです。他のパッケージは必要ないのでチェック・マークをはずします。
もっと細かくクラスごとにチェック・マークをつけたりはずしたりもできます。)

(4) 「生成されたクラス・ファイルとリソースをエクスポート」と「JARファイ
ルの内容を圧縮」にチェック・マークを入れます。そして「JARファイル」の
右側の「参照」ボタンをクリックし、JARファイルを書き出すフォルダーとファ
イル名を指定します。ここでは、フォルダーはJavaWorksを指定し、ファイル名
はcalenconv.jarにすることにしましょう。
そして、「次へ」ボタンをクリックします。

(5) 次のページはデフォルト(そのまま)のままにして、「次へ」ボタンをク
リックしましょう。

(6) マニフェストとシールについてはデフォルトのままにしておいてください。
(デフォルトではEclipseがマニフェストを自動で生成し、シールはしません。
マニフェストやシールが何であるかは後で説明します。)
「メイン・クラス」の右側の「参照」ボタンをクリックし、「CalendarConverterWindow」
を選択して「OK」ボタンをクリックします。(これを行っておくと、作成され
たJARファイルをダブル・クリックするとCalendarConverterWindowが起動する
ようになります。)

(7) 「完了」ボタンをクリックします。

(8) 「JARエクスポートが警告とともに完了しました。」のメッセージが出て
も無視して「OK」ボタンをクリックしてください。
これは、これまでに警告を残しておいたために出ます。これらの警告は予め
潰しておいたほうがすっきりしていいのですが、ほうっておいても問題はあ
りません。


これで、JavaWorksフォルダーにcalenconv.jarというJARファイルができてい
ますので、そのアイコンをダブル・クリックして実行してみてください。
CalendarConverterWindowが起動しますね。

┌注意─────────────────────────┐
パソコンによっては.jarという拡張子がJavaとは別のアプリケー
ションに紐付けされていることがありますが、その場合はダブル・
クリックしてもCalendarConverterWindowは起動せず、別のアプリ
ケーションが起動してしまいます。
その場合はあきらめる(後でスクリプト・ファイルの作り方を説明
するのでそれを使う)か、あるいはWindows XPであれば、calenconv.jar
を右クリックし、「Java(TM)2 Platform Standard Edition Binary」
を選択すれば起動できます。
└───────────────────────────┘


ところが、HumanResourceJFrameのほうは、こうはいきません。
「C:\Program Files\H2\bin\h2-1.2.132.jar」をクラスパスに指定しておかなければ
ならないので、単純にJARファイルをダブル・クリックして起動するという
わけにはいかないのです。
この場合はスクリプト・ファイルを用意してコマンド行オプションでクラス
パスを指定しましょう。(なお、クラスパスはJARファイルの中に(マニフェ
ストに)指定することもできるのですが、ここでは説明しません。)

では、やってみましょう。

(1) パッケージ・エクスプローラーの中のJStudy1を右クリックし、
「エクスポート」を選択します。

(2) 「エクスポート」ウインドウの中で、「Java」の中の「JARファイル」
を選択(クリック)し、「次へ」ボタンをクリックします。

(3) 「JStudy1」の配下をリストさせ、全パッケージにチェック・マークが
ついていることを確認します。

(4) 「生成されたクラス・ファイルとリソースをエクスポート」と「JARファ
イルの内容を圧縮」にチェック・マークを入れます。そして「JARファイル」
の右側の「参照」ボタンをクリックし、JARファイルを書き出すフォルダーと
ファイル名を指定します。ここでは、フォルダーはJavaWorksを指定し、ファ
イル名はhrjframe.jarにすることにしましょう。
そして、「次へ」ボタンをクリックします。

(5) 次のページはデフォルト(そのまま)のままにして、「次へ」ボタンを
クリックしましょう。

(6) 次のページもデフォルトのままにして、「完了」ボタンをクリックしま
しょう。
(スクリプト・ファイルで起動しますので、「メイン・クラス」の設定も不要
です。)

(7) 「JARエクスポートが警告とともに終了しました。」のメッセージが出て
も無視して「OK」ボタンをクリックしてください。

これで、JavaWorksフォルダーにhrjframe.jarというJARファイルができてい
ますね。


では、次に下のような2行のソース・コードを含むスクリプト・ファイルを
作りましょう。

--------------------------------------------------------
var WshShell = WScript.CreateObject ("WScript.Shell");
WshShell.Exec("javaw -cp \"C:\\Program Files\\H2\\bin\\h2-1.2.132.jar\";C:\\JavaWorks\\hrjframe.jar jp.co.flsi.lecture.ui.HumanResourceJFrame");
--------------------------------------------------------
(カレント・ディレクトリーの指定がないことに注目してください。この
スクリプトでは、必要なクラスは、カレント・ディレクトリーではなく
JARファイルから取り出しますので、カレント・ディレクトリーの指定は
必要ありません。)

このファイルをhrjar.jsというファイル名で保管し、実行してみてくださ
い。(もちろん、その前にH2 Database Engineを起動しておくこと。)
HumanResourceJFrameがちゃんと起動しますね。


ついでに、同様に、CalendarConverterWindowのほうもJAR用のスクリプト・
ファイルを作ってみましょう。

--------------------------------------------------------
var WshShell = WScript.CreateObject ("WScript.Shell");
WshShell.Exec("javaw -cp C:\\JavaWorks\\calenconv.jar jp.co.flsi.lecture.ui.CalendarConverterWindow");
--------------------------------------------------------

ファイル名はCalendarCnJar.jsとでもしてみましょう。

あるいは、次のようなスクリプト・ファイルでも動かせます。

--------------------------------------------------------
var WshShell = WScript.CreateObject ("WScript.Shell");
WshShell.CurrentDirectory = "C:\\JavaWorks";
WshShell.Exec("javaw -jar calenconv.jar");
--------------------------------------------------------

ファイル名はCalendarCnJar2.jsとでもしてみましょう。

なお、上記の「-jar」というコマンド行オプションは、JARファイルに
含まれるプログラム(メイン・クラスとして指定したもの)を実行した
いときに指定します。

こういったjavaw(またはjava)のコマンド行オプションについて詳しく
知りたい人は、

http://java.sun.com/javase/ja/6/docs/ja/technotes/tools/windows/java.html

などを参照してください。



ところで、先ほどのマニフェストとシールについて簡単に説明しておき
ましょう。


まず、マニフェスト(manifest)の元々の意味は、航空機などで運搬す
る積荷の目録や乗客名簿のことですが、JARファイルにおいては、その中
に入れている物の目録を意味します。
JARファイルのマニフェストは一定のルールに従って自分で作成し、JARファ
イルの中に取り込んでおくことができますが、通常はEclipseが自動生成し
てくれるもので充分ですので、とくにルールを覚える必要はないでしょう。


シール(seal)とは、元々の意味は「封じること」ですが、JARファイル
におけるシールとは、そのJARファイルの中のパッケージの中で呼び出さ
れているクラスが、同じJARファイル内から取り出される(ロードされる)
べきであることを意味します。
と言ってもなんのことかよくわからないかも知れないので、具体的に説明
しましょう。

たとえば、先ほど作成したcalenconv.jarの場合は、CalendarConverterWindow
というクラスを起動していましたが、このクラスはjp.co.flsi.lecture.ui
というパッケージにはいっています。
ところが、CalendarConverterWindowはCalendarConverterというクラスを
呼び出して使っており、CalendarConverterはjp.co.flsi.lecture.utilと
いう別のパッケージにはいっています。
この場合、jp.co.flsi.lecture.uiというパッケージをシールしておくと、
CalendarConverterは同じJARファイル(calenconv.jar)の中にはいって
いるjp.co.flsi.lecture.utilから取り出される(ロードされる)べきもの
と判断されます。

こうしておくと、もし別のJARファイル(仮にxxx.jarとしておきます)にも
jp.co.flsi.lecture.utilパッケージが重複して存在していて、その中には
異なるバージョンのCalendarConverterがはいっており、かつxxx.jarもクラ
スパスに登録されていたとしても、このクラスはロードされることはなく、
あくまでcalenconv.jarのほうからロードされます。
つまりシールは、整合性を取るために正しいバージョンのクラスを取り出せ
るようにコントロールする目的で利用できる(というか、そういう目的で
使用するための)仕組みなのです。

なお、この場合、もしcalenconv.jarの中にCalendarConverterが見つから
ない場合はエラー(SecurityException)になります。

また、JARファイル全体をシールした場合は、その中にはいっているすべて
のパッケージを暗黙にシールしたことになります。

シールの情報はマニフェストの中に記述します。


JARファイルについてもっと詳しく知りたい人は、

http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/jar/index.html

などをご覧ください。



では、今回はここまで。


(続く)



========================================================
◆ 02.文法解説 [staticイニシャライザー]
========================================================

[staticイニシャライザー]

static {
   .
   .
   .
}

というふうにブロックにstaticを指定したものをstaticイニシャ
ライザー(static initializer)と呼び、クラスがロードされた
ときに自動的に実行されます。

以前にもお話したように、クラスが始めて呼び出されたときには、
クラス・ローダーというプログラムがクラスを(クラスパスに登録
されている場所から)探して来てメモリー上にロードします。
一度ロードされたクラスは再度呼び出されたときにはメモリー上の
ものがそのまま使われるだけであり、再度ロードされることはあり
ません。

つまり、staticイニシャライザーは、クラスが何度呼び出されたと
しても最初の1回だけしか実行されません。
したがって、クラスの初期設定のための使われるのが普通の使い方
です。

たとえば、

--------------------------------------------------------
public class Sheep {

   static private int number;

   public Sheep() {
      number++;
   }

   static {
      number = 10;
      System.out.println("はじめは" + number + "匹。");
   }

   public int getNumber() {
      return number;
   }

   public static void main(String[] args) {
      Sheep [] hitsujitachi = new Sheep[10];
      for (Sheep hitsuji : hitsujitachi) {
         hitsuji = new Sheep();
         System.out.println("ひつじが" + hitsuji.getNumber() + "匹。");
      }

      Sheep [] sheeptachi = new Sheep[10];
      for (Sheep sheep : sheeptachi) {
         sheep = new Sheep();
         System.out.println("ひつじが" + sheep.getNumber() + "匹。");
      }
   }

}
--------------------------------------------------------

というクラスを作って実行すると、最初に1回だけ

はじめは10匹。

という文字列が出力され、以後、

ひつじが11匹。
ひつじが12匹。
ひつじが13匹。
ひつじが14匹。
    .
    .
    .

という文字列の出力が数字を増やしながら繰り返されることになり
ます。

ところで、上のソース・コードの中の

static private int number;

という変数は、static指定されていますね。いわゆるstatic変数
(staticフィールド)です。
static変数はクラスに対して一つだけ与えられるもので(クラス変数
と呼ばれることもあり)、インスタンスごとに異なる値を設定すること
はできません。つまり、すべてのSheepインスタンスに共通の変数とし
て与えられるのです。
したがって、インスタンスを生成するたびにnumberの値を増やしていく
と、インスタンスの個数分増えることになります。

このようにstaticイニシャライザーでstatic変数の初期化を行うと便利
ですが、同時にstatic変数の宣言文でも初期化(たとえば

static private int number = 100;

というふうに)を行った場合、ソース・コード上の順番で初期化が行わ
れます(staticイニシャライザーのほうがstatic変数の宣言文での初期化
よりも前にきていれば、staticイニシャライザーでの初期化のほうが先に
実行される)ので、注意が必要です。詳しくは後の演習を実行して確認し
てください。

なおクラス・ローダーは、クラスをロードするとき、そのスーパークラス
がまだロードされていない場合はスーパークラスを先にロードします。し
たがって、クラスの前にスーパークラスのstaticイニシャライザーが実行
されますので、注意が必要です。


(続く)



================================================
◆ 03.演習問題
================================================

1.
上記のstaticイニシャライザーの振る舞いを確認するために、下記のよう
な2つのクラスを作り、Hitsujiのほうを実行してみてください。

--------------------------------------------------------
public class Sheep {

   static private int number = 100;

   public Sheep() {
      number++;
      System.out.println("ひつじが" + number + "匹。");
   }

   static {
      System.out.println("Sheepクラスをロードしました。");
      number = 0;
   }

}
--------------------------------------------------------


--------------------------------------------------------
public class Hitsuji {

   public static void main(String[] args) {
      System.out.println("[Example 1]");
      try {
         for (int i = 0; i < 10; i++) {
            Class.forName("Sheep").newInstance();
         }
      } catch (ClassNotFoundException e) {
         e.printStackTrace();
      } catch (InstantiationException e) {
         e.printStackTrace();
      } catch (IllegalAccessException e) {
         e.printStackTrace();
      }
   }

}
--------------------------------------------------------



2.
上のSheepクラスを下のように微修正してからHitsujiを実行して
みてください。
さっきと何がどう変わりますか?

--------------------------------------------------------
public class Sheep {

   public Sheep() {
      number++;
      System.out.println("ひつじが" + number + "匹。");
   }

   static {
      System.out.println("Sheepクラスをロードしました。");
      number = 0;
   }

   static private int number = 100;

}
--------------------------------------------------------


3.
下記のような3つのクラスを作り、HumanHistoryのほうを実行して
みてください。
期待通りの出力結果が出るか確認してください。

--------------------------------------------------------
class Primate {
   static { System.out.println("霊長類が出現しました。"); }
}
--------------------------------------------------------
class HomoSapiens extends Primate {
   static { System.out.println("ヒトが出現しました。"); }
}
--------------------------------------------------------
class HumanHistory {
   public static void main(String[] args) {
      HomoSapiens a;
      System.out.println("ヒトの誕生の始まり始まり。");
      a = new HomoSapiens();
   }
}
--------------------------------------------------------


(次回に続く。)



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2011 Future Lifestyle Inc. 不許無断複製