Lesson 2: Javaアプリケーションの作成
Javaのアプリケーションを作ってみましょう。Java言語(Javaプログラム)で書かれたプログラムは、すべてクラスから構築されます。
Javaプログラムって見た感じどれも同じようよね?
(いつも通りこの色は美樹ちゃん)
そうだね、それはすべてがクラスからなっていることと、それらのクラスが同じ構造で共通の要素を共有しているからだね。今回のレッスンでは、アプリケーションの構造と要素について説明します。
は〜い。
Section 1: アプリケーションの構造
Javaアプリケーションは、クラスから作成されます。クラスは、フィールドにあるデータを格納するという点で Pascal言語のRECORDや C言語の構造体に似ています。クラスが RECORDや構造体と違うのは、データに対して作用するメソッド(振る舞い)をさらに定義するということです。
まず、Java アプリケーションを作成するのに必要なプログラムの構造を見ていきましょう。
Javaアプリケーションは、
必ず main
メソッドを持ったクラスがひとつ必要です。 この
メソッドを含むクラスはプログラムの始まりとなります。Javaインタプリタがアプリケーションを実行する際、この
メソッドを含むクラスのクラス名が必要となります。
Lesson 1 でも出てきましたが、もっとも単純な Javaアプリケーションを使って構造を見てみましょう。
/* * Simple Example */ class HelloWorld { public static void main(String[] args) { System.out.println("Hello, world."); } }
public static void
というキーワードは、Java インタプリタ(JVM)が インスタンスを生成せず(static)に main メソッドを呼び出し、終了時に何も値を Javaインタプリタに返さない(void)ということを意味します。 これが、もっとも単純なJavaアプリケーションです。つまり、Javaアプリケーションは最低でもこの形が必要となります。
インスタンスって覚えてる?
オブジェクト(実体)でしょ?
そうだね。実際にデータを扱うには、オブジェクトを生成して(インスタンシエイト)してそのオブジェクトに対していろいろな操作を行うんだよね。
インスタンスは、クラスの実行可能なコピー(オブジェクト)です。その一方でクラスは、データとメソッド(振る舞い)について記述した定義です。データを処理するためにクラスのインスタンス化が必要になります。
ところで、先ほどのプログラムですが、mainメソッドはインスタンスを作成せずにJava VMインタプリタに渡されます。プログラムがスタートした後で必要なデータのインスタンスが作成されます。クラス内のフィールドのstaticでないデータにアクセスする必要がない限りインスタンスを生成する必要がないためサンプルプログラムではインスタンスを作成していません。ただ単に、java.lang.System
クラスのstaticメソッドである println
を呼び出しメッセージを表示しています。
Section 2: フィールドとメソッド
Java アプリケーションの構造がわかったところで、今度はもう少し細かいクラスの構造を説明しましょう。クラスは、内部で使用されるデータであるフィールド、処理の手続き(ふるまい)であるメソッド、オブジェクトを生成するための初期化等を行うコンストラクタで構成されています。コンストラクタは、クラス名とおなじ名前のメソッドで、インスタンスを作るときに一度だけ呼ばれます。
class MyClass { int a; /* フィールド*/ MyClass () { ... } /* コンストラクタ */ void method() { ... } /* メソッド */ }
例えば、単純なクラスは、テキストの文字列を格納するフィールドを持ち、文字列をセットするメソッドと文字列を得てコンソールにそれを表示するメソッドを定義するかもしれません。
これらを踏まえたうえで、Java アプリケーションを考えて見ます。
class Hello1 { // フィールド static String text = "Hello, world!"; public static void main(String[] args) { System.out.println(text); } }
上記のサンプルのように text が static フィールドである場合、インスタンスを生成せずにデータに直接アクセスすることができます。
class Hello2 { // フィールド String text = "Hello, world!"; // メソッド(Accessor method) String getText() { return text; } public static void main(String[] args){ World progInstance = new World(); // インスタンスの生成 String retText = progInstance.getText(); System.out.println(retText); } }
上記のように、static でないフィールドがある場合、インスタンスを生成しなければデータにアクセスすることが出来ません。このプログラムを C プログラムの構造体ようにすべて static にしてしまうと以下のようになります。
class Hello3 { // フィールド static String text = "Hello, world!"; // メソッド(Accessor method) static String getText() { return text; } public static void main(String[] args){ String retText = getText(); System.out.println(retText); } }
Section 3: コンストラクタ
クラスは、インスタンスが生成される際に呼ばれるコンストラクタという特別なメソッドがあります。コンストラクタは、クラスと同じ名前で戻り値はありません。
アプリケーション Hello2 を、コンストラクタを含めた形でコーディングしてみましょう。
class Hello4 { // フィールド String text; // コンストラクタ Hello4() { text = "Hello, world!"; }; // メソッド(Accessor method) String getText() { return text; } public static void main(String[] args){ World progInstance = new World(); // インスタンスの生成 String retText = progInstance.getText(); System.out.println(retText); } }
最後に:
実際にこのようなプログラミングは行わないと思いますが、Javaプログラムの基礎的な構造を理解するためにこのような単純なプログラムを使用しています。