倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

翔泳社 SJC-P テキスト覚え書き : 第4章 Java 言語の基本 (Java アプリケーションの実行)

この章で学ぶこと

SUN教科書 Javaプログラマ(SJC-P) 5.0・6.0両対応(試験番号310-055、310-065)

SUN教科書 Javaプログラマ(SJC-P) 5.0・6.0両対応(試験番号310-055、310-065)

Java アプリケーションの編成


ファイルの種類と名前

  • コンパイラは、コンパイル時に .java ファイル内に他のクラスへの参照を発見すると classpath 環境変数に記載された場所で .class ファイルを検索する
  • インタープリタは、実行時に .class ファイル内に他のクラスへの参照を発見すると classpath 環境変数に記載された場所で .class ファイルを検索する

main() メソッド

  • java コマンドJava クラスを実行すると、JVM が指定したクラスをロードし、そのクラスの main() メソッドを呼び出す。
  • main() メソッドは public, static, void でなければならない
  • main() メソッドの引数は String の配列でなければならない。 これらの値は、アプリケーションの実行時にコマンドラインで指定できる
  • アプリケーションの実行時に数値などを指定しても、main() メソッドには String 型として渡される

可能な main() メソッドの宣言(例外を投げても良い):

public static void main(String[] args){}
public static void main(String... args){}

コンパイルが可能だが、実行時にエラーが出る宣言(Java アプリケーションの実行の起点と認識されない):

public void main(String[] args){}    // static でない
public static void main(String args){}    // 引数が String の配列でない
static void main(String[] args){}    // public でない

名前についてのまとめ

  • ソースファイル内に定義したクラスの1つが public として宣言されている場合、.java ファイルの名前はこの public クラスの名前に一致させる必要がある
  • 1つのソースファイルに、複数の public クラスは定義できない
  • コンパイラは、コンパイル対象のソースファイル内にある各クラスに対応した .class という拡張子のファイルを作成する
  • 生成される .class ファイルの名前は、対応するクラスの名前と一致する

パッケージ

  • パッケージに属するクラスファイルはすべて、パッケージ名と同じ名前のディレクトリに格納する
  • そのクラスが属するパッケージは package キーワードで指定する
  • パッケージの階層はドット (.) で区切る
  • 異なるパッケージに属するクラスは、完全修飾名「《パッケージ名》.《クラスの単体名》」で指定する
  • ソースファイルの先頭で import キーワードを用いて、異なるパッケージのクラスを単体名のみで使うことができる
  • ワイルドカード (*) を用いれば、指定したパッケージに属するクラスを全てインポートできる
  • Java ファイルでは、各文を次の順番で書く必要がある:
    1. package 文
    2. import 文
    3. クラス定義
  • static インポート・・・static 変数や static メソッドのインポート
  • static インポートは import static キーワードを用いる
  • static インポートでもワイルドカード (*) を使用できる(指定したクラスの全ての static メンバをインポートする)
  • static インポートは JDK 5 から可能

クラスパス

  • クラスパス・・・コンパイルやインタープリタが、クラスファイルを探す際の対象となるディレクトリや JAR ファイルの一覧を格納している環境変数
  • 何も指定していない場合は、デフォルトでカレントディレクトリ (.) が含まれている
  • 独自にクラスパスを設定すると、デフォルトのカレントディレクトリが失われる(必要な場合は自分で設定に加える必要がある*1

クラスパスの指定方法

  • 環境変数 classpath に値をセットする
  • java および javac コマンド使用時にオプションで指定する。
    • オプションは -classpath もしくは -cp の後にパスを記述する。
    • 複数のパスを指定する場合は、セミコロン (; Windows) もしくはコロン (: UNIX) で区切る
    • ディレクトリ階層を表すには 円記号(バックスラッシュ) (\ Windows) もしくはスラッシュ (/ UNIX)を用いる
  • Java の決められたディレクトリ (${JAVA_HOME}/jre/lib/ext) に JAR ファイルをコピーする

JAR ファイル

  • JAR ファイル・・・.java ファイル、.class ファイル群を圧縮して1つのファイルにしたもの
  • JAR ファイルはクラスパスに使用することも可能
  • 拡張子は .jar

jar -cf myApp.jar topDir // jar ファイルの作成
jar -tf myApp.jar // JAR ファイル内のディレクトリとファイルの一覧を表示
java -jar myApp.jar // JAR ファイルの実行

java -jar コマンドを実行するには METAINF.MF ファイルを用意し、

Main-Class: MyClass

のように、main() メソッドをもつクラスを指定する必要がある

引数をメソッドに渡す

  • メソッドに渡される変数は元の変数のコピー(基本データ型、参照型に関わらず)
  • 基本データ型を渡した場合、メソッド内で変数の値が変更されても、元の変数には影響がない
  • 参照型を渡した場合、メソッド内でオブジェクトに変更が加えられた場合、元の変数にも変更が反映される
  • 参照型を渡した場合、参照そのものが変更されたり、他のオブジェクト(の参照)が代入されたりしても、元の変数には影響がない
  • メソッドの戻り値も同じ

*1:たまにコマンドラインから実行するとき、これを忘れて動かなくなっちゃうんだよね。 JavaFX などでは自動でカレントディレクトリが含まれるようですが。