Javaプログラミングに必要なもの
Javaプログラミングを始めるにあたって必要なものを列挙してみます。
- 好奇心
- ゆっくり、まったり、努力するゆとりある心
- 解らないことだらけでもそれが当たり前だと思い挫折しない鋼の魂
- Javaが動作するコンピューター
Hello, World! でJavaの世界の扉を開けよう
それでは、Windows PCを使って最初のJavaプログラムを組みます。
これから組むプログラムは世界中で愛されているプログラムです。
標準出力に”Hello, World!”と表示されるだけの非常にシンプルなものです。
メモ帳などのテキストエディタを立ち上げて下記コードを入力します。
|
1 2 3 4 5 6 7 |
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } |
このプログラムの構造と意味をざっくりと見てみましょう。
1行目のpublicとはアクセス修飾子と呼ばれるものでこのクラスが他の場所からアクセス可能であることを示します。
classとは日本語では型と呼ばれたりします。Javaではすべてのコードはクラスの中に書かれます。
これは”HelloWorld”という名前のクラスを定義しています。
HelloWorldはクラスの名前です。
ファイル名もHelloWorld.javaである必要があります。
3行目のコードのpublicもアクセス修飾子で、他のクラスからも呼び出せるようにするための修飾子です。
staticは、mainメソッドがインスタンス化されなくても呼び出せることを意味します。
voidは、mainメソッドが何も値を返さないことを示します。
mainメソッドは、基本的にはプログラムを実行すると、まずこのメソッドが呼び出されます。
mainメソッドの引数のString[] argsは、コマンドライン引数を受け取るためのString型配列です。
String型配列とは文字列型配列のことでこのプログラムでは使われることはありません。
Systemは、Javaの標準クラスでjava.langパッケージに含まれています。
outクラスは、Systemクラスのpublic static final フィールドで型はPrintStreamです。
printlnメソッドは、PrintStreamクラスのメソッドで文字列や数値などを出力し、改行します。
したがって、System.out.printlnメソッドは、標準出力(コンソール)に文字列を改行を追加して表示します。
引数の文字列”Hello, World!”を標準出力に改行を追加して出力します。
メモ帳の名前を付けて保存でファイル名をHelloWorld.javaとして保存します。
ファイル名の拡張子を必ず.javaとします。

今回は、”C:\JavaProjects”に保存しました。

Javaプログラムをコンパイルする
保存したHelloWorld.javaファイルをJava Virtual Machineで実行できるようにコンパイルという作業が必要です。
Java Virtual Machineとは、Javaプログラムをコンピュータ上で実行するためのソフトウェアです。
Javaソースコードをコンパイルして生成されるバイトコードを、各プラットフォーム固有の機械語に変換することで、
“Write once, run anywhere“というJavaの理念を実現しています。
“Write once, run anywhere“というJavaの理念ですが、一部のプログラマからは“Write once, debug everywhere“と言われていました。
これは、“一度書いてしまっても、そこら中でデバッグしなければいけない”というジョークです。
Java言語は進化する言語でバグが存在するのは当たり前という風潮があり、「バグレポート」が「バグパレード」という名称になりました。
残念ながらOracleによるSunの買収(2010年)以降、Javaのバグ報告システムは段階的に変更され、「バグパレード」という名称は廃止されました。
それではコマンドプロンプトを立ち上げてHelloWorld.javaファイルを保存したフォルダに移動します。

移動したら、Javac HelloWorld.javaと入力し、実行します。

無事にコンパイルされたら、HelloWorld.classファイルが作成されています。

Javaプログラムの実行
それでは作成した初めてのJavaプログラムを動かしてみましょう。
コマンドプロンプトを立ち上げて、HelloWorld.classファイルがあるところまで移動します。
java HelloWorldと入力し実行します。

実行して、問題がなければ次のようにコマンドプロンプトにHello, World!と表示されます。

数行のプログラムですがJavaプログラマーのはじめの一歩で世界中で愛されています。
つまり、これであなたもJavaプログラマーです。
Javaプログラミングを楽しみましょう!
もう一つのHelloWorld
ここからはおまけです。
J2SE 5.0(Tiger)から可変長引数が使えるようになったのでmainメソッドでそれを利用した下記のコードを使えます。
|
1 2 3 4 5 6 7 |
public class HelloWorld { public static void main(String... args) { System.out.println("Hello, World!"); } } |
3行目のメインメソッドの引数が可変長引数 String… args となっています。
実行結果は当然変わりません。
コンパイルされたバイトコードを確認してみます。
配列を使用した最初のプログラムのバイトコードの一部です。

flags: (0x0009) ACC_PUBLIC, ACC_STATICとなっています。
これはバイトコード情報で、特定のメソッドやフィールドにどんなアクセス修飾子が付いているかを示すものです。
0x0009は、16進数でビットフラグの合計値です。
ACC_PUBLICが0x0001でpublic、ACC_STATICが0x0008でstaticでビットフラグの合計値が0x0009となっています。
それでは可変長引数を使ったプログラムのバイトコードを見てみます。

flags: (0x0089) ACC_PUBLIC, ACC_STATIC, ACC_VARARGSとなっています。
フラグACC_VARARGSが増えています。
ACC_VARARGSは0x0080で可変長引数を使用していることが解ります。
これはJava Virtual Machineでは内部的に配列として扱われますが、フラグACC_VARARGSが付いていることで
呼び出し側が配列を作らずに直接複数の引数を渡すことを可能としています。
配列と可変長引数の違い
配列と可変長引数の違いについてざっくりと見てみましょう。
配列
可変長引数
このような特徴があります。
配列の使用例
|
1 2 3 4 5 |
public void myLover(String[] names) { for (String name : names) { System.out.println(name); } } |
配列の呼び出し
|
1 2 |
String[] lovers = {"新垣結衣", "今田美桜", "浜辺美波"}; myLover(lovers); |
可変長引数の使用例
|
1 2 3 4 5 |
public void myLover(String... names) { for (String name : names) { System.out.println(name); } } |
可変長引数の呼び出し
|
1 2 |
myLover("新垣結衣", "今田美桜", "浜辺美波"); myLover(); // 引数なしでもOK |
配列 vs 可変長引数 比較表
| 項目 | 配列 | 可変長引数 |
|---|---|---|
| サイズ | 固定 | 可変(0個〜任意個) |
| 呼び出しの手間 | 配列を作る必要がある | 直接値を並べて渡せる |
| 柔軟性 | 低い(サイズ変更不可) | 高い(引数の数を気にしなくてよい) |
| 実体 | 同じ(配列) | 内部的に配列 |
| 複数引数との併用 | 可能(順番自由) | 最後の引数にしか使えない |
上記の表のような違いがあります。
注意点として可変長引数は1メソッドにつき1つだけ定義可能となります。
複数の可変長引数を取ることはできません。
他の引数と併用する場合は最後に渡す必要があります。
|
1 2 |
public void myLover(String age, String... names) {} // OK public void myLover(String... names, String age) {} // NG |
どちらを使うべき?
- 引数の数が不定の場合 → 可変長引数が便利。
- すでに配列としてデータを持っている場合 → 配列のほうが自然。
- API設計で柔軟性を持たせたい場合 → 可変長引数が読みやすく、使いやすい。
どちらを使うかはプログラムを組む人のセンスによる。
しかし、可変長引数を全く使わないとJ2SE 5.0(Tiger)で追加されたことを知らないと思われるかもしれない。


コメント