コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「Java」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Wresler (会話 | 投稿記録)
Javaプラットフォーム
(同じ利用者による、間の26版が非表示)
1行目: 1行目:
{{Otheruses|コンピューターのプログラミング言語およびプラットフォーム|その他|ジャバ}}
{{Otheruses|コンピューターのプログラミング言語およびプラットフォーム|その他|ジャバ}}
{{混同|JavaScript}}{{出典の明記| date = 2019年3月}}
{{混同|JavaScript}}{{出典の明記| date = 2019年3月}}{{未検証|section=1|date=2019年3月}}
{{Infobox プログラミング言語
{{Infobox プログラミング言語
| fetchwikidata = ALL
| fetchwikidata = ALL
10行目: 10行目:
| latest release date = {{release date|2020|01|14}}
| latest release date = {{release date|2020|01|14}}
| typing = 強い[[静的型付け]]
| typing = 強い[[静的型付け]]
| implementations = [[Javaプラットフォーム]]
| implementations = [[コンパイラ]]([[Java Development Kit|JDK]]、[[OpenJDK]]などの[[javac]]、[[GNU Compiler for Java|gcj]]など)、バイトコード[[インタプリタ]](JDK、JRE、{{仮リンク|Microsoft Java Virtual Machine|en|Microsoft Java Virtual Machine|label=MSJVM}}、OpenJDKなど多数)
| influenced = [[C Sharp|C#]], [[D言語|D]], [[Dart]], [[Groovy]], [[Scala]], [[Kotlin]], [[Ceylon]]
| influenced = [[C Sharp|C#]], [[D言語|D]], [[Dart]], [[Groovy]], [[Scala]], [[Kotlin]], [[Ceylon]]
| operating system = [[Solaris]], [[Linux]], [[Microsoft Windows|Windows]],<br>[[macOS]], [[AIX]], [[i5/OS|System i]],<br>各種の[[組み込みシステム]]ほか多数
| operating system = [[Solaris]], [[Linux]], [[Microsoft Windows|Windows]],<br>[[macOS]], [[AIX]], [[i5/OS|System i]],<br>Embedded Systems
| license = [[GNU General Public License]]、[[Java Community Process]]
| license = [[GNU General Public License]]、[[Java Community Process]]
| website = {{ConditionalURL}}
| website = {{ConditionalURL}}
18行目: 18行目:
}}
}}
{{プログラミング言語}}
{{プログラミング言語}}
'''Java'''(ジャバ)はコンピュータの[[プログラミング言語]]の一種。Javaを用いて作成されたプログラムの実行環境[[プラットフォーム (コンピューティング)|プラットフォーム]]意味る場合もある<ref>{{Cite web|url=https://www.java.com/en/download/faq/whatis_java.xml |title=What is Java and why do I need it? |language=en |accessdate=2019-02-04}}</ref>。
'''Java'''(ジャバ)はプログラミング言語Javaと、Javaプログラムの実行環境および開発環境を合わせた演算[[プラットフォーム (コンピューティング)|プラットフォーム]]の双方総称である<ref>{{Cite web|url=https://www.java.com/en/download/faq/whatis_java.xml |title=What is Java and why do I need it? |language=en |accessdate=2019-02-04}}</ref>。


企業の業務システムの構築などのほか、[[ブルーレイディスクコーー]]をはじめとする[[家電]]への組み込み用途など、幅広い用途で使用される。
Javaソフトウェアは、企業システムの構築のほか、家電機器および乗用車搭載の[[組み込みシテム]]、産業機械の[[マイントローラ|マイクロ制御装置]]、各種[[モバイル端末]]、[[スマトカ]][[サーバー (コンピューター)|サーバーマシン]]、パーソナルコンピュータ、スマートフォンなどの様々な環境に普及しており、幅広い用途で使用されている。


Java言語は、近年のグローバルな[[機械学習]]の需要増加により世界シェアで[[Python]]には抜かれたが、システム開発では依然信頼されている言語であり、世界シェア2位の座を保っている<ref>{{Cite web|title=PYPL PopularitY of Programming Language index|url=http://pypl.github.io/PYPL.html|website=pypl.github.io|accessdate=2019-10-19|language=en}}</ref>。
== 概要 ==
Java言語は[[C++]]<!-- C言語ではない。 -->に類似した構文のプログラミング言語であり、[[オブジェクト指向]]が主要[[プログラミングパラダイム|パラダイム]]として導入されている。

Javaは、従来のソフトウェアが抱えていた[[移植性]]問題の解決を図り、特定の環境に依存しない理想的な[[クロスプラットフォーム]]・プログラムの実現を目指して開発された。Javaソフトウェアは、家電機器や乗用車の[[組み込みシステム]]から、[[マイクロコントローラ|マイクロ制御装置]]、[[携帯機器]]、[[パーソナルコンピュータ]]、[[サーバー (コンピューター)|サーバーマシン]]、[[スマートカード]]、スマートフォンといった様々な環境に普及している。

Javaは、1995年に[[サン・マイクロシステムズ]]によって公開された。2010年にサンは[[オラクル (企業)|オラクル]]に吸収合併され、Javaの各種権利もオラクルに移行した。おおよそ数年おきに言語仕様の改訂が重ねられており、2019年4月現在の最新メジャーバージョンは、2019年3月19日に公開された第12版となっている。

世界的な[[機械学習]]の需要増加があり、世界シェアで[[Python]]には抜かれたが、システム開発では信頼されている言語であり、世界シェア2位の座を保っている<ref>{{Cite web|title=PYPL PopularitY of Programming Language index|url=http://pypl.github.io/PYPL.html|website=pypl.github.io|accessdate=2019-10-19|language=en}}</ref>。


== Javaの特徴 ==
== Javaの特徴 ==

=== Oracleによる主張 ===
Java開発元のSun Microsystemsを買収し、Java開発を引き継いだ[[オラクル (企業)|Oracle]]による公式な主張は下記である<ref name=":0">{{Cite web|title=Java Software {{!}} Oracle|url=https://www.oracle.com/java/|website=www.oracle.com|accessdate=2019-10-19}}</ref>。企業内システムの開発に最適であるとしている。
Java開発元のSun Microsystemsを買収し、Java開発を引き継いだ[[オラクル (企業)|Oracle]]による公式な主張は下記である<ref name=":0">{{Cite web|title=Java Software {{!}} Oracle|url=https://www.oracle.com/java/|website=www.oracle.com|accessdate=2019-10-19}}</ref>。企業内システムの開発に最適であるとしている。
{{Quotation|Java reduces costs, shortens developer timeframes, drives innovation, and improves application services as the programming language of choice for enterprise architecture, finance, and HR. Java is used in many industries including manufacturing, automotive, insurance, and public sector.
{{Quotation|Java reduces costs, shortens developer timeframes, drives innovation, and improves application services as the programming language of choice for enterprise architecture, finance, and HR. Java is used in many industries including manufacturing, automotive, insurance, and public sector.


Javaは、コストを削減し、開発者の時間枠を短縮し、イノベーションを促進し、エンタープライズアーキテクチャ、財務、およびHRに最適なプログラミング言語としてアプリケーションサービスを改善します。 Javaは、製造、自動車、保険、公共部門などの多くの業界で使用されています。}}また、全世界では、3億のデバイスで動作し、1200万人が開発で使用し、250億の[[Java Card]](Javaアプリケーションが動作する[[ICカード|スマートカード]])が購入されていると発表している<ref name=":0" />。
Javaは、コストを削減し、開発者の時間枠を短縮し、イノベーションを促進し、エンタープライズアーキテクチャ、財務、およびHRに最適なプログラミング言語としてアプリケーションサービスを改善します。 Javaは、製造、自動車、保険、公共部門などの多くの業界で使用されています。}}また、全世界では、3億のデバイスで動作し、1200万人が開発で使用し、250億の[[Java Card]](Javaアプリケーションが動作する[[ICカード|スマートカード]])が購入されていると発表している<ref name=":0" />。

=== Javaの構文 ===
{{main|Javaの文法}}Javaプログラムの構文は、[[C言語]]または[[C++]]によく似たものである。オブジェクト指向言語としての一面が強調されがちだが、幾つかの構文ルールの違いを除いては、C言語とほぼ同様にシンプルな[[手続き型プログラミング]]のスタイルでもプログラミングできる。Javaはオブジェクト指向のプログラミングスタイルをそれほど強制しない。


=== オブジェクト指向 ===
=== オブジェクト指向 ===
Javaの主要プログラミングパラダイムは、[[クラスベース]]の[[オブジェクト指向プログラミング言語|オブジェクト指向]]である<ref>広辞苑 第六版</ref>。オブジェクト指向にある複数の実装スタイルの一つであるクラスベースは、手続き型プログラミングを土台にして実践できる比較的万人向けのものである。クラスベース・オブジェクト指向はその名の通り[[クラス (コンピュータ)|クラス]]の仕組みを中心にする。クラスは任意のフィールド(=変数)と任意のメソッド(=関数)をひとまとめにしたものである。クラスのデザインはフィールド構成を中心にして、それに関連したメソッドを備えるのが基本とされる。クラス定義内の要素はフィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラスの六種類である。内部クラスはクラス内で定義される入れ子のクラスであり、コンポジションパターンの実装が主な用途になる。メソッド内部で任意のクラスを派生元にした無名クラスを定義する事もできる。これは[[プロトタイプベース]]・オブジェクト指向のスタイルを取り入れたもので、その場限りのクラスをコードに組み込める利便性の高い機能である。クラスの定義文には上述のフィールド名やメソッド文などの要素がずらずらと羅列される。Javaのプログラムは、この1個以上のクラス定義文を組み合わせて形成される。Javaはクラスベース・オブジェクト指向の三つの要点とされる[[カプセル化]]、[[継承 (プログラミング)|継承]]、[[ポリモーフィズム|多態性]]をサポートしている。
Javaは[[クラスベース]]の[[オブジェクト指向プログラミング言語]]である<ref>広辞苑 第六版</ref>。[[オブジェクト指向]]とは、現実世界をモデル化する手法のひとつであり、データ(状態)とそれに関連する振る舞い(処理)をまとめて[[オブジェクト (プログラミング)|オブジェクト]](物体)として扱う。


Javaのカプセル化は、クラス定義文に記述する四つのアクセス修飾子(''private''、''package''、''protected''、''public'')によってサポートされている。アクセス修飾子はフィールド定義とメソッド定義のそれぞれ先頭に記されて可視性を決定する。''private''は同クラス内限定、''package''は同クラス内と同パッケージ内限定、''protected''は同クラス内と同パッケージ内と派生クラス内限定、''public''はどこからでもアクセス可能を意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性はOOPでは変則的なファイル単位の''package''なので隠蔽性よりも利便性が重視されている。
Javaのプログラムは通常複数の[[クラス (コンピュータ)|クラス]]から構成される。[[オブジェクト指向]]におけるクラスとは、オブジェクトの設計図にあたるものである。各クラスから実体化した[[オブジェクト (プログラミング)|オブジェクト]]はインスタンスと呼ばれる。クラスは再利用可能なソフトウェア部品の単位としてよく使われる。Javaのクラスは[[カプセル化]]・[[継承 (プログラミング)|継承]]・[[ポリモーフィズム]]をサポートする。


Javaの継承は、スーパークラスが一つに限られる単一継承をサポートしており、多重継承は除外されている。継承用のアクセス修飾子は無く''public''継承に統一されている。継承によって既存クラスの設計を引き継ぎつつ任意のフィールドとメソッドを追加した独自のクラスを作成できる。また既存とオリジナルの全てのクラスは、基礎APIで用意されているObjectクラスを継承最上位の基底クラスにするのが強制されている。Objectクラスにはロック機能が備えられているのでオブジェクト指向とマルチスレッド同期の調和に一役買っている。
Javaでは、クラスに定義する状態を「[[フィールド (計算機科学)|フィールド]]」([[インスタンス変数]])と呼び、振る舞いを「[[メソッド (計算機科学)|メソッド]]」と呼ぶ。それぞれ、[[C++]]で「メンバー変数」「メンバー関数」と呼ばれているものに相当する。なおJavaのオブジェクト指向は、[[Smalltalk]]に代表されるような[[メッセージパッシング]]によるオブジェクト指向ではなく、C++に代表されるようなクラス機構を中心としたオブジェクト指向である。後者は、限られた計算機資源でもオブジェクト指向を実現できるというメリットがある。

[[継承 (プログラミング)|継承]]とは、既存のクラスを基にして、そのクラスの機能を引き継いだ新しいクラスを定義できることをいう。継承は拡張とも呼ばれ、Javaのクラス構文では継承の際に<code>extends</code>キーワードが使われる。Javaのクラスはすべて、暗黙的に基底クラス{{Javadoc:SE|name=java.lang.Object|java/lang|Object}}から派生する。また、C++のような実装の[[多重継承]]はサポートせず、単一継承のみをサポートする。ただし、クラスは複数の[[インタフェース (抽象型)|インタフェース]]を実装 (<code>implements</code>) することができる。Javaのインタフェースは、C++では純粋仮想関数のみを持つクラスに相当し、実装を持たない型である<ref group="注釈">実装の多重継承をサポートせず、インタフェースにより型の多重継承のみをサポートするという設計思想は、後発の[[C Sharp|C#]]などでも採用されている。</ref>。ただし、Java 8以降はインタフェースのデフォルトメソッドにより、実装の多重継承も限定的にサポートするようになった。

Javaで扱うデータ / オブジェクトの型([[データ型]])は、強い[[静的型付け]]を採用している。静的型付けにより、Javaの[[コンパイラ]]および実行環境が、型同士の整合性を検査することによって、プログラムが正しく記述されていることや、安全に動作することの検証が可能である。

Javaのデータ型には、大別して[[参照 (情報工学)|参照]]型 (reference type) と[[プリミティブ型]](原始型、primitive type)の2種類がある。Javaのオブジェクトはすべて参照型である。一方、Javaのプリミティブ型はオブジェクトではなく、単純な構造のデータ(数値、論理値、文字など)を扱うための型である。[[Javaクラスライブラリ|Javaの標準ライブラリ]]は、[[ボックス化]]によりプリミティブ型の値をオブジェクトとして扱えるようにするための[[プリミティブラッパークラス]]を提供している。

* Java 1.5 (J2SE 5.0) 以降は、コンパイラが自動的にプリミティブ型のデータとそれに対応する参照型([[プリミティブラッパークラス]])のオブジェクトとの間の変換を行う。これを自動ボックス化/自動ボックス化解除([[オートボクシング]]/オートアンボクシング)と呼ぶ。これにより、プリミティブ型と対応する参照型の2種類のデータ型が存在することによる複雑さや煩雑さは軽減されているが、性能面での変化はない。
* Java 1.5以降は、[[総称型]]による[[ジェネリックプログラミング]]をサポートするようになった。これにより、プログラマによる明示的な[[型変換]]を減らすことができ、安全性が向上した。

JavaはC++と違って名前空間レベルのフリー関数(グローバル関数)および[[グローバル変数]]の定義を許可しておらず、必ず何らかのクラス定義の中にメソッドとフィールドを記述することが特徴である。Java 1.5では、メソッドとフィールドの静的インポートをサポートするようになり、クラス修飾なしで静的メンバーを利用できるようになった。しかし静的インポートを不用意に使うとソースコードを判読困難にしてしまう可能性があるため、利用する際のガイドラインが公開されている<ref>[https://docs.oracle.com/javase/jp/1.5.0/guide/language/static-import.html static のインポート]</ref>。

なお、Javaは純粋なオブジェクト指向言語ではなく、オブジェクト指向を強制しない<ref>{{Cite web|url=https://www.ibm.com/developerworks/jp/java/tutorials/j-introtojava1/index.html |title=Javaプログラミング入門, 第 1 回: Java 言語の基本 |language=ja-jp |accessdate=2019-02-05}}</ref>。すべてのデータおよび処理は何らかのクラスに属していなければならないという制約はあるが、静的フィールド、静的メソッド、静的インポートなどを使うことで、必要に応じて手続き型プログラミングのスタイルをとることも可能であり、オブジェクト指向プログラミングのスタイルを採用するかどうかはプログラマの裁量にゆだねられている。

Java 1.1で追加された[[リフレクション (情報工学)|リフレクション]]は、動作中のJava仮想マシン内のクラスやオブジェクトに関するイントロスペクションをサポートする、小規模で、型が保証されたAPIを提供する<ref>[https://docs.oracle.com/javase/jp/1.5.0/guide/reflection/spec/java-reflection.doc.html Java Core Reflection | Oracle]</ref>。セキュリティポリシーで認められる場合、クラスおよびクラスのメンバーの名前を文字列によって動的に指定して利用することができる。用途としては、アプリケーションの外部拡張性、クラスブラウザやビジュアル開発環境、デバッガーやテストツールなどの実現を想定されている。リフレクションは強力だが、パフォーマンス上のオーバーヘッドやセキュリティリスク、内部状態の公開を伴うため、不用意に使うべきではないとされている<ref>[https://docs.oracle.com/javase/tutorial/reflect/ Trail: The Reflection API (The Java™ Tutorials)]</ref>。


Javaの多態性は、インターフェースと仮想関数を中心にしてサポートされている。親クラスの定義文で''virtual''指定されたメソドが仮想関数を表す抽象メソッドになり、その子クラスの定義文で処理内容を記述された同名のメソッドが仮想関数のプロセスを表す実装メソッドになる。Javaは強い[[静的型付け]]と共に安全な[[動的型付け]]も採用しており、''instanceof''演算子による型審査と、''(typename)''によるダウンキャストの二つがそれにあたる。ダウンキャスト失敗時は例外発生によってフォローされる。両者とも実行時決定でありデータの遅延バインディングをサポートしている。Javaの中でも比較的重視されている[[インタフェース (抽象型)|インターフェース]]は抽象メソッドだけで構成される純粋抽象クラスであり、クラス定義文の''implements''によって任意の数だけ実装指定できる。インターフェースは各クラスの様々な動作局面表現を促して設計を明確にする。Javaには[[リフレクション (情報工学)|リフレクション]]も導入されている。これはクラスの構造内容を操作できる機能であり、Javaの理念である堅牢性とセキュリティを壊しかねない危うさを伴うが、[[分散コンピューティング]]の発展などを視野に入れたJavaテクノロジの拡張に不可欠とされて専用APIが用意された。リフレクションはメッセージベース・オブジェクト指向のスタイルに近い柔軟な多態性の動的ディスパッチを実装できる他、Javaプログラムの為のメタ的なモニタリングツールおよびフレームワークの構築などが主な用途になる。
=== プラットフォーム非依存 ===
=== プラットフォーム非依存 ===
[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaプログラムが特定のハードウェアおよびオペレーティングシステムの機能に依存する事なく、Java実行環境が導入されたあらゆるコンピューター環境上において共通した動作を見せる事を意味する。”''Write once, run anywhere''”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)がそのスローガンとされていた。Javaのプラットフォーム非依存性は次のようにして実現されている。
[[ファイル:GC SwingDemo.jpg|thumb|250px|Java [[Swing]][[グラフィカルユーザインタフェース]] (GUI) の[[Look and feel|ルックアンドフィール]]は、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない]]
<!--
[[画像:SwingSet.png|thumb|Java [[Swing]][[グラフィカルユーザインタフェース]] (GUI) の[[Look and feel|ルックアンドフィール]]は、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない]]
-->
Javaでは[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存を目標の一つとし<ref>広辞苑 第六版</ref>、またバージョン間の[[互換性]]に注意して開発が進められている。プラットフォームに依存しない(Javaプラットフォーム自体を除く)[[アプリケーションソフトウェア]]の開発と配備を行うことができると主張される。従来の[[プログラミング言語]]の多くはプラットフォーム([[CPU]])に依存したネイティブなコードに[[コンパイラ|コンパイル]]することを前提として設計されていたが、Javaはこうした言語と異なり、[[中間言語]]([[バイトコード]])にコンパイルされ、[[Java仮想マシン]]で実行されるよう設計された。性能向上のため、Java仮想マシンの成熟した実装では多くの場合、[[ジャストインタイムコンパイル方式]]が使われる。プラットフォーム非依存とバージョン間の互換性の目標は、完全に達成できたわけではなく課題が残っている。


#[[Javaコンパイラ]]は、Javaプログラムのソースコードを、[[Javaバイトコード]]と呼ばれる[[中間表現]]にコンパイルする。Javaバイトコードはアセンブラのニーモニックに似たもので、[[Java仮想マシン]]上で実行される専用のコードになる。Javaバイトコードは多くのプラットフォームでは、[[Javaクラスファイル]]と呼ばれるclass拡張子のファイルにまとめられる。
[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaの[[プログラム (コンピュータ)|プログラム]]がさまざまな[[ハードウェア]]や[[オペレーティングシステム]]上で必ず同じように動く、ということを意味する。一度Javaのプログラムを作成すれば、そのプログラムはどのプラットフォーム上でも動くのである。
#[[Java仮想マシン]]は、各プラットフォームの環境の違いを吸収するクッション的なソフトウェアである。Java仮想マシンは家電や車両搭載のマイクロコントローラ、モバイル端末、ICカード、サーバーマシンなどの様々なコンピューター環境に対応したバージョンが提供されており、それぞれのプラットフォームにJava実行環境のコアテクノロジとしてインストールされる。
#[[Java仮想マシン]]は、指定された[[Javaクラスファイル]]を[[Javaクラスローダー]]で読み込み、その中の[[Javaバイトコード]]を逐一解釈しながら実行する。これはインタプリタ式に行うものと、[[実行時コンパイラ]]で走行させるものがある。


公開初期のインタプリタ式のみで走行されるJavaプログラムの実行速度は遅かったが、実行時コンパイラ方式の導入によって速度問題に一定の解決が見られた。実行時コンパイラとは一定範囲のJavaバイトコードをまとめて機械語コードにコンパイルして継続的に実行させる技術である。後にそのコンパイル処理を更に最適化した動的再コンパイル(''dynamic recompilation'')という拡張技術も導入され、Javaプログラムの実行速度問題はほぼ解決されたと見なされている。
Javaのプラットフォーム非依存性は、次のようにして実現されている。


=== マルチスレッド ===
* ほとんどのJavaの[[コンパイラ]]([[Javaコンパイラ]])は、Javaの[[ソースコード]]を中間言語([[中間表現]])に[[コンパイル]]する。このJavaの中間言語のコードを[[バイトコード]]という。バイトコードは[[Java仮想マシン]](Java VM、[[仮想機械|仮想マシン]]の一種)で実行可能な簡潔な[[機械語]]命令からなる。
Javaプログラムは複数のスレッドを同時に走らせる事ができる。多数のスレッドを扱う大規模システムにも対応できる各種設計を備えており、その一つであるスレッドグループは、各スレッドを役割や性質でグループ化して様々な一括操作を可能にしている。これはクライアント・サーバーシステムの実装でよく用いられる。また膨大な数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成と破棄の繰り返しによる負荷増大を解決する為の、スレッドプールとタスクキューを併せたいわゆるモニタの技法を提供するAPIも用意されている。
* Javaプログラムを実行する際には、このバイトコードをJava仮想マシン上で実行する。Java仮想マシンは、実行するハードウェアにネイティブなソフトウェアであり、中間言語であるバイトコードを解釈して実行する。
* Java実行環境は、Java仮想マシンの他に、[[Javaクラスライブラリ|標準ライブラリ]]を備えている。この標準ライブラリを利用することにより、Javaプログラムは、グラフィクス、[[スレッド (コンピュータ)|スレッド]]、[[コンピュータネットワーク|ネットワーク]]など実行するマシンのさまざまな機能を、プラットフォームに依存しない単一の方法で使うことができるようになる。プラットフォームごとに異なる方法を使い分ける必要は無い。
* Javaのバイトコードの実行時には、Java仮想マシンにより、最終的にはハードウェアにネイティブな[[機械語]]コードに変換されて実行される。このバイトコードから機械語コードへの変換は、Java仮想マシンが[[インタプリタ]]として行う場合と、Java仮想マシンが[[ジャストインタイムコンパイル方式|ジャストインタイムコンパイラ]]を使って行う場合とがある。


マルチスレッド「同期」の特徴としては、前述のObjectクラスの基底継承強制により全てのインスタンスにロック機能を持たせている事が挙げられる。このロックは''synchronized''キーワードで示される標準同期構文で使用される。標準同期はJava仮想マシン内包仕様であり、機能的にはミューテックスに相当する。''synchronized''修飾子の各メソッドはその全体が排他制御エリアになり、その呼び出し時はthisインスタンスからロックをデフォルト取得するので、イメージ的にインスタンス単位になる排他制御を自然に表現している。このロック普遍化はオブジェクト指向との調和を実現する設計と言える。''synchronized''静的メソッドの方は、システム内に暗黙的に存在するクラスオブジェクトからロック取得を試みるので、これもイメージ的に同型インスタンス共通単位の排他制御を表現している。また、''synchronized()''定義子の波括弧でくくられた任意のコードブロックは、this以外のインスタンスもロックオブジェクトにできる排他制御エリアになるので、きめ細かな同期も表現できる。このミューテックス相当の標準同期は様々なロック手法にも応用可能であるが、実際にカウントセマフォやバリアや読み書きロックなどを再現しようとすると余計なワンステップを必要としがちなので、それらのロック手法は専用のAPIで用意されている。
また、実際には[[Javaコンパイラ]]の[[実装]]として、[[ソースコード]]から直接にプラットフォームのハードウェアにネイティブな[[オブジェクトファイル|オブジェクトコード]]([[機械語]]コード)を生成するものがある。このようなJavaコンパイラの実装としては[[GNUプロジェクト]]の[[GNU Compiler for Java]] (GCJ) などがある。この場合、バイトコードを生成するという段階は省かれる。しかしこの方法で生成されるJavaの実行コードは、コンパイル時に指定したプラットフォームでしか動かない。

Javaの実行コード([[バイトコード]])を生成する手段としては、[[プログラミング言語]]Javaでプログラムを書くことが標準的な方法である。Javaのバイトコードの実行は、[[Java仮想マシン]]という[[仮想機械|仮想マシン]]の環境上で行われる。Java仮想マシンは実行時にバイトコードをネイティブコードに変換する。なお、Javaのバイトコードを生成する他の手段としては、[[Ruby]]([[JRuby]])、[[Python]]([[Jython]])、[[Groovy]]、[[Scala]]、[[Kotlin]]、[[Ceylon]]、<!--[http://www.jabaco.org Jabaco]--><!-- Jabacoは2009年で更新が止まっており、ここで列挙するにはマイナーすぎる存在のためコメントアウト。 -->などのプログラミング言語でプログラムを書く方法もある。

[[サン・マイクロシステムズ]]のJavaのライセンスは、すべてのJava実行環境の実装は「[[互換性]]」を備えるべきであることを要求していた。このことに関連して、[[サン・マイクロシステムズ]]と[[マイクロソフト]]との間で法的な争いが起こったことがあった。この法的な争いは、サンが、マイクロソフトのJava実行環境の実装について次のように主張したことによる。
*[[Java Remote Method Invocation|RMI]]と[[Java Native Interface|JNI]]の機能が無い。
*マイクロソフトのプラットフォーム ([[Microsoft Windows|Windows]]) に特有の機能を備えている。
サンは訴訟を起こして勝訴し、約2000万ドルの違約金の支払いを受けた。また裁判所は、マイクロソフトに対してサンのライセンス条件に従うことを命じた。この決定を受けて、マイクロソフトは自社のOSであるWindowsにJava実行環境を同梱しない方針を採った。また{{いつ範囲|date=2019年2月|近年}}のバージョンのWindowsでは自社の[[ウェブブラウザ]]である[[Internet Explorer]]でJavaをサポートしないようにした。その結果、Internet Explorerで[[Javaアプレット]]を動かすためには、別途に[[プラグイン]]が必要となった。しかし、サンなどの企業は、Windowsのユーザが、無償でJava実行環境を利用できるようにした。そのため、ほとんどのWindows PCのユーザは、何ら問題なくウェブおよびデスクトップ上でJavaアプリケーションを実行できる。

最初期の[[Java Runtime Environment|Java実行環境]]の実装では、Javaプログラムの実行速度が遅かったが、Javaのバージョンアップに伴う仮想マシンの進歩により、高速に実行できるようになった。最初期のJava実行環境の[[Java仮想マシン]]の実装は、[[移植性]]を実現するために[[インタプリタ]]として動作する[[仮想機械|仮想マシン]]を採用した。こうした初期のJava実行環境の実装では、Javaプログラムの実行速度が[[C言語|C]]や[[C++]]のプログラムと比べて遅かった。そのため、Javaプログラムの実行速度は遅いという評判が広まっていた。

Javaプログラムを高速に実行するために使われる技術を説明する。
*Java仮想マシンに高速化の技術を導入する。
**Java仮想マシンに[[ジャストインタイムコンパイル方式]](JITコンパイル方式)を導入する。ジャストインタイムコンパイラは、Javaプログラム(バイトコード)の実行時に、バイトコードをネイティブコードに変換する。
**さらに洗練されたJava仮想マシンでは「動的再コンパイル」(dynamic recompilation) を行う。こうしたJava仮想マシンでは、実行中のプログラムを分析して、プログラムの重要な部分を特定して再コンパイルを行い[[最適化 (情報工学)|最適化]]する。動的再コンパイルは、静的コンパイルよりも優れた最適化を行うことができる。その理由は、動的再コンパイルは、実行環境と実行中にロードされている[[クラス (コンピュータ)|クラス]]に関する情報に基づいて最適化しているからである。
**Java仮想マシンに[[世代別ガベージコレクション]]の技術を導入して[[ガベージコレクション]]を効率化する。
*あるいは、先に述べたように、Javaのソースコードを、従来の言語のコンパイラと同様に、単純にネイティブな機械語コードにコンパイルする。この場合、バイトコードを生成する過程は全く省かれる。この技術を使うと、良好な実行速度を得ることができる。ただし[[移植性]](プラットフォーム非依存)は損なわれる。Java仮想マシンにジャストインタイムコンパイルと動的再コンパイル、世代別ガベージコレクションの技術を導入することにより、Javaプログラムは、移植性を保ちつつ、ネイティブコードと同水準で高速に実行することができるようになった。

<!-- 以下のコメントアウトに伴い文章のつながりが不自然になるためコメントアウト。校正して再び書き直す可能性あり

Java の移植性(プラットフォーム非依存性)がどの程度実現できているかについては、議論の対象となっている。技術的には、移植性とは実現が難しい目標であるが、多くのプラットフォームにおいて同一に動作するJavaプログラムを作成することは可能である。 --><!-- 出典が見つからなかったためコメントアウト

しかし実際には、Javaを利用できるプラットフォームによってはちょっとしたエラーが発生したり、微妙に異なる動作をしたりする事例が多い。こうしたことから一部の人々は、サン・マイクロシステムズのJavaの売り文句であった "Write once, run anywhere"(一度コードを書けば、どの環境でも動く)をもじって "Write once, debug everywhere"(一度コードを書けば、どの環境でもデバッグが必要)と皮肉をいわれることがある。[要出典] --><!-- WARN: Java仕様の不備だったのか、それとも各プラットフォームにおけるJava実装に問題があったのか、それが論じられていないので意味がない。仕様に適合しない処理系や実行環境であれば、プログラムの動作互換性が保証できないのはどの言語でも同じ。 -->
Javaのプラットフォーム非依存性は、[[サーバ]]側や[[組み込みシステム]]のアプリケーションに関しても成功を収めている。サーバ側 ([[Java Platform, Enterprise Edition|Java EE]]) では、Java の[[Java Servlet|サーブレット]]、[[Webサービス]]、[[Enterprise JavaBeans|EJB]] (Enterprise JavaBeans) などの技術が広く使われている。組み込みシステムの分野においても、組み込みシステム向けの Java環境 ([[Java Platform, Micro Edition|Java ME]]) を使った[[OSGi]]を基にした開発が広く行われている。

=== スレッド ===
Javaではその前身であるGreenOS用言語およびOakと呼ばれていた頃にあたる、主に家電機器向け組込システムへの普及を目指していた初期の段階から、スレッド式(''threaded'')を基底要素にして設計されていた。組込システム開発では主に2~4タスクによる並行処理が要望される状況が頻出しており、大抵はシングルタスクでも実装可能なコルーチンによる交互切り替えフローで対応される事が多かった。家電機器の高機能化に伴うマルチタスク環境のニーズ増加を予測したサン社のプロジェクトチームは、その組み込み分野におけるシェア独占を目指してマルチスレッド機能の標準配備を、プログラミング言語と仮想マシン設計における重要課題としていた。初期バージョンにおけるJavaのスレッドは、仮想マシンソフトウェア上のユーザー空間で走行される純粋なユーザースレッドとして実装された。一台のJava仮想マシンの実行は一つのプロセスとなり、Javaのプロセスは始めから複数スレッド(糸)の寄り合わせとして設計されていた。この高度なネイティブスレッド・エミュレート技術は注目を集め、その開発チームの名に因んだグリーンスレッドという名称を確立し、ランタイムライブラリ及び仮想マシン上で走行されるマルチスレッドの代名詞となった。グリーンスレッドは公開初期においては、例えばLinuxのネイティブスレッドよりもやや軽量なパフォーマンスを発揮した。組み込みシステム向けのJava仮想マシンでは基本的にこのグリーンスレッドが標準仕様となり続けている。しかし、パソコンやサーバーマシン用の各OSの間で、マルチコアCPUの特性を活かして設計された更に軽量なネイティブスレッドが一般的になると、グリーンスレッドのパフォーマンスは明確に見劣りするようになった。やむなく開発チームはグリーンスレッドを順次廃止し、JavaのスレッドをOSが提供するネイティブスレッド上で走行させるように設計変更した。これはやや苦汁の決断だったようで、特に並行処理同期=排他制御を多用するJavaプログラムにおいては、この時点からプラットフォーム非依存性に対する問題が生じるようになったと言われる。

Javaの同期(''synchronization'')設計の特徴としては、全てのインスタンスにロックオブジェクト機能を持たせている事が挙げられる。このロックは''synchronized''キーワードで示される標準同期構文で使用される。標準同期はJava仮想マシン内包仕様であり、機能的にはミューテックスに相当する。''synchronized''修飾子を付加された各メソッドはその全体が排他制御エリアとなり、呼び出し時はデフォルト的にthisインスタンスからロックを取得するので、イメージ的にオブジェクト(=インスタンス)単位となる排他制御が容易に実装できた。このロック普遍化はオブジェクト指向との協調を明確に表現した設計と言える。''synchronized''クラスメソッドの方は、システム内に存在するクラスオブジェクトからロック取得を試みるので、これもイメージ的に同種オブジェクト(同属性インスタンス)共通の同期と排他制御を表現できた。また、''synchronized()''定義子の波括弧で任意のコード部分を括る事により、メソッド内に部分的な排他制御エリアを設ける事が出来る。ここではthis以外のインスタンスもロックオブジェクトに指定出来るので多様な同期が可能となった。上述の排他制御エリアの仕組みは基本的に入口でロックを取得し、出口でロックを解放するものである。ロックが取得出来なかったら待機キューに入れられる。再入可能(リエントランス)に設計されているので再帰アルゴリズムなどで一度ロックを取得したスレッドが再び入口を通る時はそのまま素通りする。エリア内からのメソッドリターンは同時に出口通過と見なされてロックを解放する。ただしエリア内ですでにロック解放(''notify'')を行っている場合はそのまま脱出する。エリア内では任意位置での待機キュー入り(''wait'')も可能で同時にそこでロックも解放される。状態異常発生時は各スレッドに例外を投げて待機キューから強制脱出させる事も出来る。この標準同期は、組み込みシステムやさほど複雑でないアプリケーションの実装をほとんどカバー出来るものと言える。またこのミューテックス相当の機能は様々に応用可能でもある。しかし、実際にカウントセマフォやバリアや読み書きロックなどを再現しようとすると余計なワンステップを必要としがちなので、それらのロック手法は専用のAPIで用意されている。

スレッドはその性質ごとにスレッドグループにまとめる事が出来て同時に様々な一括操作も可能となっている。これはクライアント・サーバーシステムの実装でよく用いられる。また膨大な数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成と破棄の繰り返しによる負荷増大を解決する為の、スレッドプールとタスクキューを併せたいわゆるモニタの技法を提供するAPIも用意されている。


=== ガベージコレクション ===
=== ガベージコレクション ===
{{see also|ガベージコレクション}}
{{see also|ガベージコレクション}}
Javaプログラムのメモリ管理は、[[Java仮想マシン]]に備えられた[[ガベージコレクション]]機能によって行われる。ガベージコレクションとは、すでにどこからも参照されていないオブジェクトを自動的に特定して破棄し、その占有メモリを解放する機能である。一つのシステムスレッドに乗って未参照のオブジェクトを探し続ける実行プロセスはガベージコレクタと呼ばれる。ガベージコレクタは、どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する事もできる。これによってプログラマの負担は大幅に軽減される事になった。Javaのモデルである[[C++]]では、オブジェクトの生成と破棄が正確に対応するように注意深くプログラムする必要があった。破棄の失敗は即メモリリークにつながり、その積み重ねはやがてメモリ不足を引き起こす事になる。メモリ管理はプログラマにとって負担が大きくバグ発生の温床になっていた。堅牢性を旨とするJavaではこの問題の根本的解決の為にガベージコレクションの機能に力が入れられ、[[世代別ガベージコレクション]]という拡張技術も導入された。
Javaでは簡潔なメモリモデルを採用しており、[[プログラマ]]がメモリ([[主記憶装置]])を管理する負担を軽減する。あらゆるオブジェクトはメモリ内の[[ヒープ領域|ヒープ]]という領域に割り当てられる。メモリ管理は、[[Java仮想マシン]]に統合された[[ガベージコレクション]]の機能によって行われる。従来のオブジェクト指向プログラミング言語である[[C++]]では、ヒープ領域に生成したオブジェクトについて、もはや必要が無くなった時に破棄する指示を、プログラマが自分で責任をもって行わなければならなかった。これは、C++プログラマにとっては負担が大きく複雑で間違えやすい作業であり、ソフトウェアの安全性・開発効率・保守性を損なう要因だった。Javaではガベージコレクションの機能があるため、このようなことは無く、プログラマの負担は大きく軽減される。


なお、ガベージコレクションはメモリリークの問題を完全に解消する訳ではなく、例えばもう必要ないはずのオブジェクトを現行タスクが常時参照するコレクションオブジェクトに格納しているような場合は、ガベージコレクタはこれを特定しない。ガベージコレクタの挙動をプログラマ側はほとんど把握できないが特に影響はない。確実ではないが、ガベージコレクタの実行タイミングを指定する事はできる。
[[ガベージコレクション]]機能を備えた事により、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、[[プログラマ]]の負担が完全に解消されるわけではないものの、大きく軽減される。Java1.2以降では[[世代別ガベージコレクション]]というより効率的な技術を導入している。
=== 分散コンピューティング ===
この対象は[[Object Request Broker|オブジェクト要求ブローカー]]を用いた[[分散システム]](''distributed system'')の実現であり、ネットワーク上に存在する様々なプラットフォームの間で互いに異なる環境を意識せずにリクエストとレスポンスを送りあい、任意のタスクを遂行するインフラストラクチャの構築をサポートする。各プラットフォーム上で稼働されるサーバープログラム、クライアントプログラム、あるいはその双方を兼ねるプログラムは、それぞれオブジェクトを内包しており、オブジェクト要求ブローカーを通して他のオブジェクトにリクエストを送る。それらは分散オブジェクトと呼ばれている。Javaで扱われるオブジェクト要求ブローカーの実装は、Javaオリジナルの[[Java Remote Method Invocation|RMI]]と、[[Common Object Request Broker Architecture|CORBA]]の二つである。業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるように様々な設計が施されている。


分散コンピューティングからは外れるが、JavaのネットワークAPIは、[[インターネット・プロトコル・スイート|TCP/IP]]と[[User Datagram Protocol|UDP]]プロトコル上の[[ソケット (BSD)|ソケット]]通信、セキュアな[[Transport Layer Security|SSL]] / [[Transport Layer Security|TLS]]ソケット通信を扱っており、後にJava XMLアーキテクチャとして発展する[[Extensible Markup Language|XML]]パーサおよびXML構造を操作できる[[Document Object Model|DOM]]&[[Simple API for XML|SAX]]を備えている。これらはカスタムメイドなネットワークシステムの構築をサポートする。
<!-- Java以外のガベージコレクションについて深く説明しすぎていたためコメントアウト
詳細はガベージコレクションのページを閲覧すべき


=== セキュリティ ===
ガベージコレクションを備えていないC++などの言語の場合、プログラマが適切にメモリの管理をしなければならない。オブジェクト指向プログラミングにおいて、オブジェクトを格納する領域をメモリ内のヒープ領域に動的に割り当てた場合(動的メモリ確保)、そのオブジェクトがもはや必要なくなった場合に、プログラマは必ず明示的にオブジェクトを削除する指示を記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならない。メモリ管理が不適切なプログラムでは、メモリリークが発生する可能性がある。メモリリークとは、プログラミングミスなどにより、解放されなかったメモリ領域が累積していき、利用できるメモリの量が減っていくことであり、気付かないうちに大量のメモリを消費してしまう問題が起こり得る。他にも、メモリ領域を解放する際に、解放の指示を重複して行ってしまい、プログラムの実行を不安定にするなどのケースがあり、悪くすると異常終了してしまうこともある。
分散ネットワークを指向するJavaは、[[サンドボックス (セキュリティ)|サンドボックス]]モデルに基づいたセキュリティ機構を備えている。これは遠隔ダウンロードされた追加プログラム([[Javaバイトコード]])による実行環境への予期せぬ操作やユーザー資源への好ましくないアクセスを防止するためのものである。分散(''distributed'')指向のJavaプログラムでは必要に応じてクラスを追加ロードする機会が多いので、サンドボックス実行は必須である。サンドボックス機能は、仮想マシン上の実行が同時にモニタリングを兼ねているので無理なく実現されている。大抵は以下の手順になる。


*[[クラスローダ|クラスローダー]]はバイトコードをダウンロードして順次クラス化する。
ガベージコレクション機能は、このような潜在的な問題の多くを未然に防ぐことができる。Javaのオブジェクトは、常にヒープ領域に動的に割り当てられる。プログラマは任意の時点でオブジェクトを生成することができ、Java実行環境は生成されたオブジェクトのライフサイクルを管理する責任を持つ。
*実行環境にあるセキュリティポリシーファイルに基づいて各種パーミッションが各クラスに付与される。セキュリティポリシーは主に指定クラス名とその対象パーミッションを照合するものである。
*実行環境に元からあるクラスは、オールパーミッション付与がデフォルトである。
*スレッドがリソースアクセスなどの操作をする度に、セキュリティマネージャが現行のパーミッションを調べて対象外なら例外を発生させる。
*その際はスレッドの各通過メソッドのクラスのパーミッションが全チェックされ、原則的に最少パーミッションの方に合わせる。
*appletクラスなどパーミッションのないクラスを通ったスレッドは、完全なサンドボックス実行になりほとんどのリソースにアクセスできなくなる。


実際には上記に加えて、各クラスを同一操作&同一セキュリティレベルでまとめるドメイン機構、認証と承認によるユーザーパーミッション機構、バイトコード送受信時の署名付き証明書機構などが組み合わされて実装運用される。
プログラム(オブジェクト)は、他のオブジェクトへの参照を持ち、そのオブジェクトのメソッドを呼び出すことができる。他のオブジェクトへの参照とは、低水準の視点で述べると、メモリ内のヒープという領域上に確保されたそのオブジェクトを指すアドレスのことである。


Java仮想マシンは、主にメモリ境界とバッファオーバーフローに対するチェックを随時行いながらプログラムを走行させるので実行時の強固な堅牢性を実現している。また、クラスロード時にそのバイトコードを検証して一定のニーモニック整列基準を満たしているか判定する機能も備えており、あからさまなコード暴走や致命的エラーの頻発を事前に抑止している。APIの方では、暗号アルゴリズムモジュール、特定パーミッションを必要とするJavaプログラムコードを実行できるユーザーの認証をサポートするモジュール、セキュアなソケット通信のSSL / TLSプロトコルを扱うモジュールを備えている。
オブジェクトがどこからも参照されなくなった場合、Javaのガベージコレクション機能が自動的にその「到達不可能なオブジェクト」を削除し、そのメモリ領域を解放することでメモリリークを防ぐ。プログラマが解放処理を記述する必要はない。 -->
ただしJavaのガベージコレクション機能は、メモリリークの問題を完全に解消するわけではない。[[プログラマ]]が、自分のプログラムでもはや必要のないはずのオブジェクトへの参照を誤って保持し続けた場合は、やはりメモリリークが発生する可能性がある<ref>[しなければならない。メモリ管理が不適切なプログラムでは、[[メモリリーク]]が発生する可能性がある。メモリリークとは、プログラミングミスなどによ Javaの理論と実践: 弱参照でメモリー・リークを塞ぐ]</ref>。


== Javaの歴史 ==
別の表現で述べると、Javaでは、メモリリークは概念的に高い水準においては、発生する可能性が残っているということである。概念的に低い水準においては、ガベージコレクションが正しく実装された[[Java仮想マシン]]を使えば、メモリリークが発生する可能性は無くなった。全体として、Javaのガベージコレクション機能により、C++の場合と比べると、オブジェクトの生成と削除は、より簡潔になり、潜在的に安全になり、また多くの場合は高速になっている。


=== 誕生の経緯 ===
C++においても、Javaと同等のメモリ管理の高速性と効率性を実現することは可能ではあるが、先に述べた通り、複雑な作業で間違いやすく、完璧に行おうとすれば開発期間が非常に長くなり、開発したソフトウェアはかなり複雑で難解になる。たとえば、C++で特定のクラスを対象として、高速実行およびメモリ利用の断片化の最小化を、高水準で達成できるメモリ管理モデルで設計開発する技法があるが、こうした技法は複雑である。
'''家電向けプロジェクトの立ち上げ(1990年12月)'''
[[ファイル:James Gosling 2008.jpg|サムネイル|181x181ピクセル|ジェームズ・ゴスリン]]
Javaの歴史は、1990年12月に[[サン・マイクロシステムズ]]社が、次世代の家電製品が内蔵するマイクロコントローラ向けのプログラミング言語を開発するステルス・プロジェクトを立ち上げた事から始まる。サン社はこの分野が重要市場になると予測していた。サン社のエンジニアである[[ジェームズ・ゴスリン]]とマイク・シェルダンの参加により、現実味を帯びたプロジェクトの名称は正式に「グリーンプロジェクト」と定められた。彼らは、カリフォルニア州[[メンローパーク (カリフォルニア州)|メンローパーク]]市サンドヒルロードにある小さなオフィスで開発を始めた。


'''Oak言語とGreen OSの誕生(1991年)'''
ガベージコレクションの機構は、Java仮想マシンに組み込まれており、開発者からは、事実上隠蔽されている。開発者は、場合にもよるが、ガベージコレクションがいつ起こるか意識しなくて良い。というのも多くの場合、ガベージコレクションの実行は、プログラマが自分で書いたコードによって明示的に起こる何らかの挙動と、必ずしも関連しているわけではないからである。


グリーンチーム内では当時隆盛していたオブジェクト指向を採用する事で一致していた。彼らはそのモデル言語である[[C++]]に白羽の矢を立て、当初はその移植版を検討していたが、プロジェクトの対象が家電製品の[[組み込みシステム]]であったために自然と却下された。C++の複雑な言語仕様はコンピュータ資源の浪費とプログラムエラーの発生率を高めがちであり、堅牢性と安全性が至上命題である家電製品の制御装置には不向きであると判断されたためだった。加えてC++では[[移植性]]に対応できない点も指摘されており、プロジェクトの中で[[プラットフォーム非依存]]が特に重要な議題として上がった。彼らはC++に代わる言語の開発と同時に、あらゆる機器に容易に移植できるプラットフォームの必要性も認識するようになった。こうして新言語プログラムの動作環境になる「Green OS」の開発も始められた。
=== ネットワーク ===
Javaでは充実した[[ライブラリ]]により、[[コンピュータネットワーク]]を活用するソフトウェアを、効率良く開発できる<ref>広辞苑 第六版</ref>。Javaはその初期のバージョンから、[[インターネット・プロトコル・スイート|TCP/IP]] のライブラリを備えており、ネットワークで[[ソケット (BSD)|ソケット]]通信を行うソフトウェアを簡単に実装できた。分散オブジェクト環境 ([[Java Remote Method Invocation|Java RMI]], [[Common Object Request Broker Architecture|CORBA]]) のソフトウェアの開発も早い時期からできるようになっていた。またさまざまな[[ネットワークプロトコル]]の高水準なライブラリが使えるようになっている。[[W3C]]により標準化された、汎用[[マークアップ言語]]のひとつである[[Extensible Markup Language|XML]]で記述された文書を扱うライブラリも早期に実装・標準サポートされた。充実したネットワーク機能とXML文書を扱う機能を有効に組み合わせることにより、Javaは標準機能だけでも高度なシステムを構築できる言語の一つとなっている。<!-- Javaの特徴と言えるかは微妙だと判断したため一度コメントアウト
FTP(ファイル送受信)


一方で、[[Mesa]]言語と[[C言語]]の長所を理想にしていたサン社エンジニアの[[ビル・ジョイ]]は、''Further''(彼方へ)という名の論文を書いてC++をモデルにした新しいオブジェクト指向言語の開発を自社に提案した。それを受けてまずジェームズ・ゴスリンがC++の拡張言語を提出した。ゴスリンはこれを「C++ ++ --」と名付けたがすぐに取り下げ、改めて一から設計しなおしたプログラミング言語を誕生させた。オフィスの側に立つオークの木を眺めながら開発を進めていたゴスリンは、この新しい言語に'''Oak'''という名前をつけた。時に1991年秋であり、この「Oak」がJavaの前身になった。それと並行してOakプログラムが用いる基本ライブラリも整備された。
HTTP(ウェブによるデータ送受信)
SMTP/POP/IMAP、NNTP(電子メール送受信、ネットニュース)
SSH、TLS/SSL(セキュアな通信により盗聴やなりすましを防ぐ)
SMB(ファイルサーバへのアクセス)
ほか


'''携帯端末、テレビ機器市場への参入と撤退(1992年~1994年5月)'''[[ファイル:Duke3D.png|thumb|Javaのマスコット「'''Duke'''」with [[BSDライセンス]]|代替文=|190x190ピクセル]]1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとグリーンプロジェクトの対象は、当初の家電機器から[[携帯情報端末]](PDA)にシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このユーザーインターフェース上で「Duke」が初登場している。1992年11月、サン社はファーストパーソン社を設立しグリーンチームをそちらに所属させた。次世代のインタラクティブ機器に関心を持つファーストパーソン社は、ケーブルテレビ用[[セットトップボックス]]事業への参入を決めて、[[タイム・ワーナー|タイムワーナー]]社と[[3DO]]社にそれぞれOakテクノロジを提示したが、その高度な柔軟さが逆に倦厭されて契約実現には到らなかった。サン本社はファーストパーソン社の解散を決め、グリーンチームも本社に戻された。
現在[いつ?]ではIPv6も扱えるようになりつつある。 -->


'''ワールドワイドウェブ参入(1994年6月~1994年9月)'''
[[Extensible Markup Language|XML]]文書を扱う技術とネットワーク機能を有効に組み合わせることにより、高度なシステムやサービスを構築できるようになっている。


1994年6月、サン社技術部長ジョン・ゲージが[[ジェームズ・ゴスリン]]、[[ビル・ジョイ]]、[[パトリック・ノートン]]、[[エリック・シュミット]]ら集めて、延べ3日に渡るブレインストーミングが行われた。ここで彼らは[[World Wide Web|ワールドワイドウェブ]]をプロジェクトの本命に据える事で一致した。革新的な[[ウェブブラウザ]]である「[[NCSA Mosaic]]」の登場に触発された彼らは、インターネットの世界がケーブルテレビのそれを超えたインタラクティブな媒体に発展しつつある事を認識していた。パトリック・ノートンはOakテクノロジをベースにした「WebRunner」という小さなウェブブラウザを開発した。Oakによる小さなアクティブプログラムが埋め込まれたウェブページにアクセスすると、WebRunner上でマウス操作に連動するインタラクティブなアニメーションが表示された。
=== セキュリティ ===
Javaは[[コンピュータセキュリティ|セキュリティ]]を考慮して設計されており、[[サンドボックス (セキュリティ)|サンドボックス]]モデルに基づいたセキュリティ機構を備えている。セキュリティ機構を正しく実装したJava実行環境を適切に使うことで、遠隔のコンピュータ上にある実行コードを安全に実行できる([[Javaアプレット]])。初期のバージョンからコードの実行前に様々なセキュリティチェックを行えるメカニズムが実装されていた。


'''Javaの始動(1994年10月~1996年1月)'''
*[[Java仮想マシン]]の[[バイトコード]]検証機能により、Javaの実行コードであるバイトコードが正しいかどうかを検査する。
[[ファイル:Hotjava.jpg|サムネイル|180x180ピクセル|HotJavaブラウザ]]
*Java実行環境の[[クラスローダ]]機能により、[[クラス (コンピュータ)|クラス]](バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査する。
1994年秋までにグリーンチームは、Oakを'''Java'''に、WebRunnerを「[[HotJava]]」に改称した。その理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたという。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(''Bean'')はJavaテクノロジ内でコンポーネントを指す用語にされている。
*Java実行環境のセキュリティマネージャ機能([[サンドボックス (セキュリティ)|サンドボックス]])により、Javaアプレットが、ユーザによって許可された資源以外の資源に不正にアクセスすることを防ぐ。
*Java実行環境の既定の設定では、遠隔のコンピュータ上にある実行コード(Javaアプレット)に対して、ローカルにあるファイル等へのアクセスや、アプレットのダウンロード元以外の遠隔コンピュータとの通信を禁止している。


1994年10月、JavaランタイムとHotJavaブラウザがサン社幹部社員の前でデモンストレーションされ、α版が社内公開された。1995年5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここでは[[Javaアプレット]]の技術が大々的にアピールされた。同時に[[ネットスケープコミュニケーションズ|ネットスケープ社]]が「[[Netscape Navigator (ネットスケープコミュニケーションズ)|Netscape Navigator]]」ブラウザへもこのアプレット機能を配備するとアナウンスして業界の注目を集めた。1995年秋にβ版が社外公開された。1996年1月9日にサン社は正式にJavaソフトウェア部門を立ち上げた。その2週間後に最初の公開バージョンである「JDK 1.0」が市場リリースされた。
=== 例外処理 ===
Javaは[[例外処理]]の構文を備えている。これは制御フローの一種であり、例外想定ブロック内の実行中に状態異常が発生すると例外オブジェクトが生成されて、その宛先となる例外捕捉ブロックに強制ジャンプするという仕組みを指す。これは「例外を投げる」と形容されている。例外捕捉ブロックでは、渡された例外オブジェクトの情報に基づいた任意の例外解決処理を行い、例外ブロックを抜ける事になる。


例外処理は様々なコード局面での使用が推奨されたが、例外発生後のコードが全スキップされるというフロー上の性質から例外想定ブロック内のコード行数は比較的少ないものとなり、それら例外ブロックの断続的な羅列は却ってソースコードの可読性低下にも繋がった。例外処理による堅牢性と、コーディングレベルでの利便性および実用性は様々な部分でマッチしなかったとも言える。また、実行中の多方面に影響が及ぶような致命的な例外ほど、単純な例外ブロックの記述では対応しきれず、細部の例外ブロックから更に大枠の例外ブロックへ飛ぶというような大胆なジャンプを頻発させてプログラムの把握が難しくなるという欠点もあった。結果的に例外処理は、入出力機能の呼び出しなど決まりきった状態異常の発生部分では積極的に用いられるが、それ以外ではコーディングの頻雑さに勝るだけの有用性がそれほど認められていないのが実情となっている。

=== その他 ===
Javaは「[[パッケージ (Java)|パッケージ]]」という[[名前空間]]を持つ。これはクラスとインタフェースを文字列レベルで分類し、またクラス名定義の衝突を回避するための機能である。パッケージ名は任意の数だけピリオドで繋ぐことができる。同時にこれはパッケージの階層構造を表現できる。パッケージの実体はクラス名に付ける接頭辞の羅列であり、その接頭辞文字列によってクラス名をユニークなものにしている。プログラミングの際はソースコード冒頭に、フルパス先頭から任意の数だけ指定したパッケージ名以降をワイルドカード化し、そのパッケージ内のクラスをデフォルト指定できるので短いコード記述が可能となる。

== Javaの歴史 ==
=== 草創 ===
[[ファイル:Duke3D.png|thumb|right|'''Duke''' Javaのマスコット<br>Duke は2006年のJavaのオープンソース化発表と同時に[[BSDライセンス]]付与のオープンソース化が行われており、ウィキペディアに掲載することが可能である]]
1990年頃、サンのエンジニア、パトリック・ノートンは、自社のプログラミング言語C++とCの[[アプリケーションプログラミングインタフェース]](API)と[[プログラミングツール|開発ツール]]に不満を募らせていた。その頃、[[NeXT]]が注目を浴びていたことがきっかけとなって、ノートンはサンでプログラミング環境の開発の仕事をすることになった。NeXT[[ワークステーション]]と、その環境である[[NEXTSTEP]]では、主力の言語として[[Objective-C]]が開発されていた<!-- 余談は百科事典に必要ないと判断。

(余談になるが、その「直系の子孫」に当たるのは、macOSおよびiOSと、Swiftである) -->。こうした経緯のなかで、次世代の家電製品のための新しいプログラミング言語を設計し、その処理系を開発することを目的とした「ステルスプロジェクト」と呼ばれるプロジェクトが始まった。

ステルスプロジェクトには、始まってすぐに[[ジェームズ・ゴスリン]]とマイク・シェルダンが参加し、プロジェクトの名称は「グリーンプロジェクト」に変更された。プロジェクトには他のエンジニアたちも参加し、彼らは[[アメリカ合衆国]][[カリフォルニア州]][[メンローパーク (カリフォルニア州)|メンローパーク]]市サンドヒルロードの道沿いにある小さなオフィスで作業を始めた。サンはこの分野が重要な市場になると予測していた。

プロジェクトチームでは当初は[[C++]]を検討していたが、いくつかの理由から却下された。理由は、当時の彼らの目的が、家電製品すなわち[[組み込みシステム]]だったからである。組み込みシステムでは、利用できるコンピュータ資源が少ないという制約がある。彼らはC++ではコンピュータ資源を食いすぎると判断した。またC++は複雑なプログラミング言語であり、C++を使う[[プログラマ]]は注意していても間違いを犯しがちである。

C++には[[ガベージコレクション]]の機能が無い。ガベージコレクションが無いということは、プログラマが自分でオブジェクトの寿命(生存期間)を管理しなければならないことを意味する。プログラマが自分でオブジェクトの寿命を管理することは、冒険的で間違いやすい作業である。

プロジェクトチームは、いくつかの重要な機能についてC++の[[移植性]]が乏しいことも問題であると考えた。
このプロジェクトでの重要な機能とは、[[コンピュータセキュリティ|セキュリティ]]および[[分散コンピューティング]]、[[マルチスレッド]]であり、これらの機能が、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存せずに使える必要があった。このような事情で、彼らはあらゆる機器に容易に移植できるプラットフォームが必要であると認識するようになった。

一方で、サンの別のエンジニア、[[ビル・ジョイ]]は、[[ゼロックス]]の[[パロアルト研究所]]で[[Alto]]という[[ワークステーション]]試作機のために開発された[[プログラミング言語]]・Mesaと[[C言語|C]]の良いとこどりをした新しいプログラミング言語を構想していた。ジョイは ''Further'' という名前で呼ばれる論文を書き、自社で[[C++]]に基づいた[[オブジェクト指向]]環境を開発するべきであることを進言した。まず[[ジェームズ・ゴスリン]]がC++を改変し拡張することを試みた。ゴスリンはこの拡張版C++を、"C++ ++ --"と名付けた。しかしゴスリンは、すぐにこの拡張版C++の開発を中止して、全く新しいプログラミング言語を開発する方針を採ることにした。ゴスリンはこの新しい言語に'''Oak'''という名前をつけた。この名前の由来は、ゴスリンのオフィスのすぐそばに[[オーク]]の木が立っていたことによる。

<!-- 不必要だと判断したため一度削除。
消しすぎていた場合はノートでの議論の後復活させます。 -->
=== バージョン履歴 ===
=== バージョン履歴 ===
1996年の第一回公開のJavaプラットフォームは「''Java Development Kit''」通称「''JDK''」と呼ばれており、最初のバージョン数値は「1.0」に定められた。通称とバージョン値を合わせたものが製品名とされて「JDK 1.0」で市場導入されている。当初は開発チームの控えめにしたい意向で小数点第一位がメジャーバージョン値にされたが、これは不必要な謙遜という声もあった。
<!--[[画像:Java WebStartApplicationMan.png|thumb|[[Java Web Start]] '''J2SE 1.3''' から導入された、デスクトップ上のアイコンやウェブサイト上のリンクをクリックすることで、[[World Wide Web|ウェブ]]から[[Javaアプリケーション]]が配布される機構]]-->
Java は、[[Java Development Kit|JDK]](Java Development Kit; Java開発キット)1.0 以来、数度のメジャーバージョンアップを経ている。バージョンアップに伴い、多くの[[クラス (コンピュータ)|クラス]]と[[パッケージ (Java)|パッケージ]]が[[Javaクラスライブラリ|標準ライブラリ]]に追加されてきた。[[プログラミング言語]]Javaおよび[[Javaプラットフォーム]]は、高い水準でバージョン間の[[互換性]]を保ちつつ発展してきている。


1998年の第三回メジャーバージョン公開である「1.2」では大幅な技術刷新をアピールするべく「''Java 2''」と次世代呼称にした。これは経営側の判断だったので開発側は小数点第一位の数値改訂を譲らなかった。製品仕様の確立で「''Development Kit''」は「''Platform''」に置き換えられた。マーケットの分化を示唆する「Standard」のエディション名も付けられた。こうして「''Java 2 Platform, Standard Edition''」の通称「''J2SE''」とバージョン値「1.2」を合わせた製品名「J2SE 1.2」で市場導入された。この次世代呼称と小数点第一位の混在名は意味が不明瞭で製品バージョンへの理解を妨げかねないと不評を買っている。この時はまだStandard版だけであったが、翌1999年にEnterprise版の「J2EE 1.2」とMicro版の「J2ME 1.2」が市場導入されて3エデイションになった。
J2SE 1.4から、Javaの開発は[[Java Community Process|JCP]] (Java Community Process) という標準化プロセスで行うようになっている。JCPでは、JSRs (Java Specification Requests) という文書群により、Javaに対する追加機能やJavaプラットフォームに対する変更の提案と規定を行う。


2005年の第六回メジャーバージョン公開である「1.5」から整数部分がメジャーバージョン値にされて「5.0」になり、通称と合わせた製品名は「J2SE 5.0」になった。他のエディションは後発なので「J2EE 1.4」「J2ME 1.4」のままだった。この頃に「''Java Card Platform''」が正規のエディション認定されているが、バージョン体系は独自のままの「Java Card 2.2」であり、これは以降も継続された。
また、J2SE 1.3以降では開発コードネームとして、メジャーバージョンには動物の名前が、マイナーバージョンには昆虫の名前が付けられる傾向がある。


2006年の第七回メジャーバージョン公開で「''Java 2''」の次世代呼称が外されて「''Java''」になり、バージョン値からも小数点以下が外された。「''Java Platform, Standard Edition''」「''Java Platform, Enterprise Edition''」「''Java Platform, Mirco Edition''」の各通称と各バージョン値を合わせた製品名は「Java SE 6」「Java EE 5」「Java ME 5」になった。なお、マイナーバージョンアップの際には再び小数点以下が付けられた。この命名方式は現在まで続いている。
言語仕様は JLS(Java Language Specification; Java言語仕様)により規定する。JLSは[http://www.jcp.org/en/jsr/detail?id=901 JSR 901]の管理下にある。

バージョンアップの過程で、言語仕様の変更だけでなく、標準クラスライブラリにおいても大きな変更が加えられている。JDK 1.0では[[Javaクラスライブラリ|標準ライブラリ]]は約200[[クラス (コンピュータ)|クラス]] / インタフェースだったが、Java SE 6では4000以上のクラス / インタフェースとなっている。[[Swing]]やJava 2Dのような全く新しい[[アプリケーションプログラミングインタフェース|API]]が追加された。その一方で、もともとJDK 1.0から存在していたクラスの[[メソッド (計算機科学)|メソッド]]の多くが、J2SE 5.0での使用は推奨されないようになっている。


==== JDK 1.0 (1996年1月23日) ====
==== JDK 1.0 (1996年1月23日) ====
最初のバージョン<ref>{{Cite press|url=http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.html |title=JAVASOFT SHIPS JAVA 1.0 |publisher=Sun Microsystems |accessdate=2006-07-08 |language=en |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20080625030452/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml |archivedate=2008-06-25}}</ref>。
最初のバージョン<ref>{{Cite press|title=JAVASOFT SHIPS JAVA 1.0|publisher=Sun Microsystems|url=http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.html|language=en|accessdate=2006-07-08|archiveurl=https://web.archive.org/web/20080625030452/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml|archivedate=2008-06-25|deadlinkdate=2019-03-04}}</ref>。まだ国際化対応はされず英語版のみだった
* このバージョンでは日本語などの国際化対応はなされていなかった。


==== JDK 1.1 (1997年2月19日) ====
==== JDK 1.1 (1997年2月19日) ====
いくつかの重要な機能が追加された<ref>{{Cite press|url=http://www.sun.com/smi/Press/sunflash/1997-02/sunflash.970219.0001.html |title=SUN SHIPS JDK 1.1 -- JAVABEANS INCLUDED |publisher=Sun Microsystems |accessdate=2006-07-08 |language=en |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20080506220653/http://www.sun.com/smi/Press/sunflash/1997-02/sunflash.970219.0001.xml |archivedate=2008-05-06}}</ref>。
[[国際化と地域化|国際化]]対応され日本語版も追加された<ref>{{Cite press|title=SUN SHIPS JDK 1.1 -- JAVABEANS INCLUDED|publisher=Sun Microsystems|url=http://www.sun.com/smi/Press/sunflash/1997-02/sunflash.970219.0001.html|language=en|accessdate=2006-07-08|archiveurl=https://web.archive.org/web/20080506220653/http://www.sun.com/smi/Press/sunflash/1997-02/sunflash.970219.0001.xml|archivedate=2008-05-06|deadlinkdate=2019-03-04}}</ref>。
* [[国際化と地域化|国際化]]対応([[日本語]]も含む)
* [[Abstract Window Toolkit|AWT]] : イベントモデルにおける大規模な再構成
* 言語仕様に「内部クラス」が追加された
* [[JavaBeans]] : [[ソフトウェアコンポーネント]]技術
* [[JDBC]] : [[データベース]]接続[[アプリケーションプログラミングインタフェース|API]]
* [[Java Remote Method Invocation|Java RMI]] : 分散オブジェクト技術
* [[リフレクション (情報工学)|リフレクション]] : クラスや、クラスに定義されている[[コンストラクタ]]、[[メソッド (計算機科学)|メソッド]]および[[フィールド (計算機科学)|フィールド]]の名前を文字列によって動的に指定して利用することができる機能<ref>{{Cite web|url=http://docs.oracle.com/javase/jp/8/docs/api/java/lang/reflect/package-summary.html#package.description |title=java.lang.reflect (Java Platform SE 8) |accessdate=2017-04-01 |language=ja-jp}}</ref>。


*内部クラス(言語仕様)
==== J2SE 1.2 (1998年12月8日) ====
*[[JavaBeans]]([[ソフトウェアコンポーネント|ソフトウェアコンポート]]仕様とAPI)
コードネームPlayground。<!--大きく機能が拡張されたため-->このバージョンから呼称が'''Java 2'''に変更され、J2SE 5.0までこの呼称が使われる。またエディション名がJDKから "[[Java Platform, Standard Edition|J2SE]]" (Java 2 Platform, Standard Edition) に変更された。この J2SE の名称により、[[Java Platform, Enterprise Edition|J2EE]] (Java 2 Platform, Enterprise Edition) および [[Java Platform, Micro Edition|J2ME]] (Java 2 Platform, Micro Edition) の基となるエディションであることが明確化された<ref>{{Cite press|url=http://www.sun.com/smi/Press/sunflash/1998-12/sunflash.981208.9.html |title=SUN DELIVERS NEXT VERSION OF THE JAVA PLATFORM |publisher=Sun Microsystems |accessdate=2006-07-08 |language=en |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20080506220658/http://www.sun.com/smi/Press/sunflash/1998-12/sunflash.981208.9.xml |archivedate=2008-05-06}}</ref>。
*[[JDBC|Java Database Connectivity]](データベースAPI)
* <code>strictfp</code>キーワード : [[IEEE 754]]に基づいた厳密な[[浮動小数点数]]の演算を行う
*[[Java Remote Method Invocation|RMI]](分散オブジェクトAPI)
* [[Swing]] [[グラフィカルユーザインタフェース]][[ウィジェット・ツールキット|ツールキット]]が標準ライブラリに統合された。
*[[リフレクション (情報工学)|Java Reflection]](クラスメタデータ操作API)
* サンの[[Java仮想マシン]]に[[ジャストインタイムコンパイル方式|ジャストインタイムコンパイラ]]が備わる。
*[[Abstract Window Toolkit|AWT]]のイベントモデル拡張
* Java Plug-in : さまざまな[[ウェブブラウザ]]にJava実行環境を組み込むことができるようになり、[[Javaアプレット]]を実行できるようになった。
* Java IDLという [[インタフェース記述言語|IDL]](インタフェース記述言語)の実装が導入され、[[Common Object Request Broker Architecture|CORBA]]分散オブジェクト環境との相互運用ができるようになった
* [[コンテナ (データ型)|コレクション]]フレームワークの導入


==== J2SE 1.3 (20005月8日) ====
==== J2SE 1.2 (199812月8日)「Playground」 ====
コードネームKestrel<ref>{{Cite press|url=http://www.sun.com/smi/Press/sunflash/2000-05/sunflash.20000508.3.html |title=SUN MICROSYSTEMS RELEASES FASTEST CLIENT-SIDE JAVA PLATFORM TO DATE |publisher=Sun Microsystems |accessdate=2006-07-08 |language=en |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20080516195335/http://www.sun.com/smi/Press/sunflash/2000-05/sunflash.20000508.3.html |archivedate=2008-05-16}}</ref><ref>{{Cite web|url=https://docs.oracle.com/javase/jp/1.3/relnotes/features.html |title=JavaTM 2 SDK, Standard Edition, version 1.3 の新機能および機能拡張の概要 |accessdate=2019-03-04 |language=ja-jp}}</ref>。
ここからコードネームが付けられるようになった<ref>{{Cite press|title=SUN DELIVERS NEXT VERSION OF THE JAVA PLATFORM|publisher=Sun Microsystems|url=http://www.sun.com/smi/Press/sunflash/1998-12/sunflash.981208.9.html|language=en|accessdate=2006-07-08|archiveurl=https://web.archive.org/web/20080506220658/http://www.sun.com/smi/Press/sunflash/1998-12/sunflash.981208.9.xml|archivedate=2008-05-06|deadlinkdate=2019-03-04}}</ref>。
* [[HotSpot]] [[Java仮想マシン]]が導入され、ジャストインタイムコンパイラに加えて動的再コンパイル技術、[[世代別ガベージコレクション]]を備えた高速なJava仮想マシンを使えるようになった。実際には1999年4月から J2SE 1.2 向けの HotSpot Java仮想マシンがリリースされていた。
* [[Java Remote Method Invocation|Java RMI]] が [[Common Object Request Broker Architecture|CORBA]] ベースに変更される
* JavaSound : 音声データを扱うAPI
* [[Java Naming and Directory Interface]] (JNDI) が標準ライブラリに統合される。ネーミングサービスと[[ディレクトリ・サービス|ディレクトリサービス]]へのアクセス。従来は拡張機能として提供されていた。
* Javaプログラムの[[デバッグ]]を支援する機能群、Java Platform Debugger Architecture (JPDA) の導入。


*<code>strictfp</code>キーワード(言語仕様、浮動小数点計算)
==== J2SE 1.4 (2002年2月6日) ====
*仮想マシンに実行時コンパイラ(''Just-In-Time Compiler'')
コードネームMerlin。このバージョンは、[[Java Community Process|JCP]] (Java Community Process) の下で開発された最初の[[Javaプラットフォーム]]である<ref>[http://www.jcp.org/en/jsr/detail?id=59 JSR 59]</ref><ref>{{Cite press|url=http://www.sun.com/smi/Press/sunflash/2002-02/sunflash.20020206.5.html |title=SUN ANNOUNCES LATEST VERSION OF JAVA 2 PLATFORM STANDARD EDITION |publisher=Sun Microsystems |accessdate=2006-07-08 |language=en |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20080906195714/http://www.sun.com/smi/Press/sunflash/2002-02/sunflash.20020206.5.html |archivedate=2008-09-06}}</ref><ref>{{Cite web|url=https://docs.oracle.com/javase/jp/1.4/relnotes/features.html |title=JavaTM 2 SDK, Standard Edition, version 1.4 の新機能および機能拡張の概要 |accessdate=2019-03-04 |language=ja-jp}}</ref>。
*Javaプラグイン(WEBブラウザへのアプレット実行環境挿入)
*<code>assert</code> キーワード : ある程度、「[[契約による設計]]」に基づいたプログラミングが可能となる。[https://www.jcp.org/en/jsr/detail?id=41 JSR 41] で規定された。
*Java Internet Description Language([[IDL (プログラミング言語)|IDL]]からJava CORBA用スタブ&スケルトンを生成)
*[[Perl]]のような[[正規表現]]のライブラリの導入により、[[文字列]]データ([[テキスト]])の高度な処理機能が提供される。
*[[Swing]](グラフィカルAPI)
*連鎖[[例外処理|例外]]機能により、ある例外の原因となった例外を連鎖的に記録できるようになる。
*Collection Framework(コレクションAPI)
*NIO (New I/O) : 新しい[[入出力]]機能。[https://www.jcp.org/en/jsr/detail?id=51 JSR 51]で規定。
*[[ログ|ロギング]] APIが標準ライブラリに追加される。[https://www.jcp.org/en/jsr/detail?id=47 JSR 47]で規定。
*イメージ I/O API : [[JPEG]]や[[Portable Network Graphics|PNG]]のようなフォーマットの[[画像]]イメージを読み書きするAPI
*[[Java API for XML Processing|JAXP]] (Java API for XML Processing) による統合された[[Extensible Markup Language|XML]]プロセサと[[XSL Transformations|XSLT]]プロセサによるXML文書処理機能のライブラリが、標準で提供されるようになった。[https://www.jcp.org/en/jsr/detail?id=5 JSR 5]および[https://www.jcp.org/en/jsr/detail?id=63 JSR 63]で規定。
*[[コンピュータセキュリティ|セキュリティ]]と[[暗号|暗号化]]の拡張機能を標準ライブラリに統合
**JCE (Java Cryptography Extension) : Java暗号化拡張機能
**JSSE (Java Secure Socket Extension) : Javaでセキュアなインターネット通信 ([[Transport Layer Security|TLS/SSL]]) を実現する機能
**JAAS (Java Authentication and Authorization Service) : Javaの認証と権限のサービス
*[[Java Web Start]]の導入 : [[Javaアプリケーション]]の配備と実行を簡素化する技術。[https://www.jcp.org/en/jsr/detail?id=56 JSR 56]で規定。Java Web Start自体は2001年3月に J2SE 1.3 向けのバージョンがリリースされていた。


==== J2SE 5.0 (2004930日) ====
==== J2SE 1.3 (200058日)「Kestrel」 ====
コードネームTiger。[http://www.jcp.org/en/jsr/detail?id=176 JSR 176] のもとで開発された。J2SE 5.0 では、言語仕様大きく拡張が加えられ、多く新しい言語機能追加された<ref>{{cite press|url=http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html |title=Sun Ships New Version of Java Platform |publisher=Sun Microsystems |language=en |accessdate=2006-07-08 |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20050215094036/http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html |archivedate=2005-02-15}} </ref><ref>{{cite web|url=https://docs.oracle.com/javase/jp/1.5.0/relnotes/features.html |title=J2SE(TM) 5.0 の新機能 |language=ja-jp |accessdate=2006-07-08}}</ref>。もともとは J2SE 1.5 という名称だったが、こ名称はすでに内部的なバージョン番号として使われていた<ref>{{Cite web|url=https://docs.oracle.com/javase/1.5.0/docs/relnotes/version-5.0.html |title=Version 1.5.0 or 5.0? |language=en |accessdate=2006-07-08}}</ref>。またマーケティング上の理由もあった
ここからメジャーバージョンのコードネームは鳥獣名マイナーバージョンは昆虫名するのが慣例になった<ref>{{Cite press|title=SUN MICROSYSTEMS RELEASES FASTEST CLIENT-SIDE JAVA PLATFORM TO DATE|publisher=Sun Microsystems|url=http://www.sun.com/smi/Press/sunflash/2000-05/sunflash.20000508.3.html|language=en|accessdate=2006-07-08|archiveurl=https://web.archive.org/web/20080516195335/http://www.sun.com/smi/Press/sunflash/2000-05/sunflash.20000508.3.html|archivedate=2008-05-16|deadlinkdate=2019-03-04}}</ref><ref>{{Cite web|url=https://docs.oracle.com/javase/jp/1.3/relnotes/features.html|title=JavaTM 2 SDK, Standard Edition, version 1.3新機能および機能拡張の概要|accessdate=2019-03-04|language=ja-jp}}</ref>。
* [[総称型]] ([[ジェネリクス]]): [[コンパイラ|コンパイル]]時に静的に[[コンテナ (データ型)|コレクション]]オブジェクトでその要素となるオブジェクトの型を安全に取り扱うことができるようになった。ほとんどの場合において[[型変換]](キャスト)を行う必要は無くなった。[http://www.jcp.org/en/jsr/detail?id=14 JSR 14]で規定された。
* [[オートボクシング]]/オートアンボクシング : <code>int</code>型のような[[プリミティブ型]](primitive type)と{{Javadoc:SE|java/lang|Integer}}クラスのような[[プリミティブラッパークラス]]の間の変換が自動的に行われるようになった。[http://www.jcp.org/en/jsr/detail?id=201 JSR 201]で規定。
* [[列挙型]] : <code>enum</code>キーワードにより、Javaで安全な[[列挙型]]を実現する[[デザインパターン (ソフトウェア)|デザインパターン]]であるタイプセーフenum[[デザインパターン (ソフトウェア)|パターン]]が言語レベルでサポートされ、列挙型(順序つきリストの値、多くの場合は定数)を安全に定義することができる{{efn|このタイプセーフenumパターンの詳細は、{{Cite book|title=Effective Java Programming Language Guide |author=Joshua Bloch |authorlink=ジョシュア・ブロック |year=2001 |pages=97-106 |chapter=第5章 項目21 enum構文をクラスで置き換える}}を参照。}}。以前のバージョンまではこのような場合、タイプセーフではない整数の定数値で定義するか、[[プログラマ]]が自分でタイプセーフenumパターンで実装するかの、どちらかの方法しか無かった。[http://www.jcp.org/en/jsr/detail?id=201 JSR 201]で規定。
* 可変引数 : [[メソッド (計算機科学)|メソッド]]の最後の[[引数]]を、型名に続けて3個のドットを記述することで可変個数の引数渡しの記述ができるようになった(例 : <code>void drawText(String... lines)</code>)。メソッド呼び出しにおいて、最後の引数に関してはその型の任意の個数のパラメタを渡すことができる。その際、実際には内部的に最後の引数は[[配列]]としてメソッドに渡される。
* [[メタデータ]] : 注釈([[アノテーション]])とも言い、クラスやメソッドに、"@" でタグ付けされた付加的な情報を記述することができるようになる。メタデータを扱うツールで処理することにより、決まった型のコードを生成することができるようになり、Javaによる開発で機械的な作業を減らして開発効率を上げることができる。[http://www.jcp.org/en/jsr/detail?id=175 JSR 175]で規定。
* 拡張<code>for</code>ループ([[foreach文|for-each文]]): [[for文]]による[[ループ (プログラミング)|ループ]]の構文が拡張された。[[配列]]や[[コレクション]]オブジェクト({{Javadoc:SE|java/util|List}}や{{Javadoc:SE|java/util|Set}}など)の各要素[[オブジェクト (プログラミング)|オブジェクト]]に対して、反復(繰り返し)処理をする専用の構文を使うことで、コーディングを簡略化しミスを減らすことができるようになった。この構文を使う場合コレクションは、配列か、{{Javadoc:SE|java/lang|Iterable}}インタフェースを実装したコレクションオブジェクトである必要がある。この構文を使ったコーディング例を示す。


* 仮想マシンに[[HotSpot|HotSpotエンジン]](動的再コンパイル技術と[[世代別ガベージコレクション]])
<source lang="java5">
*Java Platform Debugger Architecture(デバッガ・アーキテクチャ)
void displayWidgets (Iterable<Widget> widgets) {
*[[Java Naming and Directory Interface|Java Name and Directory Interface]](ネーミング&ディレクトリサービスAPI)
for (Widget w : widgets) {
*JavaSound(サウンドAPI)
w.display();
*[[RMI-IIOP|RMI over IIOP]](RMIをIIOPプロトコル上でも使える仕様)
}

}
==== J2SE 1.4 (2002年2月6日)「Merlin」 ====
</source>
このバージョンからJavaコミュニティプロセス([[Java Community Process]])による仕様策定が開始された<ref>[http://www.jcp.org/en/jsr/detail?id=59 JSR 59]</ref><ref>{{Cite press|url=http://www.sun.com/smi/Press/sunflash/2002-02/sunflash.20020206.5.html |title=SUN ANNOUNCES LATEST VERSION OF JAVA 2 PLATFORM STANDARD EDITION |publisher=Sun Microsystems |accessdate=2006-07-08 |language=en |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20080906195714/http://www.sun.com/smi/Press/sunflash/2002-02/sunflash.20020206.5.html |archivedate=2008-09-06}}</ref><ref>{{Cite web|url=https://docs.oracle.com/javase/jp/1.4/relnotes/features.html |title=JavaTM 2 SDK, Standard Edition, version 1.4 の新機能および機能拡張の概要 |accessdate=2019-03-04 |language=ja-jp}}</ref>。


*<code>assert</code> キーワード(言語仕様、例外発生ディレクティブ)
この例では、<code>widgets</code>という変数名のコレクションオブジェクト内の、各<code>Widget</code>オブジェクトを反復して繰り返し処理する。各<code>Widget</code>オブジェクトにはループサイクルごとに<code>w</code>という変数名をつける。各ループサイクルで、<code>w</code>に対して<code>Widget</code>型で定義されている<code>display()</code>メソッドを呼び出す。拡張forループは[http://www.jcp.org/en/jsr/detail?id=201 JSR 201]で規定された。
*例外処理の連鎖格納(言語仕様)
*[[Java Web Start]]
*Regular Expression([[正規表現]]API)
*Non-blocking I/O API(非遮断ストリーム入出力API)
*[[ログ|Logging]](ログ取りAPI)
*Image I/O([[JPEG]]と[[Portable Network Graphics|PNG]]を使えるAPI)
*Preferences(ツリー型のJava式セーブデータ収納庫API)
*[[Java API for XML Processing]]([[Extensible Markup Language|XML]]パーサ&マニュピレータAPI、[[XSL Transformations|XSLT]]フォーマットAPI)
*Java Cryptography Extension(暗号化API)
*Java Secure Socket Extension([[Transport Layer Security|TLS / SSL]]用API)
*Java Authentication and Authorization Service(認証&権限サービスAPI)


==== Java SE 6 (20061211日) ====
==== J2SE 5.0 (2004930日)「Tiger」 ====
言語仕様に大幅な拡張が加えられた<ref>{{cite press|url=http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html |title=Sun Ships New Version of Java Platform |publisher=Sun Microsystems |language=en |accessdate=2006-07-08 |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20050215094036/http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html |archivedate=2005-02-15}} </ref><ref>{{cite web|url=https://docs.oracle.com/javase/jp/1.5.0/relnotes/features.html |title=J2SE(TM) 5.0 の新機能 |language=ja-jp |accessdate=2006-07-08}}</ref>。
コードネームMustang。[http://www.jcp.org/en/jsr/detail?id=270 JSR 270]のもとで開発された。Java SE 6においては、サンは命名方針を変更して、"J2SE" から'''Java SE'''に変更し、バージョン番号から ".0" の部分を廃止している<ref>{{cite web|url=http://www.java.com/en/about/brand/naming.jsp |title=Java Naming |language=en |accessdate=2019-03-04}}</ref>。
* Scripting for the Java Platform
* [[Abstract Window Toolkit|AWT]]、[[Swing]]の高速化。
* Windows[[タスクトレイ|システムトレイ]]のサポート
* [[Windows Aero]] ([[Microsoft Windows Vista|Windows Vista]]) の[[ルック・アンド・フィール]]
* テキストの[[Unicode正規化]] (java.text.Normalizer)
* JDBC 4.0
* JAXP (Java API for XML Processing) 1.4
* [[Webサービス]]


*[[ジェネリクス]](コレクションコンテナに収納要素の型指定が可能 <code>List<T></code>)
;Java SE 6 Update 10
* [[オートボクシング]]([[プリミティブ型|プリミティブ]]と[[プリミティブラッパークラス|ラッパークラス]]の自動変換による相互代入)
Java SE 6 Update 10が[[2008年]]10月22日にリリースされた。Update 8と9が省略され、7の次が10となった。Javaの動作速度が改善され、アプリケーションやアプレットの起動を高速化するJava Quick Starterが搭載され、Javaのインストールを高速化する、Java Kernelが搭載された<ref>{{Cite web|url=http://internet.watch.impress.co.jp/cda/news/2008/10/22/21274.html |title=「Java SE 6 Update 10」公開、動作速度を高速化 |language=ja-jp |accessdate=2008-12-03}}</ref>。[[Javaアプレット]]や[[Java Web Start]]の起動を容易にするための、配備ツールキットが公開された<ref>{{Cite web|url=https://docs.oracle.com/javase/jp/6/technotes/guides/jweb/deployment_advice.html |title=JavaTM Web アプリケーション 配備アドバイス |language=ja-jp |accessdate=2019-03-04}}</ref>。
* [[列挙型]](<code>enum</code>キーワードで定数列挙の型を定義)
* 可変引数(最終引数の型名+3個のドットで自動配列化 <code>void drawText(String... lines)</code>)
*[[アノテーション]](<code>@</code>キーワードで、クラスメタデータの各要素に任意のタグワードと注釈を埋め込む)
*拡張<code>for</code>文(コレクションコンテナから各要素を順々に取り出すのが便利になるループ文)
*静的インポート文(他クラスの定数のフルパスを<code>import</code>で指定可能)
*[[Java Management Extensions]](MBeanを用いた[[依存性の注入]]による実行プログラム動的再構成の最適化)
*メモリモデルの改善によるスレッド処理高速化


==== Java SE 7 (2011728日) ====
==== Java SE 6 (20061211日)「Mustang」 ====
仮想マシンを含めた既存機能の改善と洗練に力が注がれた。
コードネームはDolphinである<ref>[http://jdk7.dev.java.net/ ''Dolphin'']</ref>。2006年に開発が始まった。元々は2008年春にリリースされる見通しであったが<ref>{{Cite web|url=http://weblogs.java.net/blog/editors/archives/2004/09/evolving_a_lang.html |title=Evolving a Language |language=en |accessdate=2006-07-08 |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20060405192824/http://weblogs.java.net/blog/editors/archives/2004/09/evolving_a_lang.html |archivedate=2006-04-05}}</ref>、何度かリリース予定が変更された。2007年8月の時点では2009年1月をリリース目標としていたが<ref name="Looking ahead to Java 7">{{Cite web|url=http://today.java.net/pub/a/today/2007/08/09/looking-ahead-to-java-7.html |title=The Open Road: Looking Ahead to Java 7 |language=en |accessdate=2006-07-08 |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20081222034020/http://today.java.net/pub/a/today/2007/08/09/looking-ahead-to-java-7.html |archivedate=2008-12-22}}</ref>、2008年12月、[[ジェームズ・ゴスリン]]は、「私の勝手な憶測だが」という注意書き付きで、2010年6月以降のリリースを予測し<ref>{{Cite web|url=https://news.mynavi.jp/articles/2008/12/03/javasfather/index.html |title=Javaがレガシーだって? 冗談じゃないよ - James Goslingが語るJavaの現在 |language=ja-jp |accessdate=2018-04-07}}</ref>、2009年11月には2010年9月以降のリリース予定に変更された<ref>{{Cite web|url=http://www.infoq.com/jp/news/2009/11/jdk7-simple-closures |title=JDK 7が、突然"単純な"クロージャをサポート、しかしリリースは、2010年の終わりに。|language=ja-jp |accessdate=2009-12-03}}</ref>。2010年9月に、これ以上の延期を避けるため、大きな言語仕様の改訂などの部分は Java SE 8 に先送りし、Java SE 7 を2011年中頃に、Java SE 8を2012年終わり頃に提供するという目標を立て<ref>{{Cite web|url=http://blogs.sun.com/mr/entry/plan_b |title=It's time for … Plan B |accessdate=2010-09-23}}</ref>、結局2011年7月28日にリリースした。Java SE 7は、オラクルによるサン買収後、初のメジャーリリースである。


* Scripting for the Java Platform(スクリプト言語との連携サポート)
Java SE 7に追加された項目は以下のとおりである。
*Java Architecture for XML Binding(Java XMLアーキテクチャ)
*Java API for XML Web Services
*Java Compiler API(Javaコンパイラへのディレクティブ的なAPI)
*[[Unicode正規化]] API
*Plugging annotation(コンパイル解析用途のアノテーション)
*[[Swing]]の高速化、[[Windows Aero|Windows]]用ルック&フィールの追加、Windows[[タスクトレイ]]表示
* Update10で、Java Quick Starter(アプリ起動高速化)Java Kernel(Java環境インストール高速化)を搭載<ref>{{Cite web|url=http://internet.watch.impress.co.jp/cda/news/2008/10/22/21274.html|title=「Java SE 6 Update 10」公開、動作速度を高速化|language=ja-jp|accessdate=2008-12-03}}</ref>


==== Java SE 7 (2011年7月28日)「Dolphin」 ====
*主として[[動的プログラミング言語|動的言語]]を想定した、invokedynamic の追加 (JSR 292)
サン社を買収したオラクル社による初のメジャーバージョンリリースである。
*NIO.2 (JSR 203), [[Stream Control Transmission Protocol]], [[Sockets Direct Protocol]]

*JDBC 4.1
*言語仕様の細かな拡張
*コレクションや並列性のライブラリの機能追加 (JSR 166y)
*invoke_dynamic API(実装クラスとメソッドシグネチャの組み換えによる動的メソッド呼び出し)
*JAXP, JAXB, JAX-WSの更新
*New File I/O Library(新しいファイル入出力ライブラリ)
*ClassLoaderの改善
*Concurrency Library(並列処理系ライブラリ)
*Project Coinの一部
*コレクションフレームワークへのティムソートの採用
*[[JavaFX]] 2.0(Update 2より)
*暗号化APIに[[楕円曲線暗号]]を導入
*ネットワークAPIに[[Stream Control Transmission Protocol|Stream Control Transmissionプロトコル]]とSockets Directプロトコルを導入
*グラフィック関連の強化
*Update2で、[[JavaFX]]の導入


==== Java SE 8 (2014年3月18日) ====
==== Java SE 8 (2014年3月18日) ====
ここでコードネームが廃止された<ref>[http://jcp.org/en/jsr/detail?id=337 JSR 337: Java SE 8 Release Contents]</ref>。
2014年[[3月4日]]に JSR 337<ref>[http://jcp.org/en/jsr/detail?id=337 JSR 337: Java SE 8 Release Contents]</ref> にて仕様が規定された。JDK 8 は2013年9月9日にリリース予定<ref>{{Cite web|url=http://news.mynavi.jp/news/2011/10/17/033/index.html |title=Java SE 8リリース予定を延期 - 2013年夏へ - エンタープライズ - マイナビニュース |language=ja-jp |accessdate=2012-02-22}}</ref><ref>[http://openjdk.java.net/projects/jdk8/spec/ Java SE 8 Platform Umbrella JSR (337)]</ref>だったが、2013年4月18日にリリースの延期が発表になり2014年3月18日にリリースされた<ref>{{Cite web|url=http://mreinhold.org/blog/secure-the-train |title=Java 8: Secure the train |language=en |accessdate=2013-04-23}}</ref><ref>{{Cite web|url=http://news.mynavi.jp/news/2013/04/22/053/index.html |title=Java 8リリースに遅れ、2014年3月へ - マイナビニュース |language=ja-jp |accessdate=2013-04-23}}</ref><ref>{{Cite web|url=http://www.infoworld.com/t/java-programming/java-8-officially-arrives-last-238552 |title=Java 8 officially arrives at last | Java programming - InfoWorld |language=en |accessdate=2014-03-19}}</ref>。[[Connected Limited Device Configuration|CLDC]], [[Connected Device Configuration|CDC]] を統合した Java ME 8 は2014年[[4月30日]]にリリースされた<ref>{{Cite web|url=http://cloud.watch.impress.co.jp/docs/news/20120221_513391.html |title=7年ぶりのJavaOne Tokyoでは「Javaテクノロジーのすべてを見せる」 - クラウド Watch |language=ja-jp |accessdate=2012-02-22}}</ref>。主な新機能は以下。
*[[ラムダ式]]の導入 (Project Lambda, JSR 335)
*型アノテーション (JSR 308)
*Date and Time API (JSR 310)
*高速[[JavaScriptエンジン]] Nashorn
*[[JavaFX]] 8
*マルチタッチデバイス対応
*HotspotとJRockitの統合 <!-- これ、たぶん中止です -->


*言語仕様に[[無名関数|ラムダ式]]の導入(引数 -> 関数式)
当初搭載予定だった、以下の機能はJava SE 9に延期となった<ref>{{Cite web|url=http://mreinhold.org/blog/on-the-next-train |title=Project Jigsaw: On the next train |language=en |accessdate=2013-01-13}}</ref>。
*関数型インターフェース
*言語レベルでのモジュール化のサポート (Project Jigsaw, JSR 294)
*Stream API(コレクションコンテナ各要素への連続的なラムダ式適用)

*JavaScriptのコードを埋め込めるNashorn Javaスクリプトエンジンの搭載(Project Nashorn)
また、搭載予定だった以下の機能は廃止 (withdrawn) になった。
*Annotation on Java types(型アノテーション)
*Swing アプリケーションフレームワーク (JSR 296)
*Repeating annotations(反復アノテーション)
*Date and Time API(日付時刻)
*静的結合 [[Java Native Interface]] ライブラリ
*Java ME 8 に[[Connected Limited Device Configuration|CLDC]]と[[Connected Device Configuration|CDC]]が統合された<ref>{{Cite web|url=http://cloud.watch.impress.co.jp/docs/news/20120221_513391.html|title=7年ぶりのJavaOne Tokyoでは「Javaテクノロジーのすべてを見せる」 - クラウド Watch|language=ja-jp|accessdate=2012-02-22}}</ref>。


==== Java SE 9 (2017年9月21日) ====
==== Java SE 9 (2017年9月21日) ====
ここからメジャーバージョンは一定の新機能蓄積を待たずに公開する毎年3月と9月の年2回定期リリース制に変更された<ref>{{Cite web|url=https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html|title=Oracle Java SE サポート・ロードマップ|language=ja-jp|accessdate=2018-10-19}}</ref>。
Java SE 9 は Java SE 8 リリースの3年後の[[2017年]]9月21日にリリースされた。<ref>{{Cite web|url=http://openjdk.java.net/projects/jdk9/ |title=JDK 9 |accessdate=2015-06-29}}</ref>。言語レベルでのモジュール化のサポート (Project Jigsaw, JSR 294) などを追加した。


* 言語仕様に''package''を統合分類する「''module''」の導入(Project Jigsaw)
[[オラクル (企業)|オラクル]]はJavaの開発速度向上のため、これまでの新機能の完成を待ってメジャーバージョンアップを行うリリースモデルから、毎年3月と9月の年2回メジャーバージョンアップを行うタイムベースのリリースモデルへと移行することを発表した。またサポートサイクルも見直され、Java SE 9は次のメジャーバージョンまでの6ヵ月間のみ公式アップデートが提供されるnon-LTSリリースとなり、2018年3月に公式アップデートが終了した。なお、LTSリリースとなるJava SE 11以降は配布形態が変更されるため、LTSリリースの公式アップデートは提供されなかった<ref>{{Cite web|url=https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html |title=Oracle Java SE サポート・ロードマップ |language=ja-jp |accessdate=2018-10-19}}</ref>。
* 言語仕様の細かな拡張(Project Coin)
*並列処理APIのアップデート、Flowクラスの追加など
* Compact Stringの追加
* 「JShell」の搭載。コンソール形式でJavaコードを入力し実行結果を確認できる
* 「The Java Linker」の搭載。ユーザー環境に最適なモジュールと仮想マシンモードを自動選択実行する
*仮想マシンに前方コンパイル(''Ahead-Of-Time Compilation'')の導入
* XML catalogs(永続的URLへのマッピング)
*[[HiDPI]] Graphicsの導入(画像拡大縮小の改善)


==== Java SE 10 (2018年3月20日) ====
==== Java SE 10 (2018年3月20日) ====
JSR 383<ref>[http://jcp.org/en/jsr/detail?id=383 JSR 383: Java™ SE 10 (18.3)]</ref> にて仕様が規定されたJava SE 10新リリースモデルによる初リリースで予定通りJava SE 9から半年後[[2018年]]3月20日リリースされ<ref>{{Cite web|url=http://openjdk.java.net/projects/jdk/10/ |title=JDK 10 |accessdate=2018-06-17}}</ref>。ローカル変数[[型推論]]などの機能が追加されている
JSR 383にて仕様規定<ref>[http://jcp.org/en/jsr/detail?id=383 JSR 383: Java™ SE 10 (18.3)]</ref>。ここから追加機能の大半は規範テクノロジ相当のJSR(仕様要求)でなく拡張テクノロジ相当JEP(改良提案)なった。

* ローカル変数の[[型推論]]
* ガーベジコレクタ関連
*[[ルート証明書]]
*Unicode language-tag extensions(Unicode言語タグの取り扱い)


==== Java SE 11 (2018年9月25日) ====
==== Java SE 11 (2018年9月25日) ====
JSR 384<ref>[http://jcp.org/en/jsr/detail?id=384 JSR 384: JavaTM SE 11 (18.9)]</ref>仕様が規定され、[[2018年]]9月25日にリリースされた。[[オラクル (企業)|オラクル]]によるビルドはOracle JDKと[[OpenJDK]]の二種類が提供され、Oracle JDKの商用利用は有償サポート契約を結んだ顧客のみなっているリリースモ変更後の初LTSリリスとなる
JSR 384にて仕様規定<ref>[http://jcp.org/en/jsr/detail?id=384 JSR 384: JavaTM SE 11 (18.9)]</ref>。Java開発環境としOracle JDK[[OpenJDK]]の二が提供されるようになり前者の商用利用は有償サポート契約を結んだ顧客のみなっJava EEのアップグレドがエクリプ財団による「Jakarta EE」に移譲されたので、JDKにEnterprise版連携ジューが含まれなくなった。CORBAモジュルも外された。[[JavaFX|Java FX]]も取り除かれた

* Dynamic class-file constants(invoke_dynamic拡張、動的ロードされたクラスへの定数ブートストラップ呼出)
* [[無名関数|ラムダ式]]への型推論
* HTTPクライアント実装へのAPI
* Flight recorder(Javaプログラム実行トレース用の軽快な各種データ収集フレームワーク)
* Unicode 10.0.0のサポート
* ガーベジコレクタ関連


==== Java SE 12 (2019年3月19日) ====
==== Java SE 12 (2019年3月19日) ====
JSR 386にて仕様規定され、[[2019年]]3月19日にリリースされた。Unicode 11がサポートされている
JSR 386にて仕様規定。アップデートで令和改元向けたセキュティ対策が施された。

* ガーベジコレクタ関連
* switch文の拡張
* JVM Constants API(主にクラスの動的ロードに関連した仮想マシン内の定数プールの操作)


==== Java SE 13(2019年9月17日) ====
==== Java SE 13(2019年9月17日) ====
JSR 388にて仕様規定され2019年9月17日にリリースされた。
JSR 388にて仕様規定。「数百の小粒改良数千のバグ修正」と宣伝された。


* ソケットAPIの再実装
== Java言語の構文 ==
* switch文の拡張
{{main|Javaの文法}}
* Text Blocks(文字列定義の複数行化)
構文は、[[C言語|C]]および[[C++]]から多くを引き継いでいる。このため、設計当時には割合として多かった、CやC++しか書けない[[プログラマ]]にも使いやすいという評判が広まった。Javaが設計された1990年代中旬以前は、Cのプログラマが多く、また[[オブジェクト指向プログラミング言語]]の中では、[[C++]]は広く使われてきた言語の一つだった。なお、JavaではC++と違って名前空間レベルの関数(メソッド)および変数(フィールド)の宣言および定義を許可しておらず、必ず何らかのクラス定義の中に記述することが特徴である。この特徴は後発の[[C Sharp|C#]]も踏襲している。

次の節以降では、[[Hello world]][[プログラム (コンピュータ)|プログラム]]で、Javaプログラムの例を示して説明する。Hello worldプログラムとは、"Hello, world" という文字列をディスプレイなどの出力装置に出力する簡単なソフトウェアプログラムである。プログラミング言語の初学者向けのプログラム例としてよく使われる。なお先に述べた通り、Javaには複数の実行形態があると考えることができるので、以降では、それぞれの実行形態におけるHello worldプログラムを例示する。

=== スタンドアロン(コマンドライン) ===
[[キャラクターユーザインタフェース|コマンドライン]]環境で動く[[スタンドアローン|スタンドアロン]]の[[Javaアプリケーション]]の例を示す。Javaでは、他のプログラミング言語と同様に、コマンドライン環境で動く[[プログラム (コンピュータ)|プログラム]]を簡単に開発できる。


== Javaプログラミング例 ==
{{main|Javaの文法}}
=== アプリケーション(コマンドライン) ===
<source lang="java">
<source lang="java">
// Hello.java
// Hello.java
339行目: 269行目:
</source>
</source>


*Javaプログラムでは全てのフィールド(変数)とメソッド(関数)が<code>'''class'''</code>内に記述される。
このプログラムについて説明する。
*Javaプログラムは、<code>'''public void static main (String[] args)'''</code>から開始される。これはプログラムの中で一つだけ定義されるクラスメソッド(静的メソッド)である。<code>'''args'''</code>はJava実行環境から受け取る開始時パラメータであり、実行時のコマンドラインで指定された文字列が渡される。
*Javaのプログラムではすべてを<code>'''class'''</code>内に記述する。コマンドラインのスタンドアロンアプリケーションの場合も同じである。
*<code>'''System.out'''</code>は、Systemクラスのクラスフィールド(静的フィールド)であるoutを指す。outは、PrintStreamクラスのインスタンスである。<code>'''out.println("文字列")'''</code>は、outによるprintlnメソッドの呼び出しを指す。
*[[ソースコード]]の[[ファイル (コンピュータ)|ファイル]]名は、そのファイルで記述している[[クラス (コンピュータ)|クラス]]の名前に ".java" というサフィクス(接尾辞、[[拡張子]])を付けるという規則で命名する。
*:このプログラム例では、クラス名は<code>'''Hello'''</code>であるため、"Hello.java" というソースファイル名にする必要がある。
*[[コンパイラ]]は、ソースファイルで定義されている各クラスの[[Javaクラスファイル|クラスファイル]]([[バイトコード]])を生成する。クラスファイルの名称は、そのクラスの名前に ".class" のサフィクスをつけた名前になる。
**クラスファイルの生成において、内部クラスの一種である無名クラス (anonymous class) の場合は、クラスファイルの名称は、その無名クラスを含むクラスの名称と整数(0から始まり、無名クラスが複数ある場合は、さらに1、2...と順に付番される)を "$" で連結した文字列に、通常のクラスと同じく ".class" のサフィクスを付けた名前になる。
*この例のように、スタンドアロンで実行するプログラム(クラス)では<code>'''main()'''</code>[[メソッド (計算機科学)|メソッド]]を定義する必要がある。メソッド定義には振る舞いを記述する。このmainメソッドのシグニチャ(戻り値、引数)は次のようにしなければならない。
**戻り値の指定には<code>'''void'''</code>キーワードを使う。<code>void</code>は、そのメソッドが何も戻り値を返さないことを示す。
**mainメソッドは、パラメタ([[引数]])として1つの{{Javadoc:SE|java/lang|String}}の配列を受け取らなくてはならない。この<code>String</code>配列の引数の名称は<code>'''args'''</code>とすることが慣習となっている。ただし引数として可能な名称であれば他の名称でも構わない。
**mainメソッドには<code>'''static'''</code>キーワードをつけなければならない。<code>static</code>は、そのメソッドがクラスメソッドであることを示す。クラスメソッドは、[[クラス (コンピュータ)|クラス]]と関連するメソッドであり、[[オブジェクト (プログラミング)|オブジェクト]][[インスタンス]]に関連するメソッド([[インスタンスメソッド]])ではない。
**mainメソッドは<code>'''public'''</code>キーワードをつけて宣言する。publicは、そのメソッドが他のクラスのコードから呼び出せること、およびそのクラスが他のクラスから呼び出される可能性があることを、示す。ここでの「他のクラス」とは、そのクラスの継承階層に関係なく、他のすべてのクラスを意味する。
*印字出力機能は、Javaの標準[[ライブラリ]]に含まれている。'''{{Javadoc:SE|java/lang|System}}''' クラスは public static のフィールド '''{{Javadoc:SE|name=out|java/lang|System|out}}''' をもつ。<code>out</code> オブジェクトは、{{Javadoc:SE|java/io|PrintStream}} クラスのインスタンスであり、[[標準出力]]ストリームを表す。<code>PrintStream</code>クラスのインスタンスである <code>out</code> オブジェクトは、'''{{Javadoc:SE|name=println(String)|java/io|PrintStream|println(java.lang.String)}}''' メソッドを持つ。このメソッドはデータをストリームに出力する。[[ストリーム (プログラミング)|ストリーム]]とは入出力を[[抽象化 (計算機科学)|抽象化]]した概念である。この場合は、データを画面(<code>out</code> 、標準出力)に出力する。
*スタンドアロンプログラムを実行するには、Java実行環境に呼び出す対象となる main メソッドを持つクラスの名前を渡すことによって、Java実行環境に実行を指示する。 [[UNIX]]や[[Microsoft Windows|Windows]]の環境の場合は、カレント[[ディレクトリ]]から<code>java -cp . Hello</code>をコマンドラインで入力することで、この例のプログラム(Hello.classに[[コンパイル]]されたクラス)を実行することができる。
**実行するmainメソッドをもつクラス名の指定については、[[Jar|Javaアーカイブ]] (Jar) ファイルのMANIFESTに記述する方法もある。

<!-- 現在Swingは脆弱性などの観点から使用は推奨されていない。JavaFXを使用した例に書き換えてください。
=== スタンドアロン(GUIアプリ) ===
[[グラフィカルユーザインタフェース]] (GUI) 環境で動く [[Swing]]を使った[[スタンドアローン|スタンドアロン]]の[[Javaアプリケーション]]の例を示す。Swingは、[[Java Platform, Standard Edition|Java SE]]の高度なGUIの[[ウィジェット・ツールキット]]の[[ライブラリ]]である。

<source lang="java">
// Hello.java
import javax.swing.*;

public class Hello extends JFrame {
Hello() {
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
add(new JLabel("Hello, world!"));
pack();
}

public static void main(String[] args) {
new Hello().setVisible(true);
}
}
</source>
*'''<code>import</code>'''文は、[[コンパイル]]時に[[Javaコンパイラ]]に対し、この[[ソースコード]]内では'''{{Javadoc:SE|package=javax.swing|javax/swing}}'''[[パッケージ (Java)|パッケージ]]内のすべてのpublicな[[クラス (コンピュータ)|クラス]]と[[インタフェース (抽象型)|インタフェース]]を、パッケージ名をつけないでクラス名 / インタフェース名だけで使うことを伝える。
*:<code>import</code>文を記述しなくても、<code>javax.swing.JFrame</code>のようにパッケージ名をつけて完全修飾クラス名 (FQCN; Fully Qualified Class Name) で使うこともできるが、この例のように<code>import</code>文を使うことで、単に<code>JFrame</code>のようにクラス名だけで使うことができるようになる。
*<code>'''Hello'''</code> <code>class</code> <code>'''extends'''</code> '''{{Javadoc:SE|javax/swing|JFrame}}''' の部分では、<code>JFrame</code>クラスを[[継承 (プログラミング)|継承]]して<code>Hello</code>クラスを定義すること(<code>JFrame</code>の[[サブクラス (計算機科学)|サブクラス]]とすること)を記述している。<code>JFrame</code>クラスは、ウィンドウ終了ボタンをもつタイトルバーの付いた[[ウィンドウ]](フレーム)を[[実装]]している。
*<code>'''Hello()'''</code>[[コンストラクタ]]では、フレームを初期化している。
**コンストラクタとは、特殊なメソッドであり、[[オブジェクト (プログラミング)|オブジェクト]]の状態を初期化する処理を記述する。オブジェクトが生成される際に自動的に呼び出される。この例では、main[[メソッド (計算機科学)|メソッド]]で<code>Hello</code>オブジェクト(フレーム)を生成する時に呼び出され、<code>Hello</code>オブジェクト(フレーム)の状態を初期化する役割を担っている。なおJavaのコンストラクタには、クラス名と同じ名称を付ける。
***オブジェクトの初期化処理が必要無い場合などには、コンストラクタの明示的な定義を省略して良い。
**このコンストラクタではまず、<code>JFrame</code>から継承された '''{{Javadoc:SE|name=setDefaultCloseOperation(int)|javax/swing|JFrame|setDefaultCloseOperation(int)}}''' メソッドを呼び出し、タイトルバーのウィンドウ終了ボタンが押された際の既定の挙動を '''{{Javadoc:SE|javax/swing|WindowConstants|DISPOSE_ON_CLOSE}}''' に設定する。これにより、ウィンドウ終了ボタンが押された際に、フレームが単に不可視になるだけでなく破棄されることになり、[[Java仮想マシン]]が終了しプログラムが終了するようになる。
**次に、'''<code>new </code>{{Javadoc:SE|javax/swing|JLabel}}'''で'''"Hello, world!"'''の文字列表示のためにラベルオブジェクトを生成して、フレーム(<code>JFrame</code>)の継承元クラス{{Javadoc:SE|java/awt|Container}}から継承された'''{{Javadoc:SE|name=add(Component)|java/awt|Container|add(java.awt.Component)}}'''メソッドを、このラベルを引数として呼び出して、ラベルをフレーム上に追加配置する。
**継承元クラス{{Javadoc:SE|java/awt|Window}}から継承された'''{{Javadoc:SE|name=pack()|java/awt|Window|pack()}}'''メソッドを呼び出して、フレームの大きさを調整し、フレーム内のコンポーネント(ラベル)の配置を調整する。
*このプログラムが起動される時に、[[Java仮想マシン]]は <code>'''main()'''</code>メソッドを呼び出す。
**mainメソッドは'''<code>new Hello()</code>'''の部分でフレームのオブジェクトを生成する。このオブジェクト生成の際に、先に述べた<code>Hello()</code>[[コンストラクタ]]の一連の処理が実行される。
**次に生成したオブジェクトに対して、その継承元クラス{{Javadoc:SE|java/awt|Component}}から継承された'''{{Javadoc:SE|name=setVisible(boolean)|java/awt|Component|setVisible(boolean)}}'''メソッドを、boolean型のパラメタ<code>'''true'''</code>を引数として呼び出して、フレームを可視化する。
*注意: フレームが一度表示されたら、<code>main</code>メソッドが終了してもプログラムは終了しない。その理由は、AWTのイベントディスパッチング[[スレッド (コンピュータ)|スレッド]]が終了するのは、すべてのトップレベルのSwingウィンドウが破棄された後であるためである。
-->

=== アプレット ===
[[Javaアプレット]]は、他のアプリケーションに埋め込まれるプログラムである。多くの場合は、[[ウェブブラウザ]]に表示される[[ウェブページ]]に埋め込まれる。

<source lang="java">
// Hello.java
import java.applet.Applet;
import java.awt.Graphics;

public class Hello extends Applet {
public void paint(Graphics gc) {
gc.drawString("Hello, world!", 65, 95);
}
}
</source><!--
(XHTML 1.1 に準拠したウェブページですが、現時点ではウェブブラウザによっては正常に動作しません)
<?xml version="1.0" encoding="UTF-8"?>
&lt;!-- Hello.html --&gt;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Hello World Applet</title>
</head>
<body>
&lt;div>
<object classid="java:Hello" width="200" height="200">

</object>
&lt;/div>
</body>
</html>--><!--
(XHTML 1.0 Transitional に準拠)
<?xml version="1.0" encoding="UTF-8"?>
&lt;!-- Hello.html --&gt;
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-->
<source lang="html4strict">
<!-- Hello.html -->
<html>
<head>
<title>Hello World Applet</title>
</head>
<body>
<div>
<applet code="Hello" width="200" height="200">
</applet>
</div>
</body>
</html>
</source>
*'''<code>import</code>''' 文は、[[コンパイル]]時にJavaコンパイラに対し、このソースコード内では '''{{Javadoc:SE|package=java.applet|java/applet|Applet}}''' クラスと '''{{Javadoc:SE|package=java.awt|java/awt|Graphics}}''' クラスを、パッケージ名を付けないでクラス名だけで使うことを、伝える。<!--
*:<code>java.applet.Applet</code> のようにパッケージ名をつけて完全修飾クラス名 (FQCN; Fully Qualified Class Name) で使うこともできるが、この例のように単に <code>Applet</code> のようにクラス名だけで使うことができるようになる。-->
*<code>'''Hello'''</code> <code>class</code> <code>'''extends'''</code> '''<code>Applet</code>''' の部分は、<code>Hello</code>クラスが<code>Applet</code>クラスを[[継承 (プログラミング)|継承]]すること(<code>Hello</code>クラスが<code>Applet</code>クラスの[[サブクラス (計算機科学)|サブクラス]]であること)を記述している。
*<code>Applet</code>クラスは、[[ホストアプリケーション]](アプレットを実行するアプリケーション)上で、アプレットによるグラフィクスの表示やアプレットのライフサイクル制御を支援するフレームワークを提供する。
**<code>Applet</code>は抽象[[ウィジェット・ツールキット|ウィンドウツールキット]] ([[Abstract Window Toolkit|AWT]]; Abstract Window Toolkit) の{{Javadoc:SE|java/awt|Component}}である。<code>Component</code>を継承したクラスであるため、<code>Applet</code>は、[[グラフィカルユーザインタフェース]] (GUI) を備えており、開発者はイベント駆動プログラミングの作法でアプレットを開発することができる。
*<code>Hello</code>クラスは{{Javadoc:SE|java/awt|Container}}スーパークラスから継承された'''{{Javadoc:SE|name=paint(Graphics)|java/awt|Container|paint(java.awt.Graphics)}}'''メソッドをオーバーライドしている。
**[[オーバーライド]]とは、スーパークラスで定義された、既定の振る舞いを実装したメソッドや抽象メソッドを、サブクラス側で実装し直すことをいう。
*この<code>paint(Graphics)</code>メソッドのオーバーライドにより、<code>Hello</code>アプレットを表示する処理を実装することができる。<code>paint(Graphics)</code>メソッドは、アプレットに'''<code>Graphics</code>'''オブジェクトを渡す。アプレットは'''<code>Graphics</code>'''オブジェクトを受け取る。'''<code>Graphics</code>'''オブジェクトは、アプレットを表示するために使われるグラフィクスコンテクストを表している。
*この例では、'''<code>Graphics</code>'''オブジェクト(グラフィクスコンテクスト)の'''{{Javadoc:SE|name=drawString(String, int, int)|java/awt|Graphics|drawString(java.lang.String,%20int,%20int)}}'''メソッドを呼び出して、アプレット表示域の (<code>'''65, 95'''</code>) [[ピクセル]]座標(オフセット)で '''"Hello, world!"''' 文字列を表示する。
*この例では、アプレットは [[Extensible HyperText Markup Language|XHTML]] ([[HyperText Markup Language|HTML]]) 文書内の、'''<code><!--object-->applet</code>'''要素(<code><!--<object>--><applet></code> タグ)が使われている位置に表示される。<code><!--object-->applet</code> 要素は、3つの属性をもつ。<!--
(XHTML 1.1 準拠の場合)
**'''<code>classid="java:Hello"</code>''' は、<code>Applet</code> クラスの名前を示す。
--><!--(XHTML 1.0 Transitional 準拠の場合)-->
**'''<code>code="Hello"</code>''' は、<code>Applet</code> クラスの名前を示す。
**'''<code>width="200" height="200"</code>''' は、アプレット領域の幅と高さを設定する。
*アプレットは、<code>applet</code> 要素の代わりに、<code>object</code> 要素あるいは <code>embed</code> 要素を使っても XHTML 文書に埋め込むことができる。ただし現時点では、[[ウェブブラウザ]]によるこの2つの要素の扱いは、ブラウザごとに異なることがある<ref>{{Cite web|url=http://java.sun.com/docs/books/tutorial/deployment/applet/applettag.html |title=Using the applet Tag |language=en |accessdate=2006-07-08 |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20081218054858/http://java.sun.com/docs/books/tutorial/deployment/applet/applettag.html |archivedate=2008-12-18}}</ref><ref>{{Cite web|url=http://java.sun.com/docs/books/tutorial/deployment/applet/mixedbrowser.html |title=Deploying Applets in a Mixed-Browser Environment |language=en |accessdate=2006-07-08 |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20081218135453/http://java.sun.com/docs/books/tutorial/deployment/applet/mixedbrowser.html |archivedate=2008-12-18}}</ref>。 XHTML 1.1 仕様においては <code>applet</code> 要素は廃止され、アプレットを使う場合は <code>object</code> 要素を使うことになる。


=== サーブレット ===
=== サーブレット ===
[[Java Servlet|Javaサーブレット]]は、[[サーバ]]側の[[Java Platform, Enterprise Edition|Java EE]]の構成要素であり、[[クライアント (コンピュータ)|クライアント]]から受けた要求 (request) に対する応答 (response) を生成する。現在、多くの場合は[[ウェブブラウザ]]から要求を受け、応答として[[Extensible HyperText Markup Language|XHTML]] / [[HyperText Markup Language|HTML]]の[[ウェブページ]]を動的に生成する。

<source lang="java">
<source lang="java">
// Hello.java
// Hello.java
496行目: 308行目:


; [[Java Platform, Standard Edition]] (Java SE)
; [[Java Platform, Standard Edition]] (Java SE)
: スマートフォンやタブレットを含むパーソナルコンピュータ向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言える。プロファイルとして組込システム開発者向けの「Java SE Embedded」が存在する。
: スマートフォンやタブレットを含むパーソナルコンピュータ向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言える。
; [[Java Platform, Enterprise Edition]] (Java EE) / Jakarta EE
; [[Java Platform, Enterprise Edition]] (Java EE) / Jakarta EE
: サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。プロファイルとしてWeb開発者向けの「Web Profile」が存在する。
: サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。
: 2017年9月にOracle社は、Java EEの今後のバージョンアップが[[Eclipse Foundation|エクリプス財団]]によって行われる事を発表した<ref>{{Cite web|url=https://blogs.oracle.com/theaquarium/opening-up-ee-update |title=Opening Up Java EE - An Update |date=2017-09-12 |publisher=Oracle |language=en |accessdate=2019-03-10}}</ref><ref>{{Cite web|url=https://www.infoq.com/jp/news/2017/11/towards-java-EE-at-eclipse |title=EE4J、EclipseファウンデーションがオープンソースJava EEを準備 |date=2017-11-16 |publisher=InfoQ |language=ja-jp |accessdate=2019-03-10}}</ref>。[[クラウドコンピューティング]]技術への対応急務がその背景にあった。Java EEの商標は現行版のサポートを続けるOracle社が保持したので、エクリプス財団による今後のバージョンは'''Jakarta EE'''の名称で公開される事になった<ref>{{Cite web|url=https://www.infoq.com/jp/news/2018/03/java-ee-becomes-jakarta-ee |title=Java EE は Jakarta EE となる |date=2018-03-05 |publisher=InfoQ |language=ja-jp |accessdate=2019-03-10}}</ref>。
: 2017年9月にOracle社は、今後のJava EEのアップグレードが[[Eclipse Foundation|エクリプス財団]]によって行われる事を発表した<ref>{{Cite web|url=https://blogs.oracle.com/theaquarium/opening-up-ee-update |title=Opening Up Java EE - An Update |date=2017-09-12 |publisher=Oracle |language=en |accessdate=2019-03-10}}</ref><ref>{{Cite web|url=https://www.infoq.com/jp/news/2017/11/towards-java-EE-at-eclipse |title=EE4J、EclipseファウンデーションがオープンソースJava EEを準備 |date=2017-11-16 |publisher=InfoQ |language=ja-jp |accessdate=2019-03-10}}</ref>。JavaEEの収益性低下と[[クラウドコンピューティング]]技術への対応急務がその背景にあったとされる。Java EEの商標は現行版のサポートを続けるOracle社が保持したので、エクリプス財団による今後のバージョンは'''Jakarta EE'''の名称で公開される事になった<ref>{{Cite web|url=https://www.infoq.com/jp/news/2018/03/java-ee-becomes-jakarta-ee |title=Java EE は Jakarta EE となる |date=2018-03-05 |publisher=InfoQ |language=ja-jp |accessdate=2019-03-10}}</ref>。
; [[Java Platform, Micro Edition]] (Java ME)
; [[Java Platform, Micro Edition]] (Java ME)
: [[組み込みシステム]]、[[マイクロコントローラ]]向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
: [[組み込みシステム]]、[[マイクロコントローラ]]向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
506行目: 318行目:


=== Java実行環境(JRE) ===
=== Java実行環境(JRE) ===
{{未検証|section=1|date=2019年3月}}
{{Main|Java Runtime Environment}}
{{Main|Java Runtime Environment}}


Java実行環境 (''Java Runtime Environment'') は、Javaアプリケーションを実行するために必要なソフトウェアである。'''[[Java仮想マシン]]'''(''Java Virtual Machine'')と、<nowiki>''</nowiki>Java.exe<nowiki>''</nowiki>を始めとする様々な'''スターター'''と'''Javaクラスライブラリ'''(''Java Class Library'')で構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。
Java実行環境 (''Java Runtime Environment'') は、Javaアプリケーションを実行するために必要なソフトウェアである。[[Java仮想マシン]]、<nowiki>''</nowiki>Java.exe<nowiki>''</nowiki>スターターを含めた各種実行サポートツール、Javaクラスライブラリで構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。


;Javaクラスライブラリ
;Javaクラスライブラリ
536行目: 347行目:
:パーソナルコンピュータなどのローカル環境で実行されるJavaプログラム。「[[Java Web Start]]」は任意のjnlpファイル(''java network launching protocol'')をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。
:パーソナルコンピュータなどのローカル環境で実行されるJavaプログラム。「[[Java Web Start]]」は任意のjnlpファイル(''java network launching protocol'')をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。
;[[Javaアプレット]] (applet)
;[[Javaアプレット]] (applet)
:サーバーからダウンロードされてウェブブラウザ上で実行されるJavaプログラム。[[サンドボックス (セキュリティ)|サンドボックス]]機能下で厳しい動作制約が加えられている。公開当初はJavaの汎用仕様方針によりWEBブラウザ環境に特化出来なかった裏目に出て起動や動作の軽快さに難が見られた。その改善機会も{{要説明範囲|某社との企業戦略上の確執|date=2019年7月29日 (月) 03:43 (UTC)}}から失われてしまい、他のブラウザメディアに押されてさほど普及しなかった。
:サーバーからダウンロードされてWEBブラウザ上で実行されるJavaプログラム。[[サンドボックス (セキュリティ)|サンドボックス]]機能下で厳しい動作制約が加えられている。当初はJavaの目玉技術であったが、様々な理由からさほど普及しなかった。
:Java Cardプラットフォームの分野である[[スマートカード]](ICカード)上で動くJavaプログラムもアプレットと呼ばれており、現在ではこちらに舞台を移している。
;[[Java Servlet|Javaサーブレット]] (servlet)
;[[Java Servlet|Javaサーブレット]] (servlet)
:サーバーマシンで実行されるJavaプログラム。その名の通り手軽にサーバープログラムを実装出来るが、大規模サーバーの構築にも適している。サーブレットはクライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。[[Perl]]などによる[[Common Gateway Interface|CGI]]に比べ、サーバ側の負荷が低いなどのメリットがある。
:サーバーマシンで実行されるJavaプログラム。その名の通り手軽にサーバープログラムを実装出来るが、大規模サーバーの構築にも適している。サーブレットはクライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。[[Perl]]などによる[[Common Gateway Interface|CGI]]に比べ、サーバ側の負荷が低いなどのメリットがある。
543行目: 355行目:


=== Java開発キット(JDK) ===
=== Java開発キット(JDK) ===
{{未検証|section=1|date=2019年3月}}
{{main|Java Development Kit}}
{{main|Java Development Kit}}


Java開発キット (''Java Development Kit'') は、Javaプログラムを開発するための基本的なソフトウェアである。[[Javaコンパイラ|コンパイラ]]、デバッガ、アーカイバ、ソフトウェアモニター、ドキュメントジェネレーターなどの'''基本開発ツール'''と様々な'''開発支援ツール'''と'''Java API'''(''Java Application Programming Interface'')で構成されている。前述のエディションによって開発ツール内容とAPI構成に違いがある。Java開発キットの呼称はこれまでに何度か変更されている。
Java開発キット (''Java Development Kit'') は、Javaプログラムを開発するために必要なソフトウェアである。Java実行環境も内包している。[[Javaコンパイラ]]などの基本開発ツール、各種開発サポートツール、Java APIで構成されている。前述のエディションによって開発ツール内容とAPI構成に違いがある。Java開発キットの呼称はこれまでに何度か変更されている。


*J2SE 1.2.2_004 までは、JDK(''Java Development Kit'')と呼んでいた。
*J2SE 1.2.2_004 までは、JDK(''Java Development Kit'')と呼んでいた。
*J2SE 1.4 までは、Java2 SDK(''Java2 Software Development Kit'')と呼んでいた。
*J2SE 1.4 までは、Java2 SDK(''Java2 Software Development Kit'')と呼んでいた。
*J2SE 5.0 からは再び、JDK(''Java Development Kit'')と呼んだ。
*J2SE 5.0 からは再び、JDK(''Java Development Kit'')と呼んだ。
*JavaSE 7 からは、エンタープライズ版(EE)では Java SDK(''Java Software Development Kit'')と呼び、スタンダード版(SE)マイクロ(ME)では JDK(''Java Development Kit'')と呼ぶようになった。JDKはSDKの拡張サブセット(SDKの一部分+その他)とされる。
*JavaSE 7 からは、エンタープライズ版とマイクロ版では Java SDK(''Java Software Development Kit'')と呼び、スタンダード版とカード版では JDK(''Java Development Kit'')と呼ぶようになった。JDKはSDKの拡張サブセット(SDKの一部分+その他)とされる。


;Java API
;Java API


APIは、アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、メソッド、フィールド、定数の集合である。プログラマはこれを用いてアプリケーションソフトウェアの開発を行う。
APIは、アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、メソッド、フィールド、定数の集合である。プログラマはこれを用いて各種ソフトウェアの開発を行う。APIは基本的にクラスライブラリの所属に沿って、パッケージ(''package'')と呼ばれる名前空間で分類されて提供されている。パッケージは各ワードをピリオトで連結して階層化されている。先頭ワードのjavaは開発元提供の純正基礎版を意味する。他に純正拡張版のjavax、任意団体提供のorg、企業提供のcomがある

# java.lang - Java言語仕様の基礎を扱う。
# java.io - ファイル入出力など。
# java.util - 配列の操作とList、Set、Mapなどのデータ集合。
# java.math - 各種計算。
# java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
# java.net - ソケットを置いてリモートポートを開きストリーム入出力を扱う。
# java.awt - ウィンドウとスイッチとイメージを表示し、ユーザーからの操作を認識する。
# java.applet - アプレット生成用。
# java.beans - Java版ソフトウェアコンポーネント作成用。
# java.sql - SQLを扱う。
# java.rmi - 外部マシン上にあるプロセス・メソッドを呼び出す。
# java.security - 様々な通信セキュリティプロトコルを扱う。
# java.nio - 連続バイトデータを扱う。
# java.lang.reflect - クラス定義を動的に操作する。


;統合開発環境と開発支援ツール
;統合開発環境と開発支援ツール
統合開発環境(IDE)は、JDKを中核にしてビジュアルエディターやビルドマネージャーなどの様々な開発支援機能を備えたソフトウェアである。JDKのみだと、メモ帳でプログラムを書きコマンドラインでコンパイルしコンソールでデバッグをするという極めて原始的な作業になるが、IDEを使用する事で多機能エディタコーディングとビルド過程の自動化と視覚的なデバッグが可能になる。Java開発用のIDEは様々な企業および団体から公開されている。


統合開発環境(IDE)は、JDKを中核にしてビジュアルエディターやビルドマネージャーなどの様々な開発支援機能を備えたソフトウェアである。JDKのみだと、メモ帳でプログラムを書きコマンドラインでコンパイルしコンソールでデバッグをするという極めて原始的な作業になるが、IDEを使用する事で多機能エディタコーディングとビルド過程の自動化と視覚的なデバッグが可能になる。Java開発用のIDEは様々な企業と任意団体から公開されている。
*'''[[NetBeans]]''' - [[サン・マイクロシステムズ|サン社]]→[[オラクル (企業)|オラクル社]]を中心に開発されている[[オープンソース]]の[[統合開発環境|IDE]]。Win版、Linux版。Solaris版、MacOS版。[https://ja.netbeans.org NetBeans.org] [http://www.netbeans.jp/ NetBeans.jp]。

*[[Eclipse (統合開発環境)|'''Eclipse SDK''']] - [[IBM]]→[[Eclipse財団]]によって管理されている[[オープンソース]]の[[統合開発環境|IDE]]。後述するWebSphere Studioから見れば、共通基盤であるWebSphere Studio Workbenchを公開した物であるとも言える。WebSphere Studio、JBuilderを始め、多数の派生[[Java]][[統合開発環境|IDE]]が存在する。Win版、Linux版、Solaris版、MacOS版。[http://www.eclipse.org/ eclipse.org(英語)] [http://eclipsewiki.net/eclipse/ EclipseWiki(日本語)]。
*'''[[NetBeans]]''' - [[サン・マイクロシステムズ|サン社]]→[[オラクル (企業)|オラクル社]]製。オープンソースIDE。[https://ja.netbeans.org NetBeans.org] [http://www.netbeans.jp/ NetBeans.jp]。
*'''WebSphere Studio''' - [[IBM|IBM社]]。Eclipseをベースに、有料プラグイン製品を組み合わせた[[統合開発環境|IDE]]<ref>{{Cite web|url=https://tech.nikkeibp.co.jp/it/members/ITPro/J2EE/20031030/1/|title=EclipseとWebSphere Studioはどう違うのか {{!}} 日経 xTECH(クロステック)|accessdate=2019-11-17|publisher=Nikkei Business Publications, Inc.|author=星 暁雄=日経BP Javaプロジェクト|website=日経 xTECH(クロステック)|date=2003-10-31}}</ref>。[[WebSphere]]ブランドの[[WebSphere Application Server|Application Server]] と統合されている。Win版、Linux版。Solaris版、MacOS版。現在は営業活動が終了し、後述のIBM Rational Application Developerへ置換されている。[http://www.ibm.com/jp/software/websphere/ft/studio/index.html WebSphere開発ツール]。
*[[Eclipse (統合開発環境)|'''Eclipse SDK''']] - [[IBM|IBM社]]→[[Eclipse財団]]。オープンソースIDE。Java用IDEの共通基盤存在である。ここからWebSphere Studio、JBuilderなど様々なIDEが派生している。[http://www.eclipse.org/ eclipse.org(英語)] [http://eclipsewiki.net/eclipse/ EclipseWiki(日本語)]。
*'''{{仮リンク|IBM Rational Application Developer for WebSphere Software|en|Rational Application Developer}}''' - [[IBM]]。WebSphere Studioの後継製品。IBM [[Rational]]ブランドの[[統合開発環境|IDE]]。
*'''WebSphere Studio''' - IBM社。商用IDE。Eclipseに有料プラグイン機能を組み合わせたもの<ref>{{Cite web|url=https://tech.nikkeibp.co.jp/it/members/ITPro/J2EE/20031030/1/|title=EclipseとWebSphere Studioはどう違うのか {{!}} 日経 xTECH(クロステック)|accessdate=2019-11-17|publisher=Nikkei Business Publications, Inc.|author=星 暁雄=日経BP Javaプロジェクト|website=日経 xTECH(クロステック)|date=2003-10-31}}</ref>。現在はアップデート停止。[http://www.ibm.com/jp/software/websphere/ft/studio/index.html WebSphere開発ツール]。
*'''[[JBuilder]]''' - [[ボーランド]]→[[エンバカデロ・テクノロジーズ|エンバカデロ社]]。JBuilder 2007 以降、Eclipseベースとなっている。Win版、Linux版。Solaris版、MacOS版。[http://www.embarcadero.com/jp/products/jbuilder JBuilder]。
*'''{{仮リンク|IBM Rational Application Developer for WebSphere Software|en|Rational Application Developer}}''' - IBM社。[[Rational]]ブランド商用IDE。WebSphere Studioの後継製品。
*[[JDeveloper|'''Oracle JDeveloper''']] - オラクル。Oracle Application Serverと統合されている。Win版、Linux版。Solaris版。2005年6月28日に無料化した。[http://www.oracle.com/technetwork/jp/developer-tools/jdev/overview/ JDeveloper]。
*'''[[JBuilder]]''' - [[ボーランド|ボーランド社]]→[[エンバカデロ・テクノロジーズ|エンバカデロ社]]。商用IDE。JBuilder2007からEclipseベースになっている。[http://www.embarcadero.com/jp/products/jbuilder JBuilder]。
*[[JDeveloper|'''Oracle JDeveloper''']] - オラクル社。Oracle Application Serverと統合されている。2005年6月28日に無料化した。[http://www.oracle.com/technetwork/jp/developer-tools/jdev/overview/ JDeveloper]。
*'''Oracle Workshop for WebLogic''' - オラクル社([[BEAシステムズ|BEAシステムズ社]])。{{仮リンク|Oracle WebLogic Server|en|Oracle WebLogic Server|label=WebLogic}}と統合されている。[http://www.oracle.com/technetwork/jp/developer-tools/workshop/ Oracle Workshop for WebLogic]。
*'''Oracle Workshop for WebLogic''' - オラクル社([[BEAシステムズ|BEAシステムズ社]])。{{仮リンク|Oracle WebLogic Server|en|Oracle WebLogic Server|label=WebLogic}}と統合されている。[http://www.oracle.com/technetwork/jp/developer-tools/workshop/ Oracle Workshop for WebLogic]。
*'''[[BlueJ]]''' - Deakin University([[オーストラリア|]])とUniversity of Kent([[イングランド|]]とサン社が共同開発したフリーソフトウェア、Javaの学習に適したインタラクティブな統合開発環境。[http://www.bluej.org/ BlueJ]。
*'''[[BlueJ]]''' - サン社とDeakin University(豪)とUniversity of Kent(英)が共同開発したフリーIDE。[http://www.bluej.org/ BlueJ]。
*'''[[IntelliJ IDEA]]''' - JetBrains社が開発販売している商用の統合開発環境。[[Android Studio]]のベースになっている。[http://www.jetbrains.com/idea/ IntelliJ IDEA]。
*'''[[IntelliJ IDEA]]''' - JetBrains社。[[Android Studio]]のベースになった商用IDE。[http://www.jetbrains.com/idea/ IntelliJ IDEA]。
*'''JCreator''' - Xinox Software社が開発販売している商用の統合開発環境。[http://www.jcreator.com/ JCreator]。
*'''JCreator''' - Xinox Software社商用IDE。[http://www.jcreator.com/ JCreator]。
*'''[[Xcode]]''' - [[アップル (企業)|アップル社]]。[[macOS]]に付属する統合開発環境
*'''[[Xcode]]''' - [[アップル (企業)|アップル社]]。[[macOS]]に付属するIDE


開発サポートツールは、プロジェクト管理、自動ビルド、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。
開発サポートツールは、プロジェクト管理、自動ビルド、デバッグ、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。


*'''[[Apache Ant]]''' - Javaアプリケーションのビルドツール。[[Apacheソフトウェア財団]]のプロジェクトによって開発された。コンパイル、[[バージョン管理システム]]との連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。[[make]] と同種のツールであり、[[Extensible Markup Language|XML]]ファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
*'''[[Apache Ant]]''' - Javaアプリケーションのビルドツール。[[Apacheソフトウェア財団]]のプロジェクトによって開発された。コンパイル、[[バージョン管理システム]]との連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。[[make]] と同種のツールであり、[[Extensible Markup Language|XML]]ファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
583行目: 410行目:
ここには、Java Community Process のもとで開発された拡張機能と関連技術のみを記述します。
ここには、Java Community Process のもとで開発された拡張機能と関連技術のみを記述します。
=================================================================================-->
=================================================================================-->
Javaプラットフォームの構成要素であるJavaテクノロジは各企業、団体、開発者から様々な形で公開されている。具体的な実装形態としては、主にorgパッケージなどJava API、JREとJDKを中核にした独自仕様コンテナ、プログラム&ソフトウェアコンポーネント&データベース&通信プロトコル等を組み合わせた統合システムなどがある。各開発元から提示された技術は、[[Java Community Process|Javaコミュニティプロセス(JCP)]]による審査を合格した後にJavaテクノロジの一つとして認証される。これを標準化(''standardization'')と言う。Javaテクノロジは多岐に渡る分野に存在している。その一例を以下に列挙する。
Javaテクノロジは各企業、任意団体、開発者グループから様々な形で公開されている。具体的な形態例では、org/comパッケージのAPI、JREとJDKを中核にした独自仕様コンテナ、プログラム&ソフトウェアコンポーネント&データベース&通信プロトコル等を組み合わせた統合システムなどがある。各開発元から提示された技術は、[[Java Community Process|Javaコミュニティプロセス(JCP)]]による審査を合格した後にJavaテクノロジの一つとして認証される。これを標準化(''standardization'')と言う。Javaテクノロジは多岐に渡る分野に存在している。その一例を以下に列挙する。


*[[Java Naming and Directory Interface|JNDI]] (Java Naming and Directory Interface) - ネーミングサービスと[[ディレクトリ・サービス|ディレクトリサービス]]を扱う
*[[Java Naming and Directory Interface|JNDI]] (Java Naming and Directory Interface) - ネーミングサービスと[[ディレクトリ・サービス|ディレクトリサービス]]を扱う
607行目: 434行目:
*Java Media APIs [http://java.sun.com/products/java-media/](リンク切れ?) - java.media - マルチメディア向けAPI--><!--
*Java Media APIs [http://java.sun.com/products/java-media/](リンク切れ?) - java.media - マルチメディア向けAPI--><!--
*Shared Data ToolkitSound-->
*Shared Data ToolkitSound-->
*[[BD-J|Blu-ray Disc Java]] - ブルーレイディスクで実行される各種コンテンツ制作用
*[http://community.java.net/javadesktop/ JavaDesktop]
*[[JavaOne]]
*[[BD-J|Blu-ray Disc Java]]
*[[FindBugs]] - javaソースコードからコーディングレベルのバグを発見する開発支援ツール。


=== Javaテクノロジの標準化 ===
=== Javaテクノロジの標準化 ===
{{Main|Java Community Process}}
{{Main|Java Community Process}}


Javaプラットフォームの構成要素であるJavaテクノロジの標準化(''standardization'')は、[[Java Community Process|Javaコミュニティプロセス(JCP)]]が管理している。標準化とはその技術の品質を評価してJavaテクノロジの一つとして認証する事である。JCPが発行している数々の[[:Category:Java specification requests|Java仕様要求書(JSRs)]]によって、Javaテクノロジが準拠すべき仕様規定と技術基準は逐一定められている。その中にはJava言語に追加される新たな言語仕様などのコアテクノロジも含まれている。例として主に5.0版に関連したJSRsを以下に列挙する。
Javaテクノロジの標準化(''standardization'')は、[[Java Community Process|Javaコミュニティプロセス(JCP)]]が管理している。標準化とはその技術の品質を評価してJavaテクノロジの一つとして認証する事である。JCPが発行している数々の[[:Category:Java specification requests|Java仕様要求書(JSRs)]]によって、Javaテクノロジが準拠すべき仕様規定と技術基準は逐一定められている。その中にはJava言語に追加される新たな言語仕様などのコアテクノロジも含まれている。例として主に5.0版に関連したJSRsを以下に列挙する。


*[http://www.jcp.org/en/jsr/detail?id=14 JSR 14] ''Add [[総称型|Generic Types]] To The Java Programming Language'' (J2SE 5.0)
*[http://www.jcp.org/en/jsr/detail?id=14 JSR 14] ''Add [[総称型|Generic Types]] To The Java Programming Language'' (J2SE 5.0)
628行目: 452行目:
=== Javaオープンソースモデル ===
=== Javaオープンソースモデル ===
;Javaテクノロジのオープンソース化
;Javaテクノロジのオープンソース化
1996年のJava登場初期から、ベンダー元の[[サン・マイクロシステムズ|サン社]](後に[[オラクル (企業)|オラクル社]]が買収)は、Java仮想マシンとJavaクラスライブラリの仕様を公開しており、サードパーティによるJavaプラットフォーム移植と関連ソフトウェアと拡張テクノロジの開発を促していた。しかし過度の技術流出を避ける為の枠組みとして、ソースコードの改変までは認めていなかった。この部分的オープンソース制度に便乗する形で2004年から、[[IBM|IBM社]]と[[BEAシステムズ|BEAシステムズ社]](後にオラクル社が買収)が、独自のオープンソース化を目的にしたJava関連ソフトウェア&拡張テクノロジの開発を支援するプロジェクトを立ち上げていた。その中でJava仮想マシンと標準クラスライブラリの互換製品も登場していた。


らの標準化が進むつれJavaコミュニティプロセスへの影響力低下を懸念したサン社は、IBM主体によるオープンソース化プロジェクトへの協力に消極的な立場を取ていたが、2006年から方針を変えて賛同し、2007年5月8日にはJava SE 6を「[[OpenJDK]]」として[[GNU General Public License|GNU一般公開ライセンス]]の下でリリースした<ref>{{Cite web|title=Sun Fulfills Promise of Open and Free Java Technology and Releases Java SE Platform to OpenJDK Community|url=http://www.sun.com/aboutsun/pr/2007-05/sunflash.20070508.3.xml|author=Sun Microsystems, Inc|date=2007-5-8|accessdate=2009年9月16日}}</ref>。OpenJDKではソースコードの改変も認められた。「[[GNU Classpath]]」は、J2SE 1.4のクラスライブラリの99%以上を実装し[http://www.kaffe.org/~stuart/japi/htmlout/h-jdk14-classpath.html]、J2SE 5.0では95%以上を実装している[http://www.kaffe.org/~stuart/japi/htmlout/h-jdk15-classpath.html]。またOpenJDKの開発にはIBM社も協力している。
1996年のJava登場初期から、ベンダー元の[[サン・マイクロシステムズ|サン社]](後に[[オラクル (企業)|オラクル社]]が買収)は、Java仮想マシンとJavaクラスライブラリの仕様を公開しており、サードパーティによるJavaプラットフォーム移植と関連ソフトウェアと拡張テクノロジの開発を促していた。しかし過度の技術流出を避ける為の枠組みとして、ソースコードの改変までは認めていなかった。2004年になると[[IBM|IBM社]]と[[BEAシステムズ|BEAシステムズ社]](後にオラクル社が買収)が、この部分的オープンソース制度に便乗する形で、関連ソフトウェアと拡張テクノロジの開発を支援するプロジェクトを立ち上げた。の目的は彼独自のJavaオープンソース化を実現する事であり、Java仮想マシンと標準クラスライブラリの互換製品を登場させ、その他の標準化も徐々進めいた。そうした中でJavaコミュニティプロセスへの影響力低下を懸念したサン社は、このIBM主体によるオープンソース化プロジェクトへの協力に消極的な立場を取り続けていた。しかし業界の変化を悟ったサン社は2006年から方針を変えて賛同し、2007年5月8日にはJava SE 6を「[[OpenJDK]]」として[[GNU General Public License|GNU一般公開ライセンス]]の下でリリースした<ref>{{Cite web|title=Sun Fulfills Promise of Open and Free Java Technology and Releases Java SE Platform to OpenJDK Community|url=http://www.sun.com/aboutsun/pr/2007-05/sunflash.20070508.3.xml|author=Sun Microsystems, Inc|date=2007-5-8|accessdate=2009年9月16日}}</ref>。OpenJDKではソースコードの改変も認められた。「[[GNU Classpath]]」は、J2SE 1.4のクラスライブラリの99%以上を実装し[http://www.kaffe.org/~stuart/japi/htmlout/h-jdk14-classpath.html]、J2SE 5.0では95%以上を実装している[http://www.kaffe.org/~stuart/japi/htmlout/h-jdk15-classpath.html]。またOpenJDKの開発にはIBM社も協力している。


;GNUプロジェクト
;GNUプロジェクト
[[GNUプロジェクト]]は「[[GNU Interpreter for Java]]」と[[GNUコンパイラコレクション]]のJava版である「[[GNU Compiler for Java]]」を公開している。「GNU Compiler for Java」は、ahead-of-timeコンパイル機能を備えており、Javaのソースコードとバイトコードを、ネイティブマシンコード(Windowsではexeファイル)に変換できる。また、Java標準クラスライブラリの互換版である「[[GNU Classpath]]」も公開している。Windows環境下の「GNU Compiler for Java」は、[[MinGW]] (WindowsAPIを使う為のライブラリ) と併せて、[[Cygwin]](Unix環境を再現するソフトウェア)の環境上で実行できる。なお、Cygwinの使用は[[GNU General Public License|GNU一般公開ライセンス]]に従う必要があるが、MinGWの方はライセンスフリーである。
[[GNUプロジェクト]]は「[[GNU Interpreter for Java]]」と[[GNUコンパイラコレクション]]のJava版である「[[GNU Compiler for Java]]」を公開している。「GNU Compiler for Java」は、ahead-of-timeコンパイル機能を備えており、Javaのソースコードとバイトコードを、ネイティブマシンコード(Windowsではexeファイル)に変換できる。また、Java標準クラスライブラリの互換版である「[[GNU Classpath]]」も公開している。Windows環境下の「GNU Compiler for Java」は、[[MinGW]] (WindowsAPIを使う為のライブラリ) と併せて、[[Cygwin]](Unix環境を再現するソフトウェア)の環境上で実行できる。なお、Cygwinの使用は[[GNU General Public License|GNU一般公開ライセンス]]に従う必要があるが、MinGWの方はライセンスフリーである。


;その他
;Windows / Linux用プラットフォーム
メジャーなオペレーティングシステム(OS)では、営利企業および任意団体による独自開発のJREとJDKが公開されている事が多い。

*[[Linux]] / [[IA-32]]プラットフォーム : オラクル、Blackdown、IBM、Kaffe.org、GNUプロジェクトなどがJREやJDKを実装・提供している。
*[[Microsoft Windows|Windows]]/IA-32プラットフォーム : オラクル、IBMなどがJREやJDKを実装・提供している。

;Excelsior JET
米Excelsior社がExcelsior JETというahead-of-timeコンパイラを販売している<ref>http://www.excelsior-usa.com/jet.html</ref>。Java SE 用に書かれたプログラムをWindowsのネイティブマシンコードであるexeファイル(実行ファイル)に変換して、起動の高速化やアプリケーションの[[難読化コード|難読化]]を実現できる。

;Windows用実行ファイル化ツール
[[Jar]]ファイルをWindous用実行ファイル(.exe)にラッピングする以下のツールが存在する。
*[http://exewrap.osdn.jp/ exewrap]
*[http://jsmooth.sourceforge.net/ JSmooth]
*[http://launch4j.sourceforge.net/ Launch4j]
*[http://nsis.sourceforge.net/Java_Launcher_with_automatic_JRE_installation NSIS - Java Launcher with automatic JRE installation]


* WindowsやLinuxなどメジャーなオペレーティングシステムでは、オラクル社、IBM社、Blackdown社などの企業またはGNUプロジェクト、Kaffe.orgなどの任意団体による独自開発のJREとJDKが公開されている。
JSmoothなどは、Java実行環境が無い時はそれも自動インストールする機能を備えている。また、純粋なJava実行環境では不可能だったタスクアイコンを表示させる機能も備えている。
* 米国Excelsior社が「Excelsior JET」というahead-of-timeコンパイラを販売している<ref>http://www.excelsior-usa.com/jet.html</ref>。JavaソースコードをそのままWindows用実行ファイルに変換して起動の高速化やアプリケーションの[[難読化コード|難読化]]を実現できる。
<!-- ただし、これらのツールには最新の[[JDK]]でコンパイルされた[[jar]]ファイルには対応していないなどの欠点もある上、{{いつ範囲|date=2019年2月|近年}}の [[Microsoft Windows|Windows]] にはほとんどにJavaがインストールされているため、あまり普及していない。 -->
* [[Jar|Jarファイル]]をWindous用実行ファイルにラッピングにするツールも存在する。「[http://exewrap.osdn.jp/ exewrap]」「[http://jsmooth.sourceforge.net/ JSmooth]」「[http://launch4j.sourceforge.net/ Launch4j]」「[http://nsis.sourceforge.net/Java_Launcher_with_automatic_JRE_installation NSIS Java Launcher with automatic JRE installation]」である。JSmoothは、Java実行環境が無い時はそれも自動インストールする機能を備えている。また純粋なJava実行環境では不可能だったタスクアイコンを表示させる機能も備えている。<!-- ただし、これらのツールには最新の[[JDK]]でコンパイルされた[[jar]]ファイルには対応していないなどの欠点もある上、{{いつ範囲|date=2019年2月|近年}}の [[Microsoft Windows|Windows]] にはほとんどにJavaがインストールされているため、あまり普及していない。 -->


== Java認定資格 ==
== Java認定資格 ==

2020年3月16日 (月) 05:32時点における版

Java
パラダイム オブジェクト指向プログラミング関数型プログラミング命令型プログラミングジェネリックプログラミング、コンポーネント指向 ウィキデータを編集
登場時期 1995年 (29年前) (1995)
設計者 Java Community Process
開発者 サン・マイクロシステムズオラクル ウィキデータを編集
最新リリース Java Standard Edition 13.0.2/ 2020年1月14日 (4年前) (2020-01-14)
型付け 強い静的型付け
主な処理系 Javaプラットフォーム
影響を受けた言語 Simula 67、SmalltalkObjective-CObject PascalOberon-2EiffelModula-3MesaC SharpUCSD Pascalボックス化可変長引数アノテーションニクラウス・ヴィルト、Patrick Naughton、Foreach文 ウィキデータを編集
影響を与えた言語 C#, D, Dart, Groovy, Scala, Kotlin, Ceylon
プラットフォーム Solaris, Linux, Windows,
macOS, AIX, System i,
Embedded Systems
ライセンス GNU General Public LicenseJava Community Process
ウェブサイト www.oracle.com/java/ ウィキデータを編集
拡張子 java、class、jar
テンプレートを表示

Java(ジャバ)は、プログラミング言語Javaと、Javaプログラムの実行環境および開発環境を合わせた演算プラットフォームの双方を指す総称である[1]

Javaソフトウェアは、企業内システムの構築のほか、家電機器および乗用車搭載の組み込みシステム、産業機械のマイクロ制御装置、各種モバイル端末スマートカードサーバーマシン、パーソナルコンピュータ、スマートフォンなどの様々な環境に普及しており、幅広い用途で使用されている。

Java言語は、近年のグローバルな機械学習の需要増加により世界シェアでPythonには抜かれたが、システム開発では依然信頼されている言語であり、世界シェア2位の座を保っている[2]

Javaの特徴

Java開発元のSun Microsystemsを買収し、Java開発を引き継いだOracleによる公式な主張は下記である[3]。企業内システムの開発に最適であるとしている。

Java reduces costs, shortens developer timeframes, drives innovation, and improves application services as the programming language of choice for enterprise architecture, finance, and HR. Java is used in many industries including manufacturing, automotive, insurance, and public sector. Javaは、コストを削減し、開発者の時間枠を短縮し、イノベーションを促進し、エンタープライズアーキテクチャ、財務、およびHRに最適なプログラミング言語としてアプリケーションサービスを改善します。 Javaは、製造、自動車、保険、公共部門などの多くの業界で使用されています。

また、全世界では、3億のデバイスで動作し、1200万人が開発で使用し、250億のJava Card(Javaアプリケーションが動作するスマートカード)が購入されていると発表している[3]

Javaの構文

Javaプログラムの構文は、C言語またはC++によく似たものである。オブジェクト指向言語としての一面が強調されがちだが、幾つかの構文ルールの違いを除いては、C言語とほぼ同様にシンプルな手続き型プログラミングのスタイルでもプログラミングできる。Javaはオブジェクト指向のプログラミングスタイルをそれほど強制しない。

オブジェクト指向

Javaの主要プログラミングパラダイムは、クラスベースオブジェクト指向である[4]。オブジェクト指向にある複数の実装スタイルの一つであるクラスベースは、手続き型プログラミングを土台にして実践できる比較的万人向けのものである。クラスベース・オブジェクト指向はその名の通りクラスの仕組みを中心にする。クラスは任意のフィールド(=変数)と任意のメソッド(=関数)をひとまとめにしたものである。クラスのデザインはフィールド構成を中心にして、それに関連したメソッドを備えるのが基本とされる。クラス定義内の要素はフィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラスの六種類である。内部クラスはクラス内で定義される入れ子のクラスであり、コンポジションパターンの実装が主な用途になる。メソッド内部で任意のクラスを派生元にした無名クラスを定義する事もできる。これはプロトタイプベース・オブジェクト指向のスタイルを取り入れたもので、その場限りのクラスをコードに組み込める利便性の高い機能である。クラスの定義文には上述のフィールド名やメソッド文などの要素がずらずらと羅列される。Javaのプログラムは、この1個以上のクラス定義文を組み合わせて形成される。Javaはクラスベース・オブジェクト指向の三つの要点とされるカプセル化継承多態性をサポートしている。

Javaのカプセル化は、クラス定義文に記述する四つのアクセス修飾子(privatepackageprotectedpublic)によってサポートされている。アクセス修飾子はフィールド定義とメソッド定義のそれぞれ先頭に記されて可視性を決定する。privateは同クラス内限定、packageは同クラス内と同パッケージ内限定、protectedは同クラス内と同パッケージ内と派生クラス内限定、publicはどこからでもアクセス可能を意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性はOOPでは変則的なファイル単位のpackageなので隠蔽性よりも利便性が重視されている。

Javaの継承は、スーパークラスが一つに限られる単一継承をサポートしており、多重継承は除外されている。継承用のアクセス修飾子は無くpublic継承に統一されている。継承によって既存クラスの設計を引き継ぎつつ任意のフィールドとメソッドを追加した独自のクラスを作成できる。また既存とオリジナルの全てのクラスは、基礎APIで用意されているObjectクラスを継承最上位の基底クラスにするのが強制されている。Objectクラスにはロック機能が備えられているのでオブジェクト指向とマルチスレッド同期の調和に一役買っている。

Javaの多態性は、インターフェースと仮想関数を中心にしてサポートされている。親クラスの定義文でvirtual指定されたメソドが仮想関数を表す抽象メソッドになり、その子クラスの定義文で処理内容を記述された同名のメソッドが仮想関数のプロセスを表す実装メソッドになる。Javaは強い静的型付けと共に安全な動的型付けも採用しており、instanceof演算子による型審査と、(typename)によるダウンキャストの二つがそれにあたる。ダウンキャスト失敗時は例外発生によってフォローされる。両者とも実行時決定でありデータの遅延バインディングをサポートしている。Javaの中でも比較的重視されているインターフェースは抽象メソッドだけで構成される純粋抽象クラスであり、クラス定義文のimplementsによって任意の数だけ実装指定できる。インターフェースは各クラスの様々な動作局面表現を促して設計を明確にする。Javaにはリフレクションも導入されている。これはクラスの構造内容を操作できる機能であり、Javaの理念である堅牢性とセキュリティを壊しかねない危うさを伴うが、分散コンピューティングの発展などを視野に入れたJavaテクノロジの拡張に不可欠とされて専用APIが用意された。リフレクションはメッセージベース・オブジェクト指向のスタイルに近い柔軟な多態性の動的ディスパッチを実装できる他、Javaプログラムの為のメタ的なモニタリングツールおよびフレームワークの構築などが主な用途になる。

プラットフォーム非依存

プラットフォーム非依存とは、Javaプログラムが特定のハードウェアおよびオペレーティングシステムの機能に依存する事なく、Java実行環境が導入されたあらゆるコンピューター環境上において共通した動作を見せる事を意味する。”Write once, run anywhere”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)がそのスローガンとされていた。Javaのプラットフォーム非依存性は次のようにして実現されている。

  1. Javaコンパイラは、Javaプログラムのソースコードを、Javaバイトコードと呼ばれる中間表現にコンパイルする。Javaバイトコードはアセンブラのニーモニックに似たもので、Java仮想マシン上で実行される専用のコードになる。Javaバイトコードは多くのプラットフォームでは、Javaクラスファイルと呼ばれるclass拡張子のファイルにまとめられる。
  2. Java仮想マシンは、各プラットフォームの環境の違いを吸収するクッション的なソフトウェアである。Java仮想マシンは家電や車両搭載のマイクロコントローラ、モバイル端末、ICカード、サーバーマシンなどの様々なコンピューター環境に対応したバージョンが提供されており、それぞれのプラットフォームにJava実行環境のコアテクノロジとしてインストールされる。
  3. Java仮想マシンは、指定されたJavaクラスファイルJavaクラスローダーで読み込み、その中のJavaバイトコードを逐一解釈しながら実行する。これはインタプリタ式に行うものと、実行時コンパイラで走行させるものがある。

公開初期のインタプリタ式のみで走行されるJavaプログラムの実行速度は遅かったが、実行時コンパイラ方式の導入によって速度問題に一定の解決が見られた。実行時コンパイラとは一定範囲のJavaバイトコードをまとめて機械語コードにコンパイルして継続的に実行させる技術である。後にそのコンパイル処理を更に最適化した動的再コンパイル(dynamic recompilation)という拡張技術も導入され、Javaプログラムの実行速度問題はほぼ解決されたと見なされている。

マルチスレッド

Javaプログラムは複数のスレッドを同時に走らせる事ができる。多数のスレッドを扱う大規模システムにも対応できる各種設計を備えており、その一つであるスレッドグループは、各スレッドを役割や性質でグループ化して様々な一括操作を可能にしている。これはクライアント・サーバーシステムの実装でよく用いられる。また膨大な数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成と破棄の繰り返しによる負荷増大を解決する為の、スレッドプールとタスクキューを併せたいわゆるモニタの技法を提供するAPIも用意されている。

マルチスレッド「同期」の特徴としては、前述のObjectクラスの基底継承強制により全てのインスタンスにロック機能を持たせている事が挙げられる。このロックはsynchronizedキーワードで示される標準同期構文で使用される。標準同期はJava仮想マシン内包仕様であり、機能的にはミューテックスに相当する。synchronized修飾子の各メソッドはその全体が排他制御エリアになり、その呼び出し時はthisインスタンスからロックをデフォルト取得するので、イメージ的にインスタンス単位になる排他制御を自然に表現している。このロック普遍化はオブジェクト指向との調和を実現する設計と言える。synchronized静的メソッドの方は、システム内に暗黙的に存在するクラスオブジェクトからロック取得を試みるので、これもイメージ的に同型インスタンス共通単位の排他制御を表現している。また、synchronized()定義子の波括弧でくくられた任意のコードブロックは、this以外のインスタンスもロックオブジェクトにできる排他制御エリアになるので、きめ細かな同期も表現できる。このミューテックス相当の標準同期は様々なロック手法にも応用可能であるが、実際にカウントセマフォやバリアや読み書きロックなどを再現しようとすると余計なワンステップを必要としがちなので、それらのロック手法は専用のAPIで用意されている。

ガベージコレクション

Javaプログラムのメモリ管理は、Java仮想マシンに備えられたガベージコレクション機能によって行われる。ガベージコレクションとは、すでにどこからも参照されていないオブジェクトを自動的に特定して破棄し、その占有メモリを解放する機能である。一つのシステムスレッドに乗って未参照のオブジェクトを探し続ける実行プロセスはガベージコレクタと呼ばれる。ガベージコレクタは、どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する事もできる。これによってプログラマの負担は大幅に軽減される事になった。JavaのモデルであるC++では、オブジェクトの生成と破棄が正確に対応するように注意深くプログラムする必要があった。破棄の失敗は即メモリリークにつながり、その積み重ねはやがてメモリ不足を引き起こす事になる。メモリ管理はプログラマにとって負担が大きくバグ発生の温床になっていた。堅牢性を旨とするJavaではこの問題の根本的解決の為にガベージコレクションの機能に力が入れられ、世代別ガベージコレクションという拡張技術も導入された。

なお、ガベージコレクションはメモリリークの問題を完全に解消する訳ではなく、例えばもう必要ないはずのオブジェクトを現行タスクが常時参照するコレクションオブジェクトに格納しているような場合は、ガベージコレクタはこれを特定しない。ガベージコレクタの挙動をプログラマ側はほとんど把握できないが特に影響はない。確実ではないが、ガベージコレクタの実行タイミングを指定する事はできる。

分散コンピューティング

この対象はオブジェクト要求ブローカーを用いた分散システムdistributed system)の実現であり、ネットワーク上に存在する様々なプラットフォームの間で互いに異なる環境を意識せずにリクエストとレスポンスを送りあい、任意のタスクを遂行するインフラストラクチャの構築をサポートする。各プラットフォーム上で稼働されるサーバープログラム、クライアントプログラム、あるいはその双方を兼ねるプログラムは、それぞれオブジェクトを内包しており、オブジェクト要求ブローカーを通して他のオブジェクトにリクエストを送る。それらは分散オブジェクトと呼ばれている。Javaで扱われるオブジェクト要求ブローカーの実装は、JavaオリジナルのRMIと、CORBAの二つである。業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるように様々な設計が施されている。

分散コンピューティングからは外れるが、JavaのネットワークAPIは、TCP/IPUDPプロトコル上のソケット通信、セキュアなSSL / TLSソケット通信を扱っており、後にJava XMLアーキテクチャとして発展するXMLパーサおよびXML構造を操作できるDOMSAXを備えている。これらはカスタムメイドなネットワークシステムの構築をサポートする。

セキュリティ

分散ネットワークを指向するJavaは、サンドボックスモデルに基づいたセキュリティ機構を備えている。これは遠隔ダウンロードされた追加プログラム(Javaバイトコード)による実行環境への予期せぬ操作やユーザー資源への好ましくないアクセスを防止するためのものである。分散(distributed)指向のJavaプログラムでは必要に応じてクラスを追加ロードする機会が多いので、サンドボックス実行は必須である。サンドボックス機能は、仮想マシン上の実行が同時にモニタリングを兼ねているので無理なく実現されている。大抵は以下の手順になる。

  • クラスローダーはバイトコードをダウンロードして順次クラス化する。
  • 実行環境にあるセキュリティポリシーファイルに基づいて各種パーミッションが各クラスに付与される。セキュリティポリシーは主に指定クラス名とその対象パーミッションを照合するものである。
  • 実行環境に元からあるクラスは、オールパーミッション付与がデフォルトである。
  • スレッドがリソースアクセスなどの操作をする度に、セキュリティマネージャが現行のパーミッションを調べて対象外なら例外を発生させる。
  • その際はスレッドの各通過メソッドのクラスのパーミッションが全チェックされ、原則的に最少パーミッションの方に合わせる。
  • appletクラスなどパーミッションのないクラスを通ったスレッドは、完全なサンドボックス実行になりほとんどのリソースにアクセスできなくなる。

実際には上記に加えて、各クラスを同一操作&同一セキュリティレベルでまとめるドメイン機構、認証と承認によるユーザーパーミッション機構、バイトコード送受信時の署名付き証明書機構などが組み合わされて実装運用される。

Java仮想マシンは、主にメモリ境界とバッファオーバーフローに対するチェックを随時行いながらプログラムを走行させるので実行時の強固な堅牢性を実現している。また、クラスロード時にそのバイトコードを検証して一定のニーモニック整列基準を満たしているか判定する機能も備えており、あからさまなコード暴走や致命的エラーの頻発を事前に抑止している。APIの方では、暗号アルゴリズムモジュール、特定パーミッションを必要とするJavaプログラムコードを実行できるユーザーの認証をサポートするモジュール、セキュアなソケット通信のSSL / TLSプロトコルを扱うモジュールを備えている。

Javaの歴史

誕生の経緯

家電向けプロジェクトの立ち上げ(1990年12月)

ジェームズ・ゴスリン

Javaの歴史は、1990年12月にサン・マイクロシステムズ社が、次世代の家電製品が内蔵するマイクロコントローラ向けのプログラミング言語を開発するステルス・プロジェクトを立ち上げた事から始まる。サン社はこの分野が重要市場になると予測していた。サン社のエンジニアであるジェームズ・ゴスリンとマイク・シェルダンの参加により、現実味を帯びたプロジェクトの名称は正式に「グリーンプロジェクト」と定められた。彼らは、カリフォルニア州メンローパーク市サンドヒルロードにある小さなオフィスで開発を始めた。

Oak言語とGreen OSの誕生(1991年)

グリーンチーム内では当時隆盛していたオブジェクト指向を採用する事で一致していた。彼らはそのモデル言語であるC++に白羽の矢を立て、当初はその移植版を検討していたが、プロジェクトの対象が家電製品の組み込みシステムであったために自然と却下された。C++の複雑な言語仕様はコンピュータ資源の浪費とプログラムエラーの発生率を高めがちであり、堅牢性と安全性が至上命題である家電製品の制御装置には不向きであると判断されたためだった。加えてC++では移植性に対応できない点も指摘されており、プロジェクトの中でプラットフォーム非依存が特に重要な議題として上がった。彼らはC++に代わる言語の開発と同時に、あらゆる機器に容易に移植できるプラットフォームの必要性も認識するようになった。こうして新言語プログラムの動作環境になる「Green OS」の開発も始められた。

一方で、Mesa言語とC言語の長所を理想にしていたサン社エンジニアのビル・ジョイは、Further(彼方へ)という名の論文を書いてC++をモデルにした新しいオブジェクト指向言語の開発を自社に提案した。それを受けてまずジェームズ・ゴスリンがC++の拡張言語を提出した。ゴスリンはこれを「C++ ++ --」と名付けたがすぐに取り下げ、改めて一から設計しなおしたプログラミング言語を誕生させた。オフィスの側に立つオークの木を眺めながら開発を進めていたゴスリンは、この新しい言語にOakという名前をつけた。時に1991年秋であり、この「Oak」がJavaの前身になった。それと並行してOakプログラムが用いる基本ライブラリも整備された。

携帯端末、テレビ機器市場への参入と撤退(1992年~1994年5月)

Javaのマスコット「Duke」with BSDライセンス

1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとグリーンプロジェクトの対象は、当初の家電機器から携帯情報端末(PDA)にシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このユーザーインターフェース上で「Duke」が初登場している。1992年11月、サン社はファーストパーソン社を設立しグリーンチームをそちらに所属させた。次世代のインタラクティブ機器に関心を持つファーストパーソン社は、ケーブルテレビ用セットトップボックス事業への参入を決めて、タイムワーナー社と3DO社にそれぞれOakテクノロジを提示したが、その高度な柔軟さが逆に倦厭されて契約実現には到らなかった。サン本社はファーストパーソン社の解散を決め、グリーンチームも本社に戻された。

ワールドワイドウェブ参入(1994年6月~1994年9月)

1994年6月、サン社技術部長ジョン・ゲージがジェームズ・ゴスリンビル・ジョイパトリック・ノートンエリック・シュミットら集めて、延べ3日に渡るブレインストーミングが行われた。ここで彼らはワールドワイドウェブをプロジェクトの本命に据える事で一致した。革新的なウェブブラウザである「NCSA Mosaic」の登場に触発された彼らは、インターネットの世界がケーブルテレビのそれを超えたインタラクティブな媒体に発展しつつある事を認識していた。パトリック・ノートンはOakテクノロジをベースにした「WebRunner」という小さなウェブブラウザを開発した。Oakによる小さなアクティブプログラムが埋め込まれたウェブページにアクセスすると、WebRunner上でマウス操作に連動するインタラクティブなアニメーションが表示された。

Javaの始動(1994年10月~1996年1月)

HotJavaブラウザ

1994年秋までにグリーンチームは、OakをJavaに、WebRunnerを「HotJava」に改称した。その理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたという。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(Bean)はJavaテクノロジ内でコンポーネントを指す用語にされている。

1994年10月、JavaランタイムとHotJavaブラウザがサン社幹部社員の前でデモンストレーションされ、α版が社内公開された。1995年5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここではJavaアプレットの技術が大々的にアピールされた。同時にネットスケープ社が「Netscape Navigator」ブラウザへもこのアプレット機能を配備するとアナウンスして業界の注目を集めた。1995年秋にβ版が社外公開された。1996年1月9日にサン社は正式にJavaソフトウェア部門を立ち上げた。その2週間後に最初の公開バージョンである「JDK 1.0」が市場リリースされた。

バージョン履歴

1996年の第一回公開のJavaプラットフォームは「Java Development Kit」通称「JDK」と呼ばれており、最初のバージョン数値は「1.0」に定められた。通称とバージョン値を合わせたものが製品名とされて「JDK 1.0」で市場導入されている。当初は開発チームの控えめにしたい意向で小数点第一位がメジャーバージョン値にされたが、これは不必要な謙遜という声もあった。

1998年の第三回メジャーバージョン公開である「1.2」では大幅な技術刷新をアピールするべく「Java 2」と次世代呼称にした。これは経営側の判断だったので開発側は小数点第一位の数値改訂を譲らなかった。製品仕様の確立で「Development Kit」は「Platform」に置き換えられた。マーケットの分化を示唆する「Standard」のエディション名も付けられた。こうして「Java 2 Platform, Standard Edition」の通称「J2SE」とバージョン値「1.2」を合わせた製品名「J2SE 1.2」で市場導入された。この次世代呼称と小数点第一位の混在名は意味が不明瞭で製品バージョンへの理解を妨げかねないと不評を買っている。この時はまだStandard版だけであったが、翌1999年にEnterprise版の「J2EE 1.2」とMicro版の「J2ME 1.2」が市場導入されて3エデイションになった。

2005年の第六回メジャーバージョン公開である「1.5」から整数部分がメジャーバージョン値にされて「5.0」になり、通称と合わせた製品名は「J2SE 5.0」になった。他のエディションは後発なので「J2EE 1.4」「J2ME 1.4」のままだった。この頃に「Java Card Platform」が正規のエディション認定されているが、バージョン体系は独自のままの「Java Card 2.2」であり、これは以降も継続された。

2006年の第七回メジャーバージョン公開で「Java 2」の次世代呼称が外されて「Java」になり、バージョン値からも小数点以下が外された。「Java Platform, Standard Edition」「Java Platform, Enterprise Edition」「Java Platform, Mirco Edition」の各通称と各バージョン値を合わせた製品名は「Java SE 6」「Java EE 5」「Java ME 5」になった。なお、マイナーバージョンアップの際には再び小数点以下が付けられた。この命名方式は現在まで続いている。

JDK 1.0 (1996年1月23日)

最初のバージョン[5]。まだ国際化対応はされず英語版のみだった。

JDK 1.1 (1997年2月19日)

国際化対応され日本語版も追加された[6]

J2SE 1.2 (1998年12月8日)「Playground」

ここからコードネームが付けられるようになった[7]

  • strictfpキーワード(言語仕様、浮動小数点計算)
  • 仮想マシンに実行時コンパイラ(Just-In-Time Compiler
  • Javaプラグイン(WEBブラウザへのアプレット実行環境挿入)
  • Java Internet Description Language(IDLからJava CORBA用スタブ&スケルトンを生成)
  • Swing(グラフィカルAPI)
  • Collection Framework(コレクションAPI)

J2SE 1.3 (2000年5月8日)「Kestrel」

ここからメジャーバージョンのコードネームは鳥獣名、マイナーバージョンは昆虫名にするのが慣例になった[8][9]

J2SE 1.4 (2002年2月6日)「Merlin」

このバージョンからJavaコミュニティプロセス(Java Community Process)による仕様策定が開始された[10][11][12]

  • assert キーワード(言語仕様、例外発生ディレクティブ)
  • 例外処理の連鎖格納(言語仕様)
  • Java Web Start
  • Regular Expression(正規表現API)
  • Non-blocking I/O API(非遮断ストリーム入出力API)
  • Logging(ログ取りAPI)
  • Image I/O(JPEGPNGを使えるAPI)
  • Preferences(ツリー型のJava式セーブデータ収納庫API)
  • Java API for XML ProcessingXMLパーサ&マニュピレータAPI、XSLTフォーマットAPI)
  • Java Cryptography Extension(暗号化API)
  • Java Secure Socket Extension(TLS / SSL用API)
  • Java Authentication and Authorization Service(認証&権限サービスAPI)

J2SE 5.0 (2004年9月30日)「Tiger」

言語仕様に大幅な拡張が加えられた[13][14]

  • ジェネリクス(コレクションコンテナに収納要素の型指定が可能 List<T>
  • オートボクシングプリミティブラッパークラスの自動変換による相互代入)
  • 列挙型enumキーワードで定数列挙の型を定義)
  • 可変引数(最終引数の型名+3個のドットで自動配列化 void drawText(String... lines)
  • アノテーション@キーワードで、クラスメタデータの各要素に任意のタグワードと注釈を埋め込む)
  • 拡張for文(コレクションコンテナから各要素を順々に取り出すのが便利になるループ文)
  • 静的インポート文(他クラスの定数のフルパスをimportで指定可能)
  • Java Management Extensions(MBeanを用いた依存性の注入による実行プログラム動的再構成の最適化)
  • メモリモデルの改善によるスレッド処理高速化

Java SE 6 (2006年12月11日)「Mustang」

仮想マシンを含めた既存機能の改善と洗練に力が注がれた。

  • Scripting for the Java Platform(スクリプト言語との連携サポート)
  • Java Architecture for XML Binding(Java XMLアーキテクチャ)
  • Java API for XML Web Services
  • Java Compiler API(Javaコンパイラへのディレクティブ的なAPI)
  • Unicode正規化 API
  • Plugging annotation(コンパイル解析用途のアノテーション)
  • Swingの高速化、Windows用ルック&フィールの追加、Windowsタスクトレイ表示
  • Update10で、Java Quick Starter(アプリ起動高速化)Java Kernel(Java環境インストール高速化)を搭載[15]

Java SE 7 (2011年7月28日)「Dolphin」

サン社を買収したオラクル社による初のメジャーバージョンリリースである。

  • 言語仕様の細かな拡張
  • invoke_dynamic API(実装クラスとメソッドシグネチャの組み換えによる動的メソッド呼び出し)
  • New File I/O Library(新しいファイル入出力ライブラリ)
  • Concurrency Library(並列処理系ライブラリ)
  • コレクションフレームワークへのティムソートの採用
  • 暗号化APIに楕円曲線暗号を導入
  • ネットワークAPIにStream Control TransmissionプロトコルとSockets Directプロトコルを導入
  • グラフィック関連の強化
  • Update2で、JavaFXの導入

Java SE 8 (2014年3月18日)

ここでコードネームが廃止された[16]

  • 言語仕様にラムダ式の導入(引数 -> 関数式)
  • 関数型インターフェース
  • Stream API(コレクションコンテナ各要素への連続的なラムダ式適用)
  • JavaScriptのコードを埋め込めるNashorn Javaスクリプトエンジンの搭載(Project Nashorn)
  • Annotation on Java types(型アノテーション)
  • Repeating annotations(反復アノテーション)
  • Date and Time API(日付時刻)
  • 静的結合 Java Native Interface ライブラリ
  • Java ME 8 にCLDCCDCが統合された[17]

Java SE 9 (2017年9月21日)

ここからメジャーバージョンは一定の新機能蓄積を待たずに公開する毎年3月と9月の年2回定期リリース制に変更された[18]

  • 言語仕様にpackageを統合分類する「module」の導入(Project Jigsaw)
  • 言語仕様の細かな拡張(Project Coin)
  • 並列処理APIのアップデート、Flowクラスの追加など
  • Compact Stringの追加
  • 「JShell」の搭載。コンソール形式でJavaコードを入力し実行結果を確認できる
  • 「The Java Linker」の搭載。ユーザー環境に最適なモジュールと仮想マシンモードを自動選択実行する
  • 仮想マシンに前方コンパイル(Ahead-Of-Time Compilation)の導入
  • XML catalogs(永続的URLへのマッピング)
  • HiDPI Graphicsの導入(画像拡大縮小の改善)

Java SE 10 (2018年3月20日)

JSR 383にて仕様規定[19]。ここから追加機能の大半は規範テクノロジ相当のJSR(仕様要求)ではなく、拡張テクノロジ相当のJEP(改良提案)になった。

  • ローカル変数の型推論
  • ガーベジコレクタ関連
  • ルート証明書
  • Unicode language-tag extensions(Unicode言語タグの取り扱い)

Java SE 11 (2018年9月25日)

JSR 384にて仕様規定[20]。Java開発環境として「Oracle JDK」と「OpenJDK」の二つが提供されるようになり、前者の商用利用は有償サポート契約を結んだ顧客のみになった。Java EEのアップグレードがエクリプス財団による「Jakarta EE」に移譲されたので、JDKにEnterprise版連携モジュールが含まれなくなった。CORBAモジュールも外された。Java FXも取り除かれた。

  • Dynamic class-file constants(invoke_dynamic拡張、動的ロードされたクラスへの定数ブートストラップ呼出)
  • ラムダ式への型推論
  • HTTPクライアント実装へのAPI
  • Flight recorder(Javaプログラム実行トレース用の軽快な各種データ収集フレームワーク)
  • Unicode 10.0.0のサポート
  • ガーベジコレクタ関連

Java SE 12 (2019年3月19日)

JSR 386にて仕様規定。アップデートで令和改元に向けたセキュリティ対策が施された。

  • ガーベジコレクタ関連
  • switch文の拡張
  • JVM Constants API(主にクラスの動的ロードに関連した仮想マシン内の定数プールの操作)

Java SE 13(2019年9月17日)

JSR 388にて仕様規定。「数百の小粒改良、数千のバグ修正」と宣伝された。

  • ソケットAPIの再実装
  • switch文の拡張
  • Text Blocks(文字列定義の複数行化)

Javaプログラミング例

アプリケーション(コマンドライン)

// Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
  • Javaプログラムでは全てのフィールド(変数)とメソッド(関数)がclass内に記述される。
  • Javaプログラムは、public void static main (String[] args)から開始される。これはプログラムの中で一つだけ定義されるクラスメソッド(静的メソッド)である。argsはJava実行環境から受け取る開始時パラメータであり、実行時のコマンドラインで指定された文字列が渡される。
  • System.outは、Systemクラスのクラスフィールド(静的フィールド)であるoutを指す。outは、PrintStreamクラスのインスタンスである。out.println("文字列")は、outによるprintlnメソッドの呼び出しを指す。

サーブレット

// Hello.java
import java.io.*;
import javax.servlet.*;

public class Hello extends GenericServlet {
    public void service(ServletRequest request, ServletResponse response)
        throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();
        pw.println("Hello, world!");
    }
}
  • import文は、コンパイル時にJavaコンパイラに対し、このソースコード内ではjava.ioパッケージおよびjavax.servletパッケージ内のすべてのpublicなクラスとインタフェースを、パッケージ名をつけないでクラス名 / インタフェース名だけで使うことを伝える。
  • Hello class extends GenericServlet の部分は、Helloクラスが GenericServletクラスを継承すること(GenericServletサブクラスであること)を記述している。
  • GenericServletクラスは、サーブレットの一般的なフレームワークを提供する。サーバ上で、クライアントから送られてきた要求をサーブレットに渡し、サーブレットのライフサイクルを制御する。
  • HelloクラスはServletで宣言されたservice(ServletRequest, ServletResponse)メソッドをオーバーライドしている。このメソッドは、クライアントからの要求を扱うコードを開発者が記述する場所として、サーブレットフレームワークが開発者に提供しているメソッドである。service(ServletRequest, ServletResponse)メソッドは、ServletRequestオブジェクトとServletResponseオブジェクトをHelloに渡す。HelloServletRequestServletResponseを受け取る。
    • ServletRequestオブジェクトは、クライアントから送られてきた要求を表すオブジェクトである。
    • ServletResponseオブジェクトは、クライアントに送り返す応答を表すオブジェクトである。
  • service(ServletRequest, ServletResponse)メソッドのthrows ServletException, IOExceptionの部分では、このメソッドがServletExceptionもしくはIOException例外を投げる可能性があることを宣言している。これらの例外は、Hello サーブレットの実行中に何らかの問題が起こり、クライアントからの要求に正常な応答を返すことができなくなった場合に投げられる。
  • setContentType(String)メソッドを呼び出して、クライアントに返すデータのMIME Content-Type"text/html" に設定する。
  • getWriter()メソッドを呼び出してPrintWriterオブジェクトを取得する。このオブジェクトを使ってクライアントに返すデータを書き出すことができる。
  • println(String)メソッドを呼び出して、"Hello, world!" 文字列を応答データとして書き出す。
  • そして応答データはソケットストリームに書き出され、クライアントに返される。

Javaプラットフォーム

Javaプラットフォーム(Java Platform)は、Javaプログラムを開発または実行する為のソフトウェア群の総称である。Javaプラットフォームは対象環境に合わせて、JREおよびJDKの構成内容と、追加されるJavaテクノロジの組み合わせを変えたエディションに編集されて公開されている。Javaテクノロジは権利元ベンダーだけでなくサードパーティ側からも提供されており、その標準化はJavaコミュニティプロセス(JCP)が管理している。Javaテクノロジの中核となるJREとJDKはオープンソース化されているので、各企業各団体及び開発者各自が営利または非営利で膨大な数のソフトウェアと関連技術を公開し、巨大なITエコシステムを構築している。

エディション

2019年現在、Java権利元のオラクル社は、対象環境に合わせたJavaプラットフォームの4つのエディションを公開している。エディションによってJava実行環境とJava開発キットに含まれるツール構成に違いがあり、またクラスライブラリとAPIの構成内容も異なっている。Java仮想マシンの性能にも差異がある。JDK 1.1までは単体エディションで、J2SE 1.2から3エディションに分かれた。J2SE 5.0頃から拡張テクノロジの一つであったJava Cardが昇格して4エディションとなった。

Java Platform, Standard Edition (Java SE)
スマートフォンやタブレットを含むパーソナルコンピュータ向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言える。
Java Platform, Enterprise Edition (Java EE) / Jakarta EE
サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。
2017年9月にOracle社は、今後のJava EEのアップグレードがエクリプス財団によって行われる事を発表した[21][22]。JavaEEの収益性低下とクラウドコンピューティング技術への対応急務がその背景にあったとされる。Java EEの商標は現行版のサポートを続けるOracle社が保持したので、エクリプス財団による今後のバージョンはJakarta EEの名称で公開される事になった[23]
Java Platform, Micro Edition (Java ME)
組み込みシステムマイクロコントローラ向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
Java Card
スマートカード(ICカード)、小型メモリデバイス上で運用されるプログラムを開発するためのエディションである。現在[いつ?]ではSIMカードATMカードなど幅広い分野に普及している。Java仮想マシンの機能は非常にコンパクトにまとめられており、幾つかのプリミティブ型も省略されている。故に特殊なプログラミングスタイルが求められる。

Java実行環境(JRE)

Java実行環境 (Java Runtime Environment) は、Javaアプリケーションを実行するために必要なソフトウェアである。Java仮想マシン、''Java.exe''のスターターを含めた各種実行サポートツール、Javaクラスライブラリで構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。

Javaクラスライブラリ

Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。

  1. 基礎ライブラリ - Java言語仕様の基礎を扱う。
  2. 入出力ライブラリ - ファイル入出力など。
  3. データコレクションライブラリ - 配列の操作とList、Set、Mapなどのデータ集合。
  4. 数学ライブラリ - 各種計算。
  5. 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
  6. ネットワークライブラリ - ソケットを置いてリモートポートを開きストリーム入出力を扱う。
  7. GUIライブラリ - ウィンドウとスイッチとイメージを表示し、ユーザーからの操作を認識する。
  8. Javaアプレットライブラリ - アプレット生成用。
  9. Javaビーンズライブラリ - Java版ソフトウェアコンポーネント作成用。
  10. データベース接続ライブラリ - SQLを扱う。
  11. リモートメソッドライブラリ - 外部マシン上にあるプロセス・メソッドを呼び出す。
  12. セキュリティライブラリ - 様々な通信セキュリティプロトコルを扱う。
  13. バッファストリームライブラリ - 連続バイトデータを扱う。
  14. リフレクションライブラリ - クラス定義を動的に操作する。
Javaアプリケーションの形態

Java実行環境に用意されている特定のJavaクラスライブラリを利用する事でJavaプログラムは結果的に、以下の四種類のアプリケーション形態に派生する。

Javaアプリケーション (application)
パーソナルコンピュータなどのローカル環境で実行されるJavaプログラム。「Java Web Start」は任意のjnlpファイル(java network launching protocol)をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。
Javaアプレット (applet)
サーバーからダウンロードされてWEBブラウザ上で実行されるJavaプログラム。サンドボックス機能下で厳しい動作制約が加えられている。当初はJavaの目玉技術であったが、様々な理由からさほど普及しなかった。
Java Cardプラットフォームの分野であるスマートカード(ICカード)上で動くJavaプログラムもアプレットと呼ばれており、現在ではこちらに舞台を移している。
Javaサーブレット (servlet)
サーバーマシンで実行されるJavaプログラム。その名の通り手軽にサーバープログラムを実装出来るが、大規模サーバーの構築にも適している。サーブレットはクライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。PerlなどによるCGIに比べ、サーバ側の負荷が低いなどのメリットがある。
Javaサーバーページ (server page)
サーブレットをWEBサーバー用に特化したものであり、XHTML (HTML) 内に記述するJavaプログラムである。WEBクライアントからのリクエストに伴うパラメータに従い、それをサーバー側で解釈してWEBページ内容を動的に生成、変化させてレスポンスする。コードは似ているが、JavaScriptの様にブラウザ側で実行するスクリプトではない。類似の技術にActive Server PagesPHPがある。

Java開発キット(JDK)

Java開発キット (Java Development Kit) は、Javaプログラムを開発するために必要なソフトウェアである。Java実行環境も内包している。Javaコンパイラなどの基本開発ツール、各種開発サポートツール、Java APIで構成されている。前述のエディションによって開発ツール内容とAPI構成に違いがある。Java開発キットの呼称はこれまでに何度か変更されている。

  • J2SE 1.2.2_004 までは、JDK(Java Development Kit)と呼んでいた。
  • J2SE 1.4 までは、Java2 SDK(Java2 Software Development Kit)と呼んでいた。
  • J2SE 5.0 からは再び、JDK(Java Development Kit)と呼んだ。
  • JavaSE 7 からは、エンタープライズ版とマイクロ版では Java SDK(Java Software Development Kit)と呼び、スタンダード版とカード版では JDK(Java Development Kit)と呼ぶようになった。JDKはSDKの拡張サブセット(SDKの一部分+その他)とされる。
Java API

APIは、アプリケーション・プログラミング・インタフェースの頭字語であり、Javaクラスライブラリ内部からプログラマに向けて外部公開されているクラス、インタフェース、メソッド、フィールド、定数の集合である。プログラマはこれを用いて各種ソフトウェアの開発を行う。APIは基本的にクラスライブラリの所属に沿って、パッケージ(package)と呼ばれる名前空間で分類されて提供されている。パッケージは各ワードをピリオトで連結して階層化されている。先頭ワードのjavaは開発元提供の純正基礎版を意味する。他に純正拡張版のjavax、任意団体提供のorg、企業提供のcomがある。

  1. java.lang - Java言語仕様の基礎を扱う。
  2. java.io - ファイル入出力など。
  3. java.util - 配列の操作とList、Set、Mapなどのデータ集合。
  4. java.math - 各種計算。
  5. java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
  6. java.net - ソケットを置いてリモートポートを開きストリーム入出力を扱う。
  7. java.awt - ウィンドウとスイッチとイメージを表示し、ユーザーからの操作を認識する。
  8. java.applet - アプレット生成用。
  9. java.beans - Java版ソフトウェアコンポーネント作成用。
  10. java.sql - SQLを扱う。
  11. java.rmi - 外部マシン上にあるプロセス・メソッドを呼び出す。
  12. java.security - 様々な通信セキュリティプロトコルを扱う。
  13. java.nio - 連続バイトデータを扱う。
  14. java.lang.reflect - クラス定義を動的に操作する。
統合開発環境と開発支援ツール

統合開発環境(IDE)は、JDKを中核にしてビジュアルエディターやビルドマネージャーなどの様々な開発支援機能を備えたソフトウェアである。JDKのみだと、メモ帳でプログラムを書きコマンドラインでコンパイルしコンソールでデバッグをするという極めて原始的な作業になるが、IDEを使用する事で多機能エディタコーディングとビルド過程の自動化と視覚的なデバッグが可能になる。Java開発用のIDEは様々な企業と任意団体から公開されている。

開発サポートツールは、プロジェクト管理、自動ビルド、デバッグ、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。

  • Apache Ant - Javaアプリケーションのビルドツール。Apacheソフトウェア財団のプロジェクトによって開発された。コンパイル、バージョン管理システムとの連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。make と同種のツールであり、XMLファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
  • Apache Maven - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
  • Gradle - Apache AntApache Mavenのコンセプトに基づくオープンソースビルド自動化システム。
  • JUnit - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。xUnitの一種である。テスト駆動開発を支援する。

様々なJavaテクノロジ

Javaテクノロジは、各企業、任意団体、開発者グループから様々な形で公開されている。具体的な形態例では、org/comパッケージのAPI、JREとJDKを中核にした独自仕様コンテナ、プログラム&ソフトウェアコンポーネント&データベース&通信プロトコル等を組み合わせた統合システムなどがある。各開発元から提示された技術は、Javaコミュニティプロセス(JCP)による審査を合格した後にJavaテクノロジの一つとして認証される。これを標準化(standardization)と言う。Javaテクノロジは多岐に渡る分野に存在している。その一例を以下に列挙する。

  • JNDI (Java Naming and Directory Interface) - ネーミングサービスとディレクトリサービスを扱う
  • JSML (Java Speech Markup Language) - 音声合成システムにテキストの注釈を追加する
  • JDBC - データベース接続の API
  • JDO (Java Data Objects) - Javaオブジェクト永続化のインタフェース
  • JAI (Java Advanced Imaging) - 画像を扱うための高水準なオブジェクト指向 API
  • JAIN (Java API for Integrated Networks) - 統合された通信ネットワークの API
  • JDMK (Java Dynamic Management Kit) - JMX仕様に基づいた開発支援ソフトウェア
  • Jini - 分散システムを構築するネットワークアーキテクチャ
  • Jiro - 分散した記憶装置を管理する技術
  • JavaSpaces - 分散環境でJavaオブジェクトの送受信・永続化などを支援する技術
  • JML (Java Modeling Language) - 契約による設計(DbC)を指向した形式言語をソースコードに導入する
  • JMI (Java Metadata Interface) - Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
  • JMX (Java Management Extensions) - 分散オブジェクト環境における管理と監視を行う技術
  • JSF (JavaServer Faces) - WEBクライアントに一定のデザインに基づいたUIを提供するサーバー用技術
  • JNI (Java Native Interface) - 他の言語で実装されたネイティブコードを呼び出す技術
  • JXTA - Peer to Peer (P2P) の仮想ネットワークのためのオープンプロトコル
  • Java 3D - 3次元グラフィクスプログラミングのための高水準な API Java 3D
  • JOGL (Java OpenGL) - OpenGL を使う3Dグラフィクスプログラミングのための低水準な API
  • LWJGL - ゲーム開発用のAPI。OpenGLOpenALOpenCLを扱える。様々なゲーム用コントローラーも扱える。
  • OSGi - サービスの動的な管理と遠隔保守
  • Blu-ray Disc Java - ブルーレイディスクで実行される各種コンテンツ制作用

Javaテクノロジの標準化

Javaテクノロジの標準化(standardization)は、Javaコミュニティプロセス(JCP)が管理している。標準化とはその技術の品質を評価してJavaテクノロジの一つとして認証する事である。JCPが発行している数々のJava仕様要求書(JSRs)によって、Javaテクノロジが準拠すべき仕様規定と技術基準は逐一定められている。その中にはJava言語に追加される新たな言語仕様などのコアテクノロジも含まれている。例として主に5.0版に関連したJSRsを以下に列挙する。

Javaオープンソースモデル

Javaテクノロジのオープンソース化

1996年のJava登場初期から、ベンダー元のサン社(後にオラクル社が買収)は、Java仮想マシンとJavaクラスライブラリの仕様を公開しており、サードパーティによるJavaプラットフォーム移植と関連ソフトウェアと拡張テクノロジの開発を促していた。しかし過度の技術流出を避ける為の枠組みとして、ソースコードの改変までは認めていなかった。2004年になるとIBM社BEAシステムズ社(後にオラクル社が買収)が、この部分的オープンソース制度に便乗する形で、関連ソフトウェアと拡張テクノロジの開発を支援するプロジェクトを立ち上げた。その目的は彼ら独自のJavaオープンソース化を実現する事であり、Java仮想マシンと標準クラスライブラリの互換製品を登場させ、その他の標準化も徐々に進めていた。そうした中でJavaコミュニティプロセスへの影響力低下を懸念したサン社は、このIBM主体によるオープンソース化プロジェクトへの協力に消極的な立場を取り続けていた。しかし業界の変化を悟ったサン社は2006年から方針を変えて賛同し、2007年5月8日にはJava SE 6を「OpenJDK」としてGNU一般公開ライセンスの下でリリースした[25]。OpenJDKではソースコードの改変も認められた。「GNU Classpath」は、J2SE 1.4のクラスライブラリの99%以上を実装し[1]、J2SE 5.0では95%以上を実装している[2]。またOpenJDKの開発にはIBM社も協力している。

GNUプロジェクト

GNUプロジェクトは「GNU Interpreter for Java」とGNUコンパイラコレクションのJava版である「GNU Compiler for Java」を公開している。「GNU Compiler for Java」は、ahead-of-timeコンパイル機能を備えており、Javaのソースコードとバイトコードを、ネイティブマシンコード(Windowsではexeファイル)に変換できる。また、Java標準クラスライブラリの互換版である「GNU Classpath」も公開している。Windows環境下の「GNU Compiler for Java」は、MinGW (WindowsAPIを使う為のライブラリ) と併せて、Cygwin(Unix環境を再現するソフトウェア)の環境上で実行できる。なお、Cygwinの使用はGNU一般公開ライセンスに従う必要があるが、MinGWの方はライセンスフリーである。

その他
  • WindowsやLinuxなどメジャーなオペレーティングシステムでは、オラクル社、IBM社、Blackdown社などの企業またはGNUプロジェクト、Kaffe.orgなどの任意団体による独自開発のJREとJDKが公開されている。
  • 米国Excelsior社が「Excelsior JET」というahead-of-timeコンパイラを販売している[26]。JavaソースコードをそのままWindows用実行ファイルに変換して起動の高速化やアプリケーションの難読化を実現できる。
  • JarファイルをWindous用実行ファイルにラッピングにするツールも存在する。「exewrap」「JSmooth」「Launch4j」「NSIS Java Launcher with automatic JRE installation」である。JSmoothは、Java実行環境が無い時はそれも自動インストールする機能を備えている。また純粋なJava実行環境では不可能だったタスクアイコンを表示させる機能も備えている。

Java認定資格

認定パス

オラクル[注釈 1]は複数のJava認定資格を主催している。Javaのバージョンアップに伴って資格も変更されることがある。ただし、変更前に取得した資格は変更後も有効である。認定試験に不合格だった場合、その試験日を含めて14日以内は同一試験を受験することができない。

現在受験可能な資格[27][28][29][30]
資格名 レベル 対象バージョン
Java Foundations Certified Junior Associate Junior Associate 不明
Oracle Certified Java Programmer, Bronze SE 7/8[注釈 2] Bronze Java SE 7/8
Oracle Certified Java Programmer, Silver SE 8[注釈 3] Associate Java SE 8
Oracle Certified Java Programmer, Gold SE 8[注釈 4] Professional Java SE 8
Oracle Certified Professional, Java EE 7 Application Developer Professional Java EE 7
Oracle Certified Master, Java EE 6 Enterprise Architect Master Java EE 6
Oracle Certified Expert, Java EE 6 Enterprise JavaBeans Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 JavaServer Faces Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 Web Services Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 Java Persistence API Developer Expert Java EE 6
Oracle Certified Expert, Java EE 6 Web Component Developer Expert Java EE 6

脚注

注釈

  1. ^ 買収前はサン・マイクロシステムズによって。
  2. ^ 日本でのみ行われている[31]
  3. ^ 日本以外での Oracle Certified Associate, Java SE 8 Programmer に対応。
  4. ^ 日本以外での Oracle Certified Professional, Java SE 8 Programmer に対応。

出典

  1. ^ What is Java and why do I need it?” (英語). 2019年2月4日閲覧。
  2. ^ PYPL PopularitY of Programming Language index” (英語). pypl.github.io. 2019年10月19日閲覧。
  3. ^ a b Java Software | Oracle”. www.oracle.com. 2019年10月19日閲覧。
  4. ^ 広辞苑 第六版
  5. ^ "JAVASOFT SHIPS JAVA 1.0" (Press release) (英語). Sun Microsystems. 2008年6月25日時点のオリジナルよりアーカイブ。2006年7月8日閲覧 {{cite press release2}}: 不明な引数|deadlinkdate=は無視されます。 (説明)
  6. ^ "SUN SHIPS JDK 1.1 -- JAVABEANS INCLUDED" (Press release) (英語). Sun Microsystems. 2008年5月6日時点のオリジナルよりアーカイブ。2006年7月8日閲覧 {{cite press release2}}: 不明な引数|deadlinkdate=は無視されます。 (説明)
  7. ^ "SUN DELIVERS NEXT VERSION OF THE JAVA PLATFORM" (Press release) (英語). Sun Microsystems. 2008年5月6日時点のオリジナルよりアーカイブ。2006年7月8日閲覧 {{cite press release2}}: 不明な引数|deadlinkdate=は無視されます。 (説明)
  8. ^ "SUN MICROSYSTEMS RELEASES FASTEST CLIENT-SIDE JAVA PLATFORM TO DATE" (Press release) (英語). Sun Microsystems. 2008年5月16日時点のオリジナルよりアーカイブ。2006年7月8日閲覧 {{cite press release2}}: 不明な引数|deadlinkdate=は無視されます。 (説明)
  9. ^ JavaTM 2 SDK, Standard Edition, version 1.3 の新機能および機能拡張の概要”. 2019年3月4日閲覧。
  10. ^ JSR 59
  11. ^ "SUN ANNOUNCES LATEST VERSION OF JAVA 2 PLATFORM STANDARD EDITION" (Press release) (英語). Sun Microsystems. 2008年9月6日時点のオリジナルよりアーカイブ。2006年7月8日閲覧 {{cite press release2}}: 不明な引数|deadlinkdate=は無視されます。 (説明)
  12. ^ JavaTM 2 SDK, Standard Edition, version 1.4 の新機能および機能拡張の概要”. 2019年3月4日閲覧。
  13. ^ "Sun Ships New Version of Java Platform" (Press release) (英語). Sun Microsystems. 2005年2月15日時点のオリジナルよりアーカイブ。2006年7月8日閲覧 {{cite press release2}}: 不明な引数|deadlinkdate=は無視されます。 (説明)
  14. ^ J2SE(TM) 5.0 の新機能”. 2006年7月8日閲覧。
  15. ^ 「Java SE 6 Update 10」公開、動作速度を高速化”. 2008年12月3日閲覧。
  16. ^ JSR 337: Java SE 8 Release Contents
  17. ^ 7年ぶりのJavaOne Tokyoでは「Javaテクノロジーのすべてを見せる」 - クラウド Watch”. 2012年2月22日閲覧。
  18. ^ Oracle Java SE サポート・ロードマップ”. 2018年10月19日閲覧。
  19. ^ JSR 383: Java™ SE 10 (18.3)
  20. ^ JSR 384: JavaTM SE 11 (18.9)
  21. ^ Opening Up Java EE - An Update” (英語). Oracle (2017年9月12日). 2019年3月10日閲覧。
  22. ^ EE4J、EclipseファウンデーションがオープンソースJava EEを準備”. InfoQ (2017年11月16日). 2019年3月10日閲覧。
  23. ^ Java EE は Jakarta EE となる”. InfoQ (2018年3月5日). 2019年3月10日閲覧。
  24. ^ 星 暁雄=日経BP Javaプロジェクト (2003年10月31日). “EclipseとWebSphere Studioはどう違うのか | 日経 xTECH(クロステック)”. 日経 xTECH(クロステック). Nikkei Business Publications, Inc.. 2019年11月17日閲覧。
  25. ^ Sun Microsystems, Inc (2007年5月8日). “Sun Fulfills Promise of Open and Free Java Technology and Releases Java SE Platform to OpenJDK Community”. 2009年9月16日閲覧。
  26. ^ http://www.excelsior-usa.com/jet.html
  27. ^ オラクル Java SE 認定資格パス 概要”. 2019年3月7日閲覧。
  28. ^ オラクル Java EE and Web Services 認定資格パス 概要”. 2019年3月7日閲覧。
  29. ^ Java Foundations Certified Junior Associate (novice-level certification)”. 2019年3月10日閲覧。
  30. ^ 認定試験一覧”. 2019年3月7日閲覧。
  31. ^ Java資格が大幅リニューアル。Bronze/Silver/Goldが登場”. 2019年3月7日閲覧。

参考文献

関連項目

外部リンク

オラクル・JCP関連
技術情報