Java/クイックツアー
Javaは、"Write once, run anywhere" (WORA、「一度(プログラムを)書けば、どこでも実行できる」)を謳い文句に登場しました。Javaで書かれたプログラムは、従来のプログラムとは違い、一度書けば、どんなOS(オペレーティングシステム)やCPUの上でも動かすことができる「プラットフォーム非依存」という特徴を持っています。まずは、そのJavaの特徴について説明します。
Javaの特徴[編集]
Javaは、オブジェクト指向プログラミング言語の1つであり、トップレベルのプログラム構造はクラスに基づいています。
以下は、JavaでHello Worldを印字する最も基本的な例です。
- HelloWorld.java
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } }
Javaのファイル名は、クラス名と同じ名前でなければなりません(拡張子は.javaです)。 上記の例では、ファイル名はHelloWorld.javaです。
Javaは、次のような特徴を持つプログラミング言語です。
- ポータビリティ: Javaは、プラットフォームに依存しない言語であり、コンパイルされたJavaコードはあらゆるプラットフォームで実行できます。つまり、同じJavaアプリケーションは、Windows、Mac、Linux、Androidなど、異なるオペレーティングシステム上で動作します。
- オブジェクト指向: Javaはクラスベースのオブジェクト指向プログラミング言語であり、クラス、オブジェクト、継承、ポリモーフィズム、カプセル化などの機能をサポートしています。
- 静的型付け言語: 静的型付けであるため、実行時のオブジェクトタイプが決定される前に型エラーがあるかどうかが検査されます。
- ガベージコレクション: Javaは自動ガベージコレクションをサポートしています。プログラマーはメモリ管理を手動で行う必要がなく、Java仮想マシンが不要なオブジェクトを自動的に削除します。
- 多言語サポート: Javaは、Java仮想マシンを介して多数のプログラミング言語をサポートします。このため、Javaで書かれたアプリケーションは、他のプログラミング言語で書かれたアプリケーションと相互運用できます。
- セキュリティ: Javaはセキュリティに優れた言語として知られています。Java仮想マシンが、実行時にアプリケーションを監視し、悪意のあるコードの実行を防止するためにセキュリティポリシーを適用します。
- マルチスレッド: Javaはマルチスレッドをサポートしています。これにより、複数のタスクを同時に実行でき、プログラムの効率が向上します。
- 例外処理: Javaは例外処理をサポートしています。
- 高性能: Javaは、JITコンパイラを使用してコンパイルされたコードを実行し、高速に実行できます。また、Javaは、メモリ管理における最適化にも優れています。
- 広範なライブラリ: Javaは、豊富なライブラリを提供しており、多くの用途に使えるようになっています。これにより、プログラマーはアプリケーションの開発を容易に行うことができます。
C/C++言語との違い[編集]
Javaはネットワークとの親和性が強いことから、Javaコンパイラには厳しいセキュリティチェックがかかっており、そう簡単には危険なプログラムを作ることができないようになっています。
Javaにある多くの機能が、C/C++からの影響を受けています。そのため、Javaは文法がC/C++に非常に似ています。しかし、それと同時に、C/C++では危険とされる様々なものを除去し、欠点を改良してJavaが開発されました。
以下にC、C++、Javaの主要な違いを表形式で示します。
項目 | C言語 | C++ | Java |
---|---|---|---|
クラス | なし | あり | あり |
オブジェクト指向 | なし | あり | あり |
継承 | なし | あり | あり |
ジェネリック | なし | あり テンプレート |
あり |
ポインタ | あり | あり | なし |
メモリ管理 | 手動 | 手動 RAIIによる自動管理も可能 |
自動 |
例外処理 | なし | あり | あり |
マルチスレッド | 手動 | 自動 スレッドライブラリC++11 |
自動 スレッドライブラリ |
ポインタ[編集]
Javaには、C言語やC++などのようなポインタはありません。
Javaには、C言語やC++などのようなポインタは存在しないため、明示的なポインタの操作や機能は提供されていません。しかし、Javaには、オブジェクトへの参照があります。
Javaのオブジェクトへの参照は、実際にはポインタに似たものですが、厳密には異なります。Javaでは、オブジェクトを参照する変数はオブジェクトのアドレスではなく、オブジェクト自体を参照しています。
Javaには、オブジェクトへの参照を操作するための様々な機能が用意されています。例えば、オブジェクトのインスタンス変数にアクセスするための.
演算子、オブジェクトのメソッドを呼び出すための.
演算子、オブジェクトのコピーを作成するためのclone
メソッドなどがあります。
Javaのオブジェクト参照は、C言語のポインタに似ているが、Javaのオブジェクト参照は安全であり、ポインタ演算は存在しないため、メモリの安全性が保たれています。
NullPointerException |
NullPointerExceptionは、Javaプログラムにおいて最も一般的な例外の一つであり、参照されたオブジェクトがnullである場合にスローされます。
以下は、NullPointerExceptionを発生させる可能性があるコードの例です。
このようなエラーが発生した場合、デバッグ情報を取得することができます。例えば、どの変数がnullか、どの行でエラーが発生したかなどを確認することができます。そのためには、エラーメッセージに従い、デバッグツールを使用して原因を特定することが重要です。 NullPointerExceptionを回避するためには、変数を使用する前に必ず初期化すること、またはnullチェックを行うことが必要です。以下のようなコードがその例です。
以上のような方法を使用することで、NullPointerExceptionを回避することができます。 以下は、NullPointerExceptionを処理するためのコードの例です。
上記の例では、try-catch文を使用して、NullPointerExceptionをキャッチしています。NullPointerExceptionが発生した場合、catchブロックが実行され、エラーメッセージが表示されます。また、e.printStackTrace()メソッドを使用することで、スタックトレースも表示されます。 |
配列[編集]
Javaの配列は、同じ型の要素を複数格納するために使用されるデータ構造です。以下に、Javaの配列に関する利点、欠点、例外、エラー、およびプログラム例を示します。
- 利点
- メモリの効率的な使用:Javaの配列は連続したメモリブロックに格納されるため、データのアクセスや変更が高速であり、メモリの使用が効率的です。
- 要素のアクセスが簡単:インデックスを使用して配列内の要素にアクセスできるため、要素の検索や変更が簡単です。
- 多次元配列のサポート:Javaの配列は多次元配列をサポートしており、2次元配列や3次元配列など、複雑なデータ構造を表現することができます。
- 欠点
- 配列のサイズが固定:Javaの配列は静的なデータ構造であるため、配列のサイズを宣言時に決定する必要があります。サイズが変更されることはできません。
- 例外
- ArrayIndexOutOfBoundsException:配列のサイズを超えた範囲のインデックスにアクセスしようとすると、この例外が発生します。
- NullPointerException:配列が null である場合に要素にアクセスしようとすると、この例外が発生します。
- エラー
- OutOfMemoryError:Javaの配列はメモリ上に格納されるため、メモリ不足によりこのエラーが発生する場合があります。
- プログラム例
以下は、Javaの配列を使用した簡単なプログラム例です。
// int型の配列を宣言し、初期値を設定する int [] numbers = {2, 3, 5, 7, 11}; // 配列の要素数を取得する final var length = numbers.length; // 配列の各要素を表示する for (var i = 0; i < length; i++) { System.out.println(numbers[i]); } // 配列の各要素を2倍する for (var i = 0; i < numbers.length; i++) { numbers[i] *= 2; } // 配列の各要素を出力する for (var number : numbers) { System.out.println(number); } // 2次元配列を宣言し、初期値を設定する int[][] matrix = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} }; // 2次元配列の各要素を表示する for (var i = 0; i < matrix.length; i++) { for (var j = 0; j < matrix[i].length; j++) { System.out.print(matrix[i][j] + " "); } System.out.println(); } // 2次元配列の各要素を表示する for (final var row : matrix) { for (final var x : row) { System.out.print(x + " "); } System.out.println(); }
最初に、int型の配列を宣言し、初期値を設定し、その長さを取得します。
次に、forループを使用して、配列の各要素を表示し、2倍にし、今度は拡張forループで出力します。
2次元配列では、3x3の行列を宣言し、初期化して、forループを使用して各要素を表示します。2次元配列の場合、ネストされたforループを使用して、行と列の両方を反復処理することができます。また、拡張forループを使用することもできます。最後に、各要素を表示するための改行を追加します。
ガベージコレクション[編集]
ガベージコレクションとは、Java仮想マシン(JVM)が不要なオブジェクトを自動的に解放する仕組みです。Javaは、メモリ管理について開発者に負担をかけることなく、プログラムを実行するために必要なメモリを動的に確保し、使用後に解放することができます。
Javaのガベージコレクションでは、JVMはJavaアプリケーションが生成したオブジェクトを追跡し、不要になったオブジェクトを特定して、それらを自動的に解放します。JVMは、オブジェクトの使用状況に応じて、ガベージコレクションを自動的に実行するため、プログラマーは明示的にメモリ管理を行う必要がありません。
Javaのガベージコレクションには、複数のアルゴリズムがあり、JVMは、各アルゴリズムの性能や負荷に応じて、最適なアルゴリズムを選択します。代表的なアルゴリズムには、マーク・アンド・スイープ、コピーコレクション、マーク・アンド・コンパクションなどがあります。
JVM言語[編集]
JVM (Java Virtual Machine)は、Javaプログラミング言語を含む多くの言語で使用されます。以下は、JVM言語の一覧です。
- Java: サン・マイクロシステムズによって開発され、JVM上で実行される最も一般的な言語であり、豊富な標準ライブラリがあります。
- Kotlin: JetBrainsによって開発された静的型付けのオブジェクト指向言語で、Javaとの相互運用性があります。
- Scala: オブジェクト指向言語で、Javaとの相互運用性があり、関数型プログラミングの概念をサポートしています。
- Groovy: Javaに似たシンタックスを持つ動的型付け言語で、Javaとの相互運用性があります。
- Clojure: 関数型言語で、Lispの方言の1つであり、Javaとの相互運用性があります。
- JRuby: Ruby言語のJVM実装であり、Javaとの相互運用性があります。
- Jython: Python言語のJVM実装であり、Javaとの相互運用性があります。
- Ceylon: 静的型付けのオブジェクト指向言語で、Javaとの相互運用性があります。
- Frege: Haskell言語のJVM実装であり、Javaとの相互運用性があります。
- Xtend: Javaのシンタックスを拡張した言語で、Javaとの相互運用性があります。
これらの言語は、JVMの高性能な実行環境を利用して、多くの場合、高速かつ安定した実行を提供します。
廃止された技術[編集]
- Applet:Java Appletは、WebブラウザでJavaアプリケーションを実行するための技術でしたが、廃止されました。
- JavaFX Script:JavaFX Scriptは、JavaFXアプリケーションを記述するためのスクリプト言語でしたが、JavaFX 2.0で廃止され、JavaFXアプリケーションはJava言語で記述されるようになりました。
- Java Web Start:Java Web Startは、Javaアプリケーションを自動的にダウンロードして実行するための技術でしたが、Java 9で廃止され、代わりにJava Packagerとjlinkが提供されるようになりました。
- Java EE(Java Enterprise Edition):Java EEは、Javaを使用して企業向けのアプリケーションを構築するための技術でしたが、Java EE 8で最後のリリースが行われ、Java EEはEclipse Foundationに寄贈され、Jakarta EEとして独立したプロジェクトになりました。
- Java 9モジュールシステム:Java 9で導入されたモジュールシステムは、Javaアプリケーションのビルドとデプロイメントを改善するために設計されましたが、現在はJava 11以降のバージョンではまだ使用できますが、使い方に制限があり、多くの開発者によって受け入れられていません。