Deep Side of Java〜Java 言語再入門 第2回

最初の例






最初の例

Hello, world プログラム

public class Hello {
     public static void main( String [] args ) {
          System.out.println( "Hello, Java world" );
     }
}

が「Hello, world」プログラムである。Java ではクラスに属さない関数は作れないので、public なクラスの public なクラスメソッドとして void main( String [] arg ) の名前の関数を作る。この時、ファイル名とそれに含まれる内容とに関係のないCや C++ とは違って、Java では次の制限を設けている。

ゆえに上記プログラムのファイル名は、「Hello.java」でなくてはならない。

この時、「クラスメソッド」とは、static で修飾されるメソッドのことである。クラスメソッドとは、インスタンスを作成することなしに利用できるメソッドであり、最初に実行されるべき main 関数は、当然そういうクラスメソッドでなくてはならない。

main 関数の引数は、文字列の配列である。配列表記はC言語などと宣言が逆転するのに注意。

System.out.println(); は、Java の環境であらかじめ用意されたクラスである、java.lang.System クラスの、out というクラス変数(static PrintStream out、標準出力を表す)が持つ、java.io.PrintStream クラスのメソッドである println メソッドを呼び出す。void println( String s); メソッドは、文字列引数をその PrintStream(この場合は out == 標準出力) に出力し、改行を付加するものである。

コンパイル&実行の仕方

コンパイルの方法は、次の通り。

% javac -deprecation Hello.java

-deprecation オプションは、そのJDKのバージョンで、廃止(予定)になっているなどする非推奨クラスを検出し、警告を出す。デフォルトでコンパイルオプションとすべきである。

この時、環境変数 CLASSPATH が、少なくとも次のようになっていなくてはならない。

% echo $CLASSPATH
.:/usr/local/share/j2sdk1.4.0_01/lib/tools.jar

つまり、CLASSPATH環境変数には、カレントディレクトリと、Java の実行環境が利用するクラスなどが圧縮されてライブラリとなっている tools.jar が含まれていなくてはならない。もし、非標準のライブラリを利用するのならば、やはりこの CLASSPATH 環境変数にそのライブラリを追加する。

ライブラリは .jar という拡張子がついている。これは tar に似た Java ツールである jar によって作成する圧縮ライブラリである。

また、javac は依存関係にある別クラスに関して、必要に応じてコンパイルを行う。だから複数のクラスに分割しても、基本的には「% javac メインクラス.java」 だけですべてのコンパイルが完了する。ただし、動的ローディングをする時はクラス名が参照されないので、再帰的にコンパイルをしない。make などを併用する必要がある。

実行はインタプリタを起動して行う。

% java Hello
Hello, Java world

この時、Hello.class ではなく、クラス名を指定することに注意。これは環境変数 CLASSPATH にある圧縮ライブラリ内のクラスでも起動できるためである。つまり、コンパイルされたままの .class ファイルと、それらを tar に似たインターフェイスで圧縮する「jar」によって圧縮したライブラリである .jar ファイルとを、呼び出し上区別せずに(言い換えれば、圧縮ファイル自体は指定せずに)扱うことができるのである。

また、ディレクトリ構造と、「パッケージ名」は連動している。つまり、

% ls subdir
Hello.class
% java subdir/Hello ←エラー

のようには呼び出せない。「パッケージ」とは、ディレクトリ単位で複数のクラスをまとめる機能であり、クラス構造を階層化することができる。これは「package 宣言文」によって指定をする。

% ls javaTest
Hello.class  Hello.java 
% cat javaTest/Hello.java
package javaTest;  /* ←追加 */

public class Hello {
---- 以下同じ
% java javaTest.Hello
Hello, Java world

のようになる。つまり、大きくライブラリをまとめる package 宣言の機能と、ディレクトリ構造とは連動し、その呼び出しにはパッケージ名を含んだクラス名を使うのである。つまり、java.lang.System であるとか、java.io.PrintStream などのクラス名は、このようなパッケージ構造によって定義されている。だから、ソースファイルを展開すると、そのようなディレクトリ構造になっていることを確認できる。

また、ライブラリとして公開するための「公開パッケージ宣言」は、すべての環境でユニークであるように、ドメイン名を逆転させたものを利用して指定する、という規約がある。製品コードなどではこれを考慮すべきであろう。

package JP.co.cmknet.newApp;

public class .... 



copyright by K.Sugiura, 1996-2006