Java

Oracleによる主張

Java開発元のSun Microsystemsを買収し、Java開発を引き継いだOracleによる公式な主張は下記である。企業内システムの開発に最適であるとしている。
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アプリケーションが動作するスマートカード）が購入されていると発表している。

スレッド

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も用意されている。

ガベージコレクション

Javaでは簡潔なメモリモデルを採用しており、プログラマがメモリ(主記憶装置)を管理する負担を軽減する。あらゆるオブジェクトはメモリ内のヒープという領域に割り当てられる。メモリ管理は、Java仮想マシンに統合されたガベージコレクションの機能によって行われる。従来のオブジェクト指向プログラミング言語であるC++では、ヒープ領域に生成したオブジェクトについて、もはや必要が無くなった時に破棄する指示を、プログラマが自分で責任をもって行わなければならなかった。これは、C++プログラマにとっては負担が大きく複雑で間違えやすい作業であり、ソフトウェアの安全性・開発効率・保守性を損なう要因だった。Javaではガベージコレクションの機能があるため、このようなことは無く、プログラマの負担は大きく軽減される。
ガベージコレクション機能を備えた事により、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、プログラマの負担が完全に解消されるわけではないものの、大きく軽減される。Java1.2以降では世代別ガベージコレクションというより効率的な技術を導入している。
ただしJavaのガベージコレクション機能は、メモリリークの問題を完全に解消するわけではない。プログラマが、自分のプログラムでもはや必要のないはずのオブジェクトへの参照を誤って保持し続けた場合は、やはりメモリリークが発生する可能性がある。
別の表現で述べると、Javaでは、メモリリークは概念的に高い水準においては、発生する可能性が残っているということである。概念的に低い水準においては、ガベージコレクションが正しく実装されたJava仮想マシンを使えば、メモリリークが発生する可能性は無くなった。全体として、Javaのガベージコレクション機能により、C++の場合と比べると、オブジェクトの生成と削除は、より簡潔になり、潜在的に安全になり、また多くの場合は高速になっている。
C++においても、Javaと同等のメモリ管理の高速性と効率性を実現することは可能ではあるが、先に述べた通り、複雑な作業で間違いやすく、完璧に行おうとすれば開発期間が非常に長くなり、開発したソフトウェアはかなり複雑で難解になる。たとえば、C++で特定のクラスを対象として、高速実行およびメモリ利用の断片化の最小化を、高水準で達成できるメモリ管理モデルで設計開発する技法があるが、こうした技法は複雑である。
ガベージコレクションの機構は、Java仮想マシンに組み込まれており、開発者からは、事実上隠蔽されている。開発者は、場合にもよるが、ガベージコレクションがいつ起こるか意識しなくて良い。というのも多くの場合、ガベージコレクションの実行は、プログラマが自分で書いたコードによって明示的に起こる何らかの挙動と、必ずしも関連しているわけではないからである。

ネットワーク

Javaでは充実したライブラリにより、コンピュータネットワークを活用するソフトウェアを、効率良く開発できる。Javaはその初期のバージョンから、TCP/IP のライブラリを備えており、ネットワークでソケット通信を行うソフトウェアを簡単に実装できた。分散オブジェクト環境 (Java RMI, CORBA) のソフトウェアの開発も早い時期からできるようになっていた。またさまざまなネットワークプロトコルの高水準なライブラリが使えるようになっている。W3Cにより標準化された、汎用マークアップ言語のひとつであるXMLで記述された文書を扱うライブラリも早期に実装・標準サポートされた。充実したネットワーク機能とXML文書を扱う機能を有効に組み合わせることにより、Javaは標準機能だけでも高度なシステムを構築できる言語の一つとなっている。
XML文書を扱う技術とネットワーク機能を有効に組み合わせることにより、高度なシステムやサービスを構築できるようになっている。

例外処理

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

その他

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

草創

1990年頃、サンのエンジニア、パトリック・ノートンは、自社のプログラミング言語C++とCのアプリケーションプログラミングインタフェース(API)と開発ツールに不満を募らせていた。その頃、NeXTが注目を浴びていたことがきっかけとなって、ノートンはサンでプログラミング環境の開発の仕事をすることになった。NeXTワークステーションと、その環境であるNEXTSTEPでは、主力の言語としてObjective-Cが開発されていた。こうした経緯のなかで、次世代の家電製品のための新しいプログラミング言語を設計し、その処理系を開発することを目的とした「ステルスプロジェクト」と呼ばれるプロジェクトが始まった。
ステルスプロジェクトには、始まってすぐにジェームズ・ゴスリンとマイク・シェルダンが参加し、プロジェクトの名称は「グリーンプロジェクト」に変更された。プロジェクトには他のエンジニアたちも参加し、彼らはアメリカ合衆国カリフォルニア州メンローパーク市サンドヒルロードの道沿いにある小さなオフィスで作業を始めた。サンはこの分野が重要な市場になると予測していた。
プロジェクトチームでは当初はC++を検討していたが、いくつかの理由から却下された。理由は、当時の彼らの目的が、家電製品すなわち組み込みシステムだったからである。組み込みシステムでは、利用できるコンピュータ資源が少ないという制約がある。彼らはC++ではコンピュータ資源を食いすぎると判断した。またC++は複雑なプログラミング言語であり、C++を使うプログラマは注意していても間違いを犯しがちである。
C++にはガベージコレクションの機能が無い。ガベージコレクションが無いということは、プログラマが自分でオブジェクトの寿命（生存期間）を管理しなければならないことを意味する。プログラマが自分でオブジェクトの寿命を管理することは、冒険的で間違いやすい作業である。
プロジェクトチームは、いくつかの重要な機能についてC++の移植性が乏しいことも問題であると考えた。
このプロジェクトでの重要な機能とは、セキュリティおよび分散コンピューティング、マルチスレッドであり、これらの機能が、プラットフォームに依存せずに使える必要があった。このような事情で、彼らはあらゆる機器に容易に移植できるプラットフォームが必要であると認識するようになった。
一方で、サンの別のエンジニア、ビル・ジョイは、ゼロックスのパロアルト研究所でAltoというワークステーション試作機のために開発されたプログラミング言語・MesaとCの良いとこどりをした新しいプログラミング言語を構想していた。ジョイは Further という名前で呼ばれる論文を書き、自社でC++に基づいたオブジェクト指向環境を開発するべきであることを進言した。まずジェームズ・ゴスリンがC++を改変し拡張することを試みた。ゴスリンはこの拡張版C++を、"C++ ++ --"と名付けた。しかしゴスリンは、すぐにこの拡張版C++の開発を中止して、全く新しいプログラミング言語を開発する方針を採ることにした。ゴスリンはこの新しい言語にOakという名前をつけた。この名前の由来は、ゴスリンのオフィスのすぐそばにオークの木が立っていたことによる。

バージョン履歴

Java は、JDK（Java Development Kit; Java開発キット）1.0 以来、数度のメジャーバージョンアップを経ている。バージョンアップに伴い、多くのクラスとパッケージが標準ライブラリに追加されてきた。プログラミング言語JavaおよびJavaプラットフォームは、高い水準でバージョン間の互換性を保ちつつ発展してきている。
J2SE 1.4から、Javaの開発はJCP (Java Community Process) という標準化プロセスで行うようになっている。JCPでは、JSRs (Java Specification Requests) という文書群により、Javaに対する追加機能やJavaプラットフォームに対する変更の提案と規定を行う。
また、J2SE 1.3以降では開発コードネームとして、メジャーバージョンには動物の名前が、マイナーバージョンには昆虫の名前が付けられる傾向がある。
言語仕様は JLS（Java Language Specification; Java言語仕様）により規定する。JLSはJSR 901の管理下にある。
バージョンアップの過程で、言語仕様の変更だけでなく、標準クラスライブラリにおいても大きな変更が加えられている。JDK 1.0では標準ライブラリは約200クラス / インタフェースだったが、Java SE 6では4000以上のクラス / インタフェースとなっている。SwingやJava 2Dのような全く新しいAPIが追加された。その一方で、もともとJDK 1.0から存在していたクラスのメソッドの多くが、J2SE 5.0での使用は推奨されないようになっている。

Java SE 9 (2017年9月21日)

Java SE 9 は Java SE 8 リリースの3年後の2017年9月21日にリリースされた。。言語レベルでのモジュール化のサポート (Project Jigsaw, JSR 294) などを追加した。
オラクルはJavaの開発速度向上のため、これまでの新機能の完成を待ってメジャーバージョンアップを行うリリースモデルから、毎年3月と9月の年2回メジャーバージョンアップを行うタイムベースのリリースモデルへと移行することを発表した。またサポートサイクルも見直され、Java SE 9は次のメジャーバージョンまでの6ヵ月間のみ公式アップデートが提供されるnon-LTSリリースとなり、2018年3月に公式アップデートが終了した。なお、LTSリリースとなるJava SE 11以降は配布形態が変更されるため、LTSリリースの公式アップデートは提供されなかった。

Java SE 10 (2018年3月20日)

JSR 383 にて仕様が規定されたJava SE 10は新リリースモデルによる初リリースで、予定通りJava SE 9から半年後の2018年3月20日にリリースされた。ローカル変数型推論などの機能が追加されている。

Java SE 11 (2018年9月25日)

JSR 384 にて仕様が規定され、2018年9月25日にリリースされた。オラクルによるビルドはOracle JDKとOpenJDKの二種類が提供され、Oracle JDKの商用利用は有償サポート契約を結んだ顧客のみとなっている。リリースモデル変更後の初LTSリリースとなる。

Java SE 12 (2019年3月19日)

JSR 386にて仕様が規定され、2019年3月19日にリリースされた。Unicode 11がサポートされている。

Java SE 13（2019年9月17日)

JSR 388にて仕様が規定され、2019年9月17日にリリースされた。

Java言語の構文

構文は、CおよびC++から多くを引き継いでいる。このため、設計当時には割合として多かった、CやC++しか書けないプログラマにも使いやすいという評判が広まった。Javaが設計された1990年代中旬以前は、Cのプログラマが多く、またオブジェクト指向プログラミング言語の中では、C++は広く使われてきた言語の一つだった。なお、JavaではC++と違って名前空間レベルの関数（メソッド）および変数（フィールド）の宣言および定義を許可しておらず、必ず何らかのクラス定義の中に記述することが特徴である。この特徴は後発のC#も踏襲している。
次の節以降では、Hello worldプログラムで、Javaプログラムの例を示して説明する。Hello worldプログラムとは、"Hello, world" という文字列をディスプレイなどの出力装置に出力する簡単なソフトウェアプログラムである。プログラミング言語の初学者向けのプログラム例としてよく使われる。なお先に述べた通り、Javaには複数の実行形態があると考えることができるので、以降では、それぞれの実行形態におけるHello worldプログラムを例示する。

Javaプラットフォーム

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