|
|
Java の基礎 |
H.Kamifuji . |
avaを使ったプログラミングを作成するにあたって、基礎的な考え方や記述方法について解説します。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
まずは以前のページでサンプルとして使った下記のプログラムを見てください。 class sample{ public static void main(String args[]){ System.out.println("こんにちは"); } }上記はJavaのプログラムの最も簡単な構成でありsampleというクラスを設計しています。Javaのようなオブジェクト指向のプログラム言語ではこのようにクラスを使ってプログラムを記述していくことになります。 クラスとは何か、と書き始めると長くなってしまいますので、ここでは簡単に解説いたします。Javaでは何か処理をさせようとする時、その処理を行うモノを作り処理を行わせます。目的の処理を行わせるにはそのモノがどんな機能を持っていてどんなデータを扱うのかを正しく設計する必要がありますが、作り出すモノの設計図がクラスです。つまり目的に応じたクラスを設計し、クラスからモノを作り、そのモノに処理を実行させるというのがプログラムの流れとなるわけです。 クラスの書式は次の通りです。 class クラス名{ }classの後に半角スペースを1つ以上空け、そしてクラスの名前を指定します。そしてそのクラスが何をするものなのかを順に記述していきます。記述する場所はクラス名の後に記述した「{」から「}」までの間です。 例えば四則演算を行うようなプログラムを作る場合で考えてみます。Javaでは四則演算を行うもの、例えば計算機を作りその計算機に四則演算を行わせようとします。その計算機を作る元となる設計図がクラスですので、プログラムは計算機クラスを定義することから始まります。 class Calc{ int result; void plus(int val1, int val2){ result = val1 + val2; } }クラスの中身の細かい説明はここではしませんが、途中の計算結果を保存するための「result」フィールドと、加算を行う「plus」メソッドをクラスの中に定義しました。(フィールドとメソッドは別のページで解説します)。 この後で、このクラスからモノを実際に作りだし、そのモノに対して処理を行わせていきます。1つのクラスから複数のモノを作ることもできますので、計算機を何台か作っておいて複数の計算をさせることも可能です。 このようにクラスはJavaのプログラムの基本となります。ただこれからプログラムを始めようというところですので、今の段階ではクラスは設計図だということだけ覚えておいて下さい。 |
Javaのプログラムはクラスを設計し、そのクラスからモノを作り出して処理を行うということは前のページにてご説明しました。このページでは設計図であるクラスを実際にどのように記述するのかを簡単に見ていきます。 例として計算機というモノを作り出すことを考えてみます。計算機に必要なものは加算や減算といったデータを処理する「機能」と、計算対象や計算結果などの「データ」に分けることができます。Javaでは「機能」をメソッドと呼び「データ」をフィールドと呼びます。 クラスには、そのクラスから作り出されるモノが持つ機能(メソッド)とデータ(フィールド)を記述していきます。 class クラス名{ フィールド1 フィールド2 ... メソッド1 メソッド2 ... }どんなメソッドとフィールドを用意するかでそのクラスから作り出されるものが決まります。目的の処理を行わせるために、適切なメソッドとフィールドを設計しなければなりません。 例えばテレビクラスを作ったとします。このクラスから作り出されるものはテレビです。テレビにはテレビを映すという機能やチャンネルを変えるという機能があり、現在のチャンネルというデータがあります。そしてテレビに対して「テレビを映せ」とメソッドを呼び出したりするわけです。 メソッドでは今度はメソッドをどのように記述するかです。メソッドの書式は次のようになっています。[修飾子] 戻り値のデータ型 メソッド名(引数1, 引数2, ....){ }ここでは詳しく解説はいたしませんが、メソッドは呼び出す時、単に呼び出すだけではなく値を指定することもできます。例えテレビに対して「チャンネルを変えろ」というメソッドを呼び出すことも出来ますが、「チャンネルを"1"に変えろ」と何か値を指定して呼び出す場合もあります。また「現在のチャンネルを教えろ」というメソッドを呼び出せばテレビが持っているデータを参照して呼び出し元に値を返してきます。 ここでは説明のために一番簡単な構成のメソッドを見てみます。 void メソッド名(){ }引数も戻り値もないメソッドです。クラスの場合「{」から「}」の間にメソッドやフィールドを記述しましたが、メソッドの場合も「{」から「}」の間にメソッドが行いたい処理を記述します。 では挨拶だけをする簡単なクラスを作成してみます。 class Robot{ void hello(){ System.out.println("こんにちは"); } void bye(){ System.out.println("さようなら"); } }Robotクラスの中にhelloメソッドとbyeメソッドを用意しました。helloメソッドは呼び出されると「こんにちは」と表示します。またbyeメソッドは呼び出されると「さようなら」と表示します。このように必要な機能をメソッドとして追加しくことで、そのクラスから作成されるモノが持つ機能が増えていくことになります。 フィールド次はフィールドをどのように記述するかです。フィールドの書式は次のようになっています。[修飾子] データ型 変数名;ここでは詳しく解説はいたしませんが、フィールドには変数を記述します。変数というのは値を一時的に保管する場所のことで、値のデータ型と名前を指定します。データ型とは値の種類のことで例えば数値とか文字列などがあります。名前は保管場所を識別するために付けられた名前です。 例えば次のように記述します。 int old; String name;整数を扱うoldという名前の変数と、文字列を扱うnameという名前の変数を記述しました。 では数値をカウントするクラスを作成してみます。 class Counter{ int num; void init(){ num = 0; } void count(){ num = num + 1; } void printNum(){ System.out.println(num); } }Counterクラスの中に1つのフィールドと3つのメソッドを用意しました。initメソッドを呼び出すとnum変数に0を格納し、countメソッドを呼び出すとnum変数に格納されている値に1を加えて再度num変数に格納します。そしてprintNumメソッドを呼び出すとnum変数に格納されている値を出力します。 このようにフィールドは同じクラスのメソッドによって値を設定したり取り出したりして使われます。 メソッドもフィールドも詳細に説明するのはまた別のページで行いますので、ここではどのように使われるのかを覚えておいてください。 |
Javaのプログラムがクラスからモノを作成し、モノに処理を行ってもらうことは分かりました。では次にプログラムを作成し実行した時にはまず何が行われるのかを確認します。 ではJavaのプログラムの作成から実行までの流れをもう一度確認してみます。プログラムは例えば次のようなものでした。 class クラス名{ public static void main(String args[]){ System.out.println("こんにちは"); } }このプログラムを保存する時、ファイル名は「クラス名.java」となります。そしてコンパイルを行うと実行ファイル「クラス名.class」が作成されます。最終的にプログラムを実行する時は「java 実行ファイル」で実行しました。この実行ファイル名は「クラス名.class」から「.class」を除いたもの、すなわち、クラス名となります。 このように「java クラス名」で実行した場合、引数に指定したクラスの中に記述されたmainメソッドが呼び出されることになっています。つまり下記の赤い文字の箇所のメソッドです。 class クラス名{ public static void main(String args[]){ System.out.println("こんにちは"); } }mainメソッドの中でまず最初に実行する処理を記述して下さい。極めて簡単なプログラムであれば、ここに行いたい処理を記述することで処理を行うことができます。 mainメソッドmainメソッドの詳細は別のページで詳しく解説しますが、次のような書式になっています。public static void main(String args[]){ }引数の変数名を何にするかを除けばmainメソッドはこのように記述すると決まっています。 ところでクラスは設計図であって、何か処理を行うにはクラスからモノを作り出し、そのモノに対してメソッドを呼び出すことで実行するというのがJavaの処理の方法でした。今回の場合はプログラム起動時とはいえ指定したクラスの中のメソッドをいきなり呼び出しています。 これはmainメソッドが静的メソッドと呼ばれるもののためです。この静的メソッドというのはクラスからモノを作らなくても呼び出すことができる特殊なメソッドです。静的メソッドはメソッド名の前に「static」が付いています。 mainメソッドが無い場合プログラムの中で記述したクラス名とプログラムのファイル名が異なっていた場合、最終的にプログラムを実行した時に指定する実行ファイル名が表すクラスがプログラムの中に無いのでエラーとなります。(「コンパイルエラーと実行時エラー」参照)。今度はプログラムの中で記述したクラス名とファイル名は同じでも、そのクラスの中にmainメソッドが無い場合も試してみます。 例として次のようなプログラムを作成します。 class errtest{ void hello(){ System.out.println("こんにちは"); } }このプログラムを「errtest.java」として保存しコンパイルしてみます。 [xxxxxxxx@dddddddddd Const]$ vi errtest.java [xxxxxxxx@dddddddddd Const]$ javac errtest.java [xxxxxxxx@dddddddddd Const]$コンパイルはエラーがなく無事終了しました。次に作成された実行ファイルを使ってプログラムを実行してみます。 [xxxxxxxx@dddddddddd Const]$ java errtest エラー: メイン・メソッドがクラスerrtestで見つかりません。次のようにメイン・メソッドを定義してください。 public static void main(String[] args) またはJavaFXアプリケーション・クラスはjavafx.application.Applicationを拡張する必要があります [xxxxxxxx@dddddddddd Const]$ 上記のようなエラーが発生しました。 これはJavaの実行時に指定したクラスの中にあるmainメソッドを呼び出そうとしたが、そのような名前のメソッドが見つからなかった場合に出るエラーです。 mainメソッドがある場合でも、staticを記述し忘れた場合にも同じエラーが発生します。 |
ここまで説明してきたとおり、Javaではクラスの中で定義したメソッドの中に実行したい処理を記述していきます。 処理には演算をしたり何かを出力したりといったことを行うのですが、Javaでは実行する1つの処理を「文」と読んでいます。1つのメソッドでは複数の処理を行うことができますので1つのメソッドの中に複数の文が含まれることになります。 また文の最後にはセミコロン(;)を付け1つの文がどこまでなのかを明確にします。 次の例を見てください。 class Sample1 { public static void main(String args[]) { System.out.println("こんにちは"); System.out.println("お元気ですか"); System.out.println("さようなら"); } }mainメソッドの中には3つの文が含まれています。次の3つです。 System.out.println("こんにちは"); System.out.println("お元気ですか"); System.out.println("さようなら");これらは1つの文毎に改行していますが改行には意味はありません。次のように記述しても同じです。 class Sample1 { public static void main(String args[]) { System.out.println("こんにちは"); System.out.println("お元気ですか"); System.out.println("さようなら"); } }文の区切りはセミコロン(;)までとなっていることに注意して下さい。 メソッド内にて文が実行される順番文は1つの文毎に実行されていきます。そして複数の文があった場合には記述された順に実行されていきます。では実際に試してみます。 サンプルプログラム下記のサンプルを実行してみよう。class Sample1 { public static void main(String args[]) { System.out.println("こんにちは"); System.out.println("お元気ですか"); System.out.println("さようなら"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Const]$ java Sample1 こんにちは お元気ですか さようなら [xxxxxxxx@dddddddddd Const]$mainメソッド内に記述した順に文が実行されているのが確認できます。 念のため、文の順番を替えて試してみます。 サンプルプログラム下記のサンプルを実行してみよう。class Sample2 { public static void main(String args[]) { System.out.println("さようなら"); System.out.println("お元気ですか"); System.out.println("こんにちは"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Const]$ java Sample2 さようなら お元気ですか こんにちは [xxxxxxxx@dddddddddd Const]$やはり記述した順に文が実行されているのが確認できました。 |
ここではプログラムを記述する上での空白や改行の取り扱いについて確認します。今まで使ってきたサンプルを今一度見てください。 class sample{ public static void main(String args[]){ System.out.println("こんにちは"); } }これを例えば次のように記述することもできます。 class sample { public static void main(String args[]) { System.out.println("こんにちは"); } }上記は「{」の前に改行を入れたものです。Javaのプログラムでは、単語の途中でなければ自由に空白や改行を入れることができます。その為、あまりお薦めはできませんが次のように記述をしても間違いではありません。 class sample { public static void main(String args[]) { System.out.println("こんにちは"); } }また空白も同様です。よく使われるのはブロック(「{」から「}」までのことだと考えて下さい)毎にインデントとして行の先頭に空白を入れて、どこからどこまでが同じブロックなのかが分かるようにすることです。例えば空白が無い場合は次のようになります。 class sample{ public static void main(String args[]){ System.out.println("こんにちは"); } }どこからどこまでがメソッドなのかとても分かりにくいです。そこでメソッドならメソッド、クラスならクラスでインデントを使うと見やすくなります。よく使われるのは空白4文字です。UNIX 系の vi では、TAB ( 8 文字空白に相当 ) が使われます。 class sample{ public static void main(String args[]){ System.out.println("こんにちは"); } }※4文字のインデントにすると1つの文の横幅が長くなりホームページに掲載しにくいため、解説するときはインデントを2文字にしています。 改行や空白はどこでどれだけ入れても構いませんが、単語などの途中で入れることはできません。例えば次のように「class」の途中で空白を入れるのはエラーとなります。 cla ss sample{ public static void main(String args[]){ System.out.println("こんにちは"); } }どのような記述するのかは自由ですが、常に同じような方法で記述するようにすることで見やすくもなりますし単純な記述ミスを防止することもできます。 |
プログラムを作成していく時に、このメソッドはどんなメソッドなのかや誰がいつ記述したものなのかといった情報を残しておくと後で見なした時に便利です。このようにプログラムの中に説明を記述する時に使うのがコメントです。 コメントはプログラムが実行される際に無視されますのでプログラムの動作には何の影響もしません。 //を使ったコメントJavaではコメントを記述する方法が2つ用意されています。1つ目の方法は「//」を使います。//コメントプログラム中に「//」が現れた場合「//」から行末までをコメントとして扱います。「//」は行の先頭に記述しその行を全てコメントとしてもいいですし、行の途中で記述してその位置より右側をコメントとしてもいいです。 // 作成日 09.02.09 class sample{ public static void main(String args[]){ System.out.println("こんにちは"); // 画面出力 } }上記の場合、// 以降行末までがコメントとなりプログラムの実行時には無視されます。 一時的にプログラムの一部を使用したくない場合にもコメントは利用されます。次の例を見てください。 class sample{ public static void main(String args[]){ // System.out.println("こんにちは"); } }一時的に「System.out.println("こんにちは");」の文をプログラムで実行したくない場合、プログラムから削除してもいいですが先頭に「//」を付けてコメントにすることで削除した場合と同じように実行されなくなります。 /* */を使ったコメント2つ目の方法は「/* */」を使います。/* コメント */プログラム中に「/*」が現れた場合、次に「*/」が現れるまでの部分を全てコメントとして扱います。この形式を使う場合には複数行に渡ったコメントを記述することができます。 /* 作成日 09.02.09 バージョン 1.0.3 クラス名 sample */ class sample{ public static void main(String args[]){ System.out.println("こんにちは"); /* 画面出力 */ } }上記の場合、「/*」から「*/」までの間がコメントとなりプログラムの実行時には無視されます。 「/*」から「*/」までの間が全てコメントとなりますので、複数行に渡る範囲を一度にコメントにしたい場合に便利です。 どちらの形式を使ってもコメントとしてプログラムの実行時には無視されることに違いはありませんので、使いやすい方を使って下さい。 |
Javaの言語仕様として何らかの意味を持つ単語を予約語として登録してあります。例えば条件分岐を記述する時に使用される「if」などが予約語です。今後変数やクラスなどの名前を自分で付ける時にはJavaの予約語は使用することができません。 予約語の一覧は次の通りです。
なお下記の3つは予約語ではなく予め用意された定数です。
予約語やここであげた定数の詳しい使い方はそれぞれのページで行います。 |
|