JavaとC++

Javaの復習

すっかり忘れてしまったので、要点を復習しておく。

開発環境

Javaの最小実行set は jre (Java run-time environment) で、 最小開発環境setは jdk (Java development kit)。

Compileと実行

Compile は javac である。生成される image は Java machine での image である。多くの場合Java machine は仮想machine (Java VM)として 各 OS の元で実行される。従って、Java image の実行はまず Java仮想machine を 起動し、その仮想machine に Java実行image を読み込ませ実行することになる。

Java machine での実行は指定した class にある静的 member 関数 main() の 呼び出しで開始される。静的 member 関数なので、object が存在していない 時点であっても実行できる。必要な object の生成はここで行う。

Applet として起動された場合は、Applet またはその派生 class の constructor が呼び出され object が生成された後、member 関数 init() の呼び出しで 開始される。通常、constructor をさわる必要は無い。

File名の制約

JavaはC/C++と違って、file名に強い意味付けがされている。

  • Source file の拡張子は .java であり、file名の部分はその中に記述されて いる main の class 名と一致させなければならない。
  • Compile すると、拡張子 .class という file が生成される。中に subclass が あると、それに応じて file名部分に $1 などを付加された file も同時に生成される。
  • (仮想)Java machine に読み込み実行させるには、file名のみ、すなわち中に記述 されている main の class 名を指定する。拡張子 .class の file を読み込むのでは あるが、拡張子を指定してはいけない。

Java Native Interface

Java仮想machineから、元のOSの native image を呼び出し実行する仕掛け、 または元の OS の native program から Javaの class を実行する方法が 提供されている。これを JNI (Java Native Interface) と言う。

最もよく行われるのは、GUI を Java で提供し、高速処理が必要な計算は native program で実行するという pattern だと思われる。この場合、 native program は dynamic link library の形で提供することになる。 Java 側では、この library module を Java class に wrap した source を用意する。この wrap した class の C/C++ 用 header や skelton を 生成する tool が用意されている。つまり、C と C++ の場合のよう単に外部 linkage 指定で compile 済みの module を持ち込むことができるわけではない。

Standalone application と Applet

Java仮想machine(とnative環境)のみで実行させることのできる Java program を Java standalone applicationと呼ぶ。 一方 Web browser 環境を必要とする Java program を Java applet と呼ぶ。両用にすることもできる。

両用にするには、Applet は AWT の Panel を継承していること、初期化は init() であることを理解しておく。 AWT の Panel を継承していることから、 graphical container object に add() できる。 Applet では Web browser の描画部を container に設定しているが、 standalone とする場合は、main() で適切な graphical container object (通常は Frame かその派生 class の object だろう)を作り、 applet object を add() してやればよい。その後、init() を呼び出す。

Class と interface

どちらも class と呼んでよいように思うが、Java では区別する。 Interface は method 宣言と定数の定義が成されているだけの class のようなもの(class というと Java な人に怒られる)。 何が嬉しいかというと多重継承できること(Java の class は 多重継承できない)。これが無いと、例えば GUI で keyboard event を 拾って、入力された文字を graphical screen 上に表示するなどと いう class を実現しようとすると、とてつもなく鬱陶しいことになる。

Interface の継承は implements (Class は extends)。 また、implements したら、dummy であっても、必ず 「すべての method を実装する」必要がある。 これはとっても面倒だし、interface の仕様変更があったら、それを implements したすべての class に影響が出ることを意味する。 これじゃ cupsulate できてないに等しいので、通常は interface を implements した class も用意する(何やってんだか)。 典型的な例は EventListener? (interface) と EventAdapter? (class) の関係に見られる。

Javaの復習(2)


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-12-12 (日) 11:14:12