Javaを文法的に見た場合の構成について説明します。
- 語句の種類
-
Java言語を構成する語句は「識別子」、「予約語」、「定数」、「文字列」、「演算子」、
「区切子」、「コメント」、「ブランク」があります。
識別子は、メソッド名、変数名そしてクラス名のことです。変数には、
単純変数、配列の2種類があり、さらにint型、char型などの型が存在します。
予約語は、プログラムの実行順序の制御や、変数の型など、決まっている語です。
定数はその名の通り、定数です。文字列も定数(文字)の羅列で、定数の1種と考えられます
演算子は足し算、引き算などの「+」や「-」のことです。
区切子とは、文と文を区切ったりするものです。
コメントとは、何をしている部分だとか、この関数は何をするものだとか、ここはまだ
未完成だよとか、プログラムとは関係ないが、プログラマーが自分あるいは、一緒に作っている
仲間のプログラマーに対してのメッセージです。コメントの書き方は2種類あります。1つは
「//」の以降改行まで、2つ目は「/*」と「*/」の間です。
後者は入れ子ができません。
ブランクとは、プログラムを見やすくするための改行や、タブ、スペースを言います。
- 式
-
これらの語句を組み合わせて式を構成します。
式には一次式と演算式(演算子を用いて一次式を組み合わせたもの)に分けることができます
(数学で言う一次式とは異なります)。
関数も式になります。何かを処理するための引数を必要とし、その結果を返します。
その結果を戻り値と言います。
- 文
-
式1つもしくは複数の式から文を構成します。文の後には必ず1文の終わりを示す記号
「;」がつきます。1行の中に文が2つ以上あっても構いません。エディターで見た場合に
1行の中に複数の文があっても、コンパイラは1文を1文として認識するからです。
したがって、次の左のプログラムと右のプログラムは同じものです。
import java.io.*;
class Test{
public static void main(String args[]){
int x = 10;
int y = 20;
int z = x + y;
}
} |
import java.io.*;
class Test{
public static void main(String args[]){
int x = 10; int y = 20; int z = x + y;
}} |
文には「式の文」(上で言う「int x = 10;」など)、空文(「;」のみからなる文)、
制御文(「break;」、「return;」など)があります。
- ブロック
-
文が0文、1文、あるいは複数の文からブロックが構成されます。文をブロックを表す
「{」と「}」で囲みます。ブロックは「1文と見なす単位」のことです。
条件分岐(「if」、「else」)や反復(「for」や「while」など)などは、基本的に1文しか
実行できません。しかし1文だけしか繰り返せないのでは不便です。そこで
このブロックで1文と見なすことで、複数の文を反復することができるのです。
また、ブロックは入れ子にできるので、複数のブロックを1つのブロックとすることも
できます。
JavaはC++と同様オブジェクト指向言語です。オブジェクト指向とは、プログラムも実世界に存在する
モノと考えてプログラムを作ることです。このモノをクラスと呼びます。クラスはデータとメソッド
(C++では関数)から作られます。例えば、オブジェクト指向言語でお絵かきソフトを作ろうとした場合、
ペンクラスを用意し、ペンクラスには「絵を書く」というメソッドなどを用意します。
哺乳類を考えた場合、哺乳類クラスには「餌を食べる」「寝る」などのメソッドと、「足の数」という
データを用意します。犬は哺乳類の一種なので、「犬」クラスは「哺乳類」クラスのサブクラスと呼ぶことが
でき、この場合「足の数」は4になります。これを継承といいます。このように継承を使用すると、
新しいクラス(ここでは犬クラス)を作る場合に、その差分だけを作ればよいので、プログラムの効率が
よくなります。
ところで、先ほどのペンですが、ペンは文房具の一種ですが、文房具にははさみなどもありますので、
差分だけ作るというのは無理なようです。はさみクラスは仕方がないので、新しく作らなければなりませんが、
その他にもクラスが増えてくると、文房具は文房具でなんとかひとまとめにしたいです。
このような場合、C++では「名前空間(namespace)」という機能を作ることでとりあえず分別はできますが、
実質は名前空間を分けているだけなので、分別しているわけではありません。Javaでは、パッケージという
機能を使うことで、このような場合、文房具は文房具でまとめることができます。
もっと具体的に言うと、JDKで用意されているクラスのうち、GUIを担うクラス群(ボタンやテキストエリアなど)
は「awt」という名前でパッケージ化されています。ネットワーク関係を担うクラス群は「net」という
名前でパッケージ化してあります。さらに、パッケージの中にパッケージを入れることもできますので、
たくさんのクラスを作った場合、整理するのがC++に比べて便利になっています。
また、JavaにはCやC++のようなヘッダーファイルがありません。したがってJavaには「#include」は
ありませんが、どのパッケージを使用するかをあらかじめ宣言しなくてはなりません。それが下の例の
「import」です。下の例では、javaパッケージのioパッケージの中の全てのクラスを使用できるように
というimport宣言です。(*が全てのクラスを使用するという意味)
import java.io.*;
// コメント
class Test{
public static void main(String args[]){
System.out.println("Hello Java World.");
}
}
|
Javaでは、すべてプログラムはクラス内に収められます。これがC++とは大きく違うところのひとつです。
したがって、「class Test」というように、クラス宣言があります。
そして、クラス内に最初に実行されるべきmainメソッドを定義します。CやC++では、main関数を
定義するのに、引数を取ったり取らなかったり、また、戻り値をintにしたりvoidにしたり自由に
定義できましたが、Javaでは、戻り値はvoid、引数はString型の配列と決まっていますので、
このように記述します。
そして、必要ならば他のメソッドや変数を定義します。
また、Javaでは基本的に1つのファイルに1クラスです。クラス名とファイル名は同じです。
拡張子は「java」にします。特殊な場合は1ファイルに複数のクラスを定義することもできますが、
オブジェクト指向に反するので、このような使い方は一般にしません。小さなプログラムや、
Java Appletを作るときには、やりますが・・・。