[[JavaとC++]]
* Javaの復習 [#fb5d2b6c]
すっかり忘れてしまったので、要点を復習しておく。
** 開発環境 [#d3d52ed3]
Javaの最小実行set は jre (Java run-time environment) で、
最小開発環境setは jdk (Java development kit)。
** Compileと実行 [#s1ac3b2a]
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名の制約 [#d5fa00f0]
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 [#n199b8b5]
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 [#b8eef6c5]
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 [#v8638e2e]
どちらも 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)]] へ