Java
メインページ > 工学 > 情報技術 > プログラミング > Java
本書は、Javaの技術を全体的に見渡すことができるように、いくつかのパートに分けて解説を進めます。 なので読者は、本書の解説は知りたい部分だけを選んで読んでも構いません。
入門の文法編集
- 概要
- Javaクイックツアー (Javaとはどんなものか / Javaの現状)
- かんたんなJava入門
- プログラミングのための準備 (インストール方法など)
- Hello world (コンパイル方法、実行方法、printfとprintln など)
- かんたんな基礎
- クラスとメソッド
発展事項編集
バージョンごとの主な新機能編集
- Java 7 の主な新機能の一覧
- アンダースコア: 数値リテラルにおいて、読みやすさを向上させるために、桁区切りに使用されます。
- 文字列のswitchステートメント:文字列を使用してswitchステートメントを作成できるようになりました。
- 数値リテラルのアンダースコア:大きな数値リテラルをより読みやすくするために、アンダースコアを使用して数字をグループ化できるようになりました。
- ダイヤモンド演算子:Java 7.0では、ジェネリッククラスのインスタンス化時に、右側のジェネリック引数を省略できるようになりました。
- ジェネリック例外の型推論:Java 7.0では、catchブロックでジェネリック例外をキャッチするときに、ジェネリック型の推論ができるようになりました。
- 可変長引数の改善:可変長引数を使用して、他の引数と組み合わせて使用できるようになりました。
- インスタンス化されたジェネリック型の引数の型推論:コンパイラが、ジェネリック型の引数の型を自動的に推論できるようになりました。
- Java 6.0の主な新機能の一覧
- コンパイル時定数(Compile-Time Constants):Java 6.0では、定数式が宣言された場所で評価されるようになりました。これにより、実行時のコストが削減され、コードの簡潔性が向上しました。
- リテラル文字列の自動的な連結(Automatic Concatenation of Literal Strings):Java 6.0では、複数のリテラル文字列が隣接している場合、自動的に連結されるようになりました。これにより、コードの可読性が向上し、記述の簡略化が可能になりました。
- Java 5.0の主な新機能の一覧
- ジェネリクス: 型安全なコレクションを実現するための機能で、コンパイル時に型チェックを行い、実行時のキャストエラーを回避することができます。
- アノテーション: クラス、メソッド、変数などに付与することができるメタデータで、コンパイル時や実行時に利用される。
- オートボクシングとアンボクシング: プリミティブ型とそのラッパー型の間で自動的に変換を行うことができます。
- 列挙型: 列挙型は、定数の集合を表現するために使用されます。列挙型は、コンパイル時の型検査に役立ちます。
- 静的インポート: 静的メンバーをインポートすることができます。
- 可変長引数: メソッドが可変数の引数を取ることができるようになります。
- 拡張forループ(Enhanced For Loop):Java 5では、配列やコレクションなどの要素に対して、より簡単かつ安全にループ処理を実行するための拡張forループが導入されました。
J2SE / Java SE編集
※ 未作成編集
- ※ 下記の記事は、教科書本体ができて、ある程度の完成度になったら、「未作成」以外の独立した節に移動してください。
テスティング編集
- テスティング入門
- テストとは何か / テストはなぜ重要か / テスト駆動はなぜ重要か
- テストを書いてみよう
J2EE / Java EE編集
- JSP入門
- サーブレット入門
歴史編集
アメリカの代表的なコンピュータ企業の1つに、サン・マイクロシステムズという大企業がありました。
サン・マイクロシステムズ社は、1995年5月23日に、新しいプログラミング言語と、それを稼働させるプラットフォームを公式発表しました。 その言語とプラットフォームには、その総称として、Javaという名が付けられていました。 すなわち、本書で解説する技術の誕生です。 Javaは“未来を変える技術”として、当時耳目を集め、大いに喧伝されました。
その後のJavaの歩みは、必ずしも当時描かれた夢のとおりだったとは限りません。 しかし、多少の曲折を経ながらもJavaは急速に、そして深く浸透し、現在では欠かすことのできない主要な開発技術の1つとして数えられるに至っています。 その技術的な蓄積も、ドッグイヤーと呼ばれる急速な流れの中で、すでに簡単には語り尽くせぬ厚味ができていると言ってよいでしょう。
- GUIツール
かつて「Javaアプレット」という、JavaでGUIなどを簡単に作れるツール群が開発されていましたが、現代ではJavaアプレットは廃止されています。しかし別のツール群で21世紀の現代(2021年に本文を記述)でも容易にGUIをJavaで作れます。awtやswing、JavaFXなど(それぞれ別ツール)のJava用 GUI制作ツール群により、現代でもJavaでGUIアプリの制作が可能です。GUIについては、他の単元で説明します。
- 国際規格は無い
Javaは国際規格には、なっていません。かつて1990年代の後半頃、Javaの国際規格化が議論されましたが、そのまま国際規格にならないまま、現代に至っています。なお(Javaと比較される事も多い)C#には国際規格が存在します。)
執筆者むけの告知編集
執筆者は、既存のページを修正できるだけでなく、Javaに関するまだ書かれていない重要な分野について、いつでも新規に書き起こし、それをこのページからリンクすることができます。
もちろんJavaは、現在も発展し続けています。その学習や、あるいはその情報伝達のために、ぜひ本書を活用してください。
関連項目編集
- 基本情報技術者試験 - 国家試験(情報処理技術者試験)。Javaに関するプログラミングの問題が出題される。
ライブラリ編集
※記述中編集
GUI編集
- ※ GUIアプリをどこの単元に入れればいいか分からないので、とりあえず目次ページに間借りします。Java詳しい人がいれば、適切なページに移動してください。
- ※ Javaアプリの解説をしたいので、GUI関連の単元はwikibooksにも欲しい。
GUI をJavaで表示するには、awtというライブラリをインポートします。標準的なJavaをインストールしてあれば、下記のようにimport 命令をコード中に書くだけでインポートできます(コード外でのインストール作業は不要です。)
WindowsだけでなくLinuxのopen-jdkでもawtは使えてGUI表示できるので、安心して使って良い。(※ Fedora 35 で 2021年11月4日に実機で下記コードを実行して確認済み。)
- sample.java
import java.awt.*; import java.awt.event.*; // これないとウィンドウ閉じられない public class sample extends Frame { public static void main(String[] args) { sample sm = new sample(); } sample() { super("ここはタイトル"); // ウィンドウのタイトル欄に表示される addWindowListener(new closableWindowAdapter()); // 後述のウィンドウ閉じるようにクラスを読み込ませる必要あり setSize(250, 200); // ウィンドウサイズの設定 setVisible(true); // 表示/非表示の切り替え。trueなら表示。falseなら非表示。 } } // ウィンドウを閉じられるようにするのに必要 class closableWindowAdapter extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } }
ウィンドウを作成するには、awtの Frame クラスを使います(コードの前半のextends の先に「Frame」があります)。上記コードのように main() メソッドの属するクラスが Frame クラスを継承します[1]。
なお、コード後半にある、ウィンドウ閉じる関連のクラスのコード中の extends の先にある windowAdapterクラス というのは、一通りのイベントに対応したクラスです。上記コードでは可読性を考えてウィンドウ閉じる関連のクラスをmain()メソッドとは分離しましたが、別にmain()メソッド内でウィンドウ閉じる関連のクラスを記述しても、コードは実行可能です(コード例については省略する)。
なお、個別のイベントに対応したメソッドとしては、
- windowOpened メソッド
- windowClosing メソッド
- windowClosed メソッド
- windowIconified メソッド
- windowDeiconified メソッド
- windowActivated メソッド
- windowDeactivated メソッド
があります。個別のメソッドを記述するのが面倒なら、WindowAdapterクラスでまとめてサンプルコードのように書くことも可能です。
windowClosing は java.awt.event.WindowListener のメソッドです。もしつづりを間違えてコード入力すると、ウィンドウが閉じなくなります。ウィンドウリスナーを作成したさい、用意されるメソッドの一種が windowClosing であり、文字通り「ウィンドウを閉じるメソッド」を意味します[2]。
ウィンドウ終了させるには、入力ミスなどが無ければ、ウィンドウ右上のXボタン(閉じるボタン)をクリックすれば普通に終了します。
もし入力ミスなど何らかの原因でウィンドウが閉じなくなった場合、ウィンドウを終了させるには、Java起動に用いたコマンド端末(例えばWindowsの場合ならコマンドプロンプト)ごと終了します。
webサーバ編集
windows の場合編集
Java18から追加された機能で、簡単なwebサーバがあります。
コマンドライン(たとえばwindowsなら「コマンド プロンプト」)からコマンドjwebserver
で呼び出して使えます。利用時、jwebserverコマンドはbin内に用意されているので、インストールしたjava18のbinフォルダを指定します。
つまり下記コマンドのようになります(一例)。
C:\Users\ユーザ名>C:\jdk-18\bin\jwebserver
もしこのコマンドに成功すれば、ルートディレクトリに、ホームフォルダの内容がアップロードされます。特に設定を変更して無い限り、ホームフォルダが対象になります(2022年4月21日に確認)。
コマンドライン上の表示では、コマンド実行後にたとえば下記のように表示されます。
C:\Users\ユーザ名>C:\jdk-18\bin\jwebserver Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::". Serving C:\Users\st and subdirectories on 127.0.0.1 port 8000 URL http://127.0.0.1:8000/ 127.0.0.1 - - [21/4譛・2022:16:25:27 +0900] "GET / HTTP/1.1" 200 - 127.0.0.1 - - [21/4譛・2022:16:26:05 +0900] "GET / HTTP/1.1" 200 -
このあと、webブラウザ(たとえばFirefoxなど)で、アドレスバーに http://127.0.0.1:8000/ を入力してアクセスします。
すると、たとえば下記のように、カレントディレクトリにあるファイル一覧が表示されます。つまり、カレントディレクトリのディレクトリ構成が表示されます。
aaa.txt test.txt hello.c
どのようなファイルがあるかは個々人のパソコン利用状況によって異なりますので、上記の表示例はあくまで一例です。
なお、 index.html というファイルがあれば、上記のディレクトリ構成に変わり、そのファイルの内容が表示されます。
Javaの webサーバを終了するには、Ctrl + C です。つまりコントロールボタンCtrl を押しながら Cボタン で終了です。
そのほか、java 18を使える環境なら、コマンド
java --module jdk.httpserver
でも可能です。
アドレスバーに http://127.0.0.1:8000/ を入力してアクセスすれば、ホームフォルダの内容があります。
Linux の場合編集
公式サイトのバイナリを使う方法編集
説明に簡単のため、ホームフォルダに公式サイトからダウンロードしてきたjdk-18以降のバイナリを置きます。
あとは下記のコマンド実行をするだけです。
/home/ユーザー名/openjdk-18.0.1.1_linux-x64_bin/jdk-18.0.1.1/bin/jwebserver
実行結果(ターミナル側)
[ユーザー名@fedora ~]$ /home/ユーザー名/openjdk-18.0.1.1_linux-x64_bin/jdk-18.0.1.1/bin/jwebserver Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::". Serving /home/ユーザー名 and subdirectories on 127.0.0.1 port 8000 URL http://127.0.0.1:8000/ 127.0.0.1 - - [21/5月/2022:10:01:32 +0900] "GET / HTTP/1.1" 200 - 127.0.0.1 - - [21/5月/2022:10:01:33 +0900] "GET /favicon.ico HTTP/1.1" 404 -
webブラウザ(たとえばFirefoxなど)で、アドレスバーに http://127.0.0.1:8000/ を入力してアクセスすれば、(windowsの場合と同様に)ホームフォルダの内容があります。
dnf や apt を使う入手経路の場合編集
パッケージマネージャ(dnf や apt など)によってディストリビューションなどがインストールしてくれる jdk を使う場合、
- 事前の準備
なお、Fedora で dnf コマンドで openjdk-18 を探す場合、
sudo dnf reinstall java-latest-openjdk
または
sudo dnf install jave-18
で見つかります。
なお dnf install jave-latest (不可)では見つかりません。(java-latest-openjdk がインストールされるにもかかわらず。)
インストールできたら、
sudo alternatives --config java
で、java-18 以降に、使用するjavaを切り替えます。
- コマンド
java --module jdk.httpserver
でも可能です(Fedora 36 で確認)。
実行結果
[ユーザー名@fedora ~]$ java --module jdk.httpserver Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::". Serving /home/ユーザー名 and subdirectories on 127.0.0.1 port 8000 URL http://127.0.0.1:8000/ 127.0.0.1 - - [21/5月/2022:10:13:35 +0900] "GET / HTTP/1.1" 200 -
アドレスバーに http://127.0.0.1:8000/ を入力してアクセスすれば、(windowsの場合と同様に)ホームフォルダの内容があります。
レコード型編集
Java16でrecord型追加された[3]。レコードという名前のとおり、インスタンス作成時の一度しか書き換えをしない記録を書くためのものである。
クラスを用いても同じ動作のものを作れるが、レコード型を使うことによりコード量が短くなるし、意図も明確になる等、利点がある。
- コード例
- sample.java
class sample { public static void main(String[] args) { record Person(String name, int year) {} var a = new Person("Tom", 13); System.out.println(a.name()); // Tom System.out.println(a.year()); // 13 System.out.println(a); // Person[name=Tom, year=13] var b = new Person("John", 15); System.out.println(b.name); // John System.out.println(b.year); // 15 System.out.println(b); // Person[name=John, year=15] } }
- 実行結果
Tom 13 Person[name=Tom, year=13] John 15 Person[name=John, year=15]
- レコード定義
record Person(String name, int year) {}
は、次の標準クラスと同等です
public final class Person { private final String name; private final int year; public Person(String name, int year) { this.name = name; this.year = year; } String name() { return this.name; } int year() { return this.year; } // equals() と hashCode() を実装し、2つのレコードオブジェクトが同じ型であり、 // 同じフィールド値を含む場合、等しいことを指定する。 public boolean equals... public int hashCode... // toString() の実装で、レコードクラスのすべてのフィールドの名前と文字列表現を返す。 public String toString() {...} }
インスタンスの作成の際には上記コードのようにfinal var a
のようにfinal修飾子をつけなくても、record型のインスタンスを作成する際は自動的にそのインスタンスがfinal になり、書き換え不能になる。
なお、final var a = new Person("Tom", 13);
のようにfinal をつけてインスタンスを作成しても、正常に動く(結果は上記と同じ)。
用語集編集
- abstract(抽象)
- インスタンスを作成できない抽象クラスや抽象メソッドを定義するための修飾子。
- annotation(アノテーション)
- ソースコードにメタデータを追加するための機能。
- Array(配列)
- 同じ型の複数の要素を保持するためのデータ構造。
- ArrayList(動的配列)
- 可変長配列を実現するためのクラス。
- assert(アサート)
- 条件が正しいことをチェックするために使用されるキーワード。
- binary operator(二項演算子)
- 2つのオペランドを持つ演算子。
- boolean(論理値)
- 2つの値、trueまたはfalse、を持つデータ型。
- break(ブレーク)
- ループやswitch文から抜け出すためのキーワード。
- byte(バイト)
- 8ビットの符号付整数型のデータ型。
- case(ケース)
- switch文内で、評価式の値と一致する場合に実行されるブロック。
- catch(キャッチ)
- tryブロック内で発生した例外を処理するためのブロック。
- char(文字)
- 16ビットUnicode文字のデータ型。
- class(クラス)
- データとその操作を定義するための構造体。
- class variable(クラス変数)
- クラスのすべてのインスタンスで共有される変数。
- compiler(コンパイラ)
- ソースコードを機械語に変換するプログラム。
- constructor(コンストラクタ)
- オブジェクトを作成する際に呼び出されるメソッド。
- continue(コンティニュー)
- ループ内で次の反復処理に進むためのキーワード。
- do-while(do-while文)
- 条件式がfalseでない限り、ブロックを実行し続けるループ。
- double(倍精度浮動小数点数)
- 64ビットの浮動小数点数のデータ型。
- encapsulation(カプセル化)
- データとそれに対する操作をまとめ、外部からのアクセスを制限する機能。
- enhanced for loop(拡張forループ)
- 配列やコレクションの要素に対して繰り返し処理を行うための簡潔な構文。
- enum(列挙型)
- 一連の定数を表すための特殊なクラス。
- exception(例外)
- プログラムの実行中に発生するエラーを表すオブジェクト。
- extends(継承)
- クラスの継承に使用されるJavaのキーワード。
- final(最終)
- フィールド、メソッド、またはクラスに修飾子として付けられ、値の変更やオーバーライドを禁止する。
- finally(最後に)
- 例外処理ブロックの一部で、必ず実行されるコードを指定するために使用されるキーワード。
- float(浮動小数点数)
- 単精度浮動小数点数を表すJavaのプリミティブ型。
- for(forループ)
- 指定された回数または条件に基づいて、コードブロックを反復的に実行するために使用されるキーワード。
- foreach(拡張forループ)
- 配列またはコレクションに対して、簡単な反復処理を行うために使用されるJavaの構文。
- generic(ジェネリック)
- クラスやメソッドにパラメーターを追加し、異なるデータ型のオブジェクトを扱う汎用的なプログラミングの機能。
- getter(ゲッター)
- クラスのインスタンス変数の値を取得するためのメソッド。
- if-else(条件分岐)
- 条件が真の場合に1つのコードブロックを実行し、そうでない場合に別のコードブロックを実行するために使用されるJavaの構文。
- implements(実装)
- インターフェイスを実装するクラスに使用されるキーワード。
- import(インポート)
- 別のパッケージ内のクラスを使用するために、Javaに外部クラスを取り込むためのキーワード。
- instance variable(インスタンス変数)
- クラスのインスタンスの一部であり、オブジェクトの特定の状態を保持するために使用される変数。
- int(整数)
- 32ビットの整数を表すJavaのプリミティブ型。
- interface(インターフェイス)
- クラスのメソッドの集合であり、実装クラスによって実装されることを想定している。
- jar(JARファイル)
- Javaアプリケーションをパッケージ化するための標準的な形式のアーカイブファイル。
- java keyword(Javaのキーワード)
- Javaの構文で特別な意味を持つ予約語。
- java runtime environment(JRE)
- Javaアプリケーションを実行するためのランタイム環境。
- JDK
- Java開発キット。Java開発に必要なツール、コンパイラ、デバッガ、API、ドキュメントが含まれる。
- JRE
- Javaランタイム環境。Javaアプリケーションを実行するための環境。
- JVM
- Java仮想マシン。Javaアプリケーションを実行するための仮想コンピュータ。
- lambda expression
- Java 8で導入された無名関数の一種。
- long
- Javaのデータ型の一つで、64ビットの符号付き整数を表す。
- method
- クラス内で実行されるコードブロックのこと。
- modifier
- クラス、メソッド、変数などの属性を変更するために使用されるキーワード。
- new
- オブジェクトのインスタンスを作成するためのキーワード。
- null
- オブジェクトが存在しないことを示す値。
- NumberFormatException
- 文字列を数値に変換しようとした際に、文字列が数値に変換できない場合にスローされる例外。
- object
- データやメソッドを持つインスタンス。
- Object-Oriented Programming
- オブジェクト指向プログラミング。クラス、オブジェクト、継承、ポリモーフィズムなどを利用してプログラムを設計する方法。
- operator
- 演算子。算術演算子、比較演算子、論理演算子などがある。
- package
- クラスやインターフェースをグループ化するための仕組み。
- private
- クラスの外部からアクセスできないアクセス修飾子。
- protected
- サブクラスからのみアクセス可能なアクセス修飾子。
- public
- 全てのクラスからアクセス可能なアクセス修飾子。
- return
- メソッドから値を返すために使用されるキーワード。
- short
- Javaのデータ型の一つで、16ビットの符号付き整数を表す。
- static
- クラスレベルの変数やメソッドに使用される修飾子。
- String
- 文字列を表すクラス。
- super
- スーパークラスのインスタンスを参照するためのキーワード。
- switch
- 複数の条件分岐をまとめて表現するためのキーワード。
- synchronized
- (同期化) スレッド間で共有されるオブジェクトに対して、1つのスレッドが実行しているときは、他のスレッドが同時にそのオブジェクトにアクセスできないようにするためのキーワードです。
- this
- (this) オブジェクト自身を参照するためのキーワードです。
- throw
- (例外を投げる) メソッド内で明示的に例外を投げるために使用されるキーワードです。
- throws
- (例外をスローする) メソッドが例外を投げる可能性があることを示すために使用されるキーワードです。
- transient
- (一時的) シリアル化されたオブジェクトの一部でないことを示すために使用されるキーワードです。
- try-catch
- (例外処理) 例外が発生する可能性があるブロック内で、例外を捕捉して処理するための構文です。
- void
- (無効) 戻り値を返さないメソッドを定義するためのキーワードです。
- volatile
- (揮発性) 変数の値が、複数のスレッドから同時にアクセスされる可能性があることを示すために使用されるキーワードです。
- while
- (ループ) 条件が true の場合、ブロックを繰り返し実行するためのループ構文です。
脚註編集
- ^ フレームは、タイトルとボーダーを持つトップレベルのウィンドウです。
- ^ よく似たwindowClosed メソッドは、ウィンドウがクローズされたときに呼び出されます。
- ^ “Record (Java SE 16 & JDK 16)” (2021年7月20日). 2022年7月1日閲覧。