コンテンツにスキップ

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

「Java」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
出典のない記述をリバート。
m 外部リンクの修正 (tech.nikkeibp.co.jp) (Botによる編集)
 
(97人の利用者による、間の311版が非表示)
1行目: 1行目:
{{Otheruses|コンピューターのプログラミング言語およびプラットフォーム|その他|ジャバ}}
{{Otheruses|プログラミング言語|その他|ジャバ}}
{{混同|JavaScript}}
{{混同|JavaScript}}
{{出典の明記| date = 2019年3月}}

{{複数の問題
|出典の明記=2019年2月
|更新=2019年2月
}}

{{Infobox プログラミング言語
{{Infobox プログラミング言語
| fetchwikidata = ALL
|name = Java
| onlysourced = true
|logo =
| name = Java
|caption =
| logo =
|paradigm = [[オブジェクト指向プログラミング|オブジェクト指向]]・[[構造化プログラミング|構造化]]・[[手続き型プログラミング|手続き型]]
| released = 1995年5月23日α版<br/>1995年秋β版<br/>1996年1月23日ver1.0
|released = {{Start date|1995}}
|designer = [[Java Community Process]]
| designer = [[Java Community Process]]
| latest release version = Java Standard Edition 23.0.1
|developer = [[オラクル (企業)|オラクル]]([[サン・マイクロシステムズ]])
|latest release version = Java Standard Edition 11.0.2
| latest release date = {{release date|2024|10|15}}
| typing = 強い[[静的型付け]]
|latest release date = {{release date|2019|01|15}}
| implementations = [[Javaプラットフォーム]]
|型付け = 強い[[静的型付け]]
|paradigm = [[オブジェクト指向プログラミング|オブジェクト指向]], [[ソフトウェアコンポーネント|コンポーネントベース]], [[リフレクティブ]], [[ジェネリックプログラミング|ジェネリック]], [[関数型プログラミング|関数型]], [[並行計算|並行プログラミング]]
|プラットフォーム = [[Solaris]], [[Linux]], [[Microsoft Windows|Windows]],<br>[[macOS]], [[AIX]], [[i5/OS|System i]],<br>各種の[[組み込みシステム]]ほか多数
|influenced_by=[[C++]], [[Ada]]<ref>{{cite web|url={{Google books|0rUtBAAAQBAJ|page=PA133|keywords=|text=|plainurl=yes}}|title=Cracking The Java Programming Interview :: 2000+ Java Interview Que/Ans|first=Harry H.|last=Chaudhary|accessdate=2016-05-29|date=2014-07-28}}</ref>, [[Eiffel]]<ref>{{cite web|author1=Gosling, James|author2=McGilton, Henry|title=The Java Language Environment|date=May 1996|url=https://www.oracle.com/technetwork/java/langenv-140151.html|access-date=May 6, 2014|archive-url=https://web.archive.org/web/20140506214653/http://www.oracle.com/technetwork/java/langenv-140151.html|archive-date=May 6, 2014|url-status=live|df=mdy-all}}</ref>, [[Mesa]]<ref>{{cite web|author1=Gosling, James|author2=Joy, Bill|author3=Steele, Guy|author4=Bracha, Gilad|title=The Java Language Specification, 2nd Edition|url=https://java.sun.com/docs/books/jls/second_edition/html/intro.doc.html#237601|access-date=February 8, 2008|archive-url=https://web.archive.org/web/20110805051057/http://java.sun.com/docs/books/jls/second_edition/html/intro.doc.html#237601|archive-date=August 5, 2011 |url-status=live |df=mdy-all}}</ref>, [[Modula-3]]<ref>{{cite web|url=http://www.computerworld.com.au/index.php/id;1422447371;pp;3;fp;4194304;fpid;1|title=The A-Z of Programming Languages: Modula-3|publisher=Computerworld.com.au|accessdate=2010-06-09|url-status=dead|archiveurl=https://web.archive.org/web/20090105145818/http://www.computerworld.com.au/index.php/id%3B1422447371%3Bpp%3B3%3Bfp%3B4194304%3Bfpid%3B1|archivedate=January 5, 2009|df=mdy-all}}</ref>, [[Objective-C]]<ref>[[Patrick Naughton]] cites [[Objective-C]] as a strong influence on the design of the Java programming language, stating that notable direct derivatives include Java interfaces (derived from Objective-C's [[Objective-C#プロトコル|protocol]]) and primitive wrapper classes. [http://cs.gmu.edu/~sean/stuff/java-objc.html] {{Wayback|url=http://cs.gmu.edu/~sean/stuff/java-objc.html|title=Java Was Strongly Influenced by Objective-C|date=20110713014816}}</ref>
|処理系 = [[コンパイラ]]([[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など多数)
|影響を受けた言語 = [[Objective-C]], [[Smalltalk]], [[C++]], [[Eiffel]], [[C Sharp|C#]]
| influenced = [[C Sharp|C#]], [[D言語|D]], [[Dart]], [[Groovy]], [[Scala]], [[Kotlin]], [[Ceylon]]
|影響を与えた言語 = [[C Sharp|C#]], [[D言語|D]], [[Dart]], [[Groovy]], [[Scala]], [[Kotlin]], [[Ceylon]]
| operating system = [[Solaris]], [[Linux]], [[Microsoft Windows|Windows]],<br>[[macOS]], [[AIX]], [[i5/OS|System i]]
| license = [[GNU General Public License]]、[[Java Community Process]]
|ウェブサイト = [https://java.com/ja/ java.com]
| website = {{ConditionalURL}}
|file ext = java, class, jar
| file ext = java、class、jar
|wikibooks = Java
}}
}}
{{プログラミング言語}}
{{プログラミング言語}}
'''Java'''(ジャバ)は、狭義では[[プログラミング言語]]としてのJavaを指し、広義ではJava言語によるコンピューティングプラットフォームも含む<ref>[https://www.java.com/en/download/faq/whatis_java.xml What is Java and why do I need it?]</ref>。[[Javaプラットフォーム]]はJava言語仕様だけでなく、[[Javaクラスライブラリ]]や[[Java仮想マシン]]、[[Java SE]]や[[Java EE]]といった[[Application Programming Interface|API]]セット、さらには開発環境である[[Java Development Kit|JDK]]や実行環境である[[Java Runtime Environment|JRE]]などを指すこともある。場合によっては公式以外のサードパーティ製の実装を含めたエコシステム全体を指すこともある。言語機能としては、[[C++]]の構文をベースにした[[オブジェクト指向]]の[[プログラミングパラダイム|パラダイム]]や、[[ガベージコレクション]]による自動メモリ管理などを導入している。従来のソフトウェアが抱えていた[[移植性]]問題の解決を目標とし、ハードウェア環境に依存せず、あらゆる[[プラットフォーム (コンピューティング)|プラットフォーム]]上で動かせるプログラムの開発・実行環境の実現を目指して開発された。''"[[Write once, run anywhere]]"''(一度書けばどこでも動く)がそのキャッチコピーだった。


'''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-01|publisher=}}</ref>。[[オラクル (企業)|オラクル]]およびその関連会社の登録商標である。1996年に[[サン・マイクロシステムズ]]によって市場リリースされ、2010年に同社がオラクルに吸収合併された事によりJavaの版権もそちらに移行した。
Javaプログラムは[[Javaバイトコード]]と呼ばれる中間言語([[中間表現]])にコンパイルされて、[[Java仮想マシン]]と呼ばれるソフトウェア上で実行される。各プラットフォームに対応したJava仮想マシンがハードウェア間の差異を吸収し、環境に依存しないプログラム動作を実現する仕組みとなっている。Java登場初期の対象であった家電機器の[[組み込みシステム]]を始め、[[パーソナルコンピュータ]]、[[モバイル端末]]、[[サーバー (コンピューター)|サーバーマシン]]まで、さまざまな環境にJavaソフトウェアは普及している。


プログラミング言語Javaは、[[C++]]に類似の構文、[[クラスベース]]の[[オブジェクト指向プログラミング|オブジェクト指向]]、[[マルチスレッド]]、[[ガベージコレクション]]、[[ソフトウェアコンポーネント|コンポーネントベース]]、[[分散コンピューティング]]といった特徴を持ち、平易性重視のプログラム書式による堅牢性と、[[仮想マシン]]上での実行によるセキュリティ性および[[プラットフォーム非依存|プラットフォーム非依存性]]が理念とされている。[[Javaプラットフォーム]]は、Javaプログラムの実行環境または、実行環境と開発環境の双方を統合したソフトウェアであり、[[サーバ|ビジネスサーバ]]、[[モバイル機器]]、[[組み込みシステム]]、[[スマートカード]]といった様々なハードウェア環境に対応したソフトウェア形態で提供されている。その中枢技術である[[Java仮想マシン]]は各プラットフォーム環境間の違いを吸収しながら、Javaプログラムの適切な共通動作を実現する機能を備えている<ref name="design_goals">{{Cite web|url=https://www.oracle.com/technetwork/java/intro-141325.html|title=1.2 Design Goals of the Java™ Programming Language|publisher=オラクル|date=January 1, 1999|accessdate=2013-01-14|archiveurl=https://web.archive.org/web/20130123204103/http://www.oracle.com/technetwork/java/intro-141325.html|archivedate=January 23, 2013}}</ref>。このテクノロジは''「[[write once, run anywhere]]''」と標榜されていた<ref>{{Cite web|url=http://www.computerweekly.com/Articles/2002/05/02/186793/write-once-run-anywhere.htm|title=Write once, run anywhere?|date=May 2, 2002|publisher=[[Computer Weekly]]|accessdate=2009-07-27}}</ref>。
== 概説 ==
Javaは当初、それ以前の多様な言語の際立った特徴を引き継ぎ、[[プログラマ]]の使い勝手と動作速度のバランスを考えて設計された。主には下記のような特徴を持つ。
*構文は[[C言語]]および[[C++]]ユーザーの学習コストを減らすため、意図的に[[C++]]に似せているが、メモリ管理は完全に自動化されており、[[デバッグ]]を難しくする低水準なメモリアクセスは行えないようにしている。
*[[オブジェクト指向プログラミング]]をサポートしている。[[オブジェクト (プログラミング)|オブジェクト]]モデルは{{要検証範囲|date=2019年2月|[[Smalltalk]]や[[Objective-C]]と同様の}}簡潔なものを採用している。
*実行環境の構成は{{要検証範囲|date=2019年2月|[[Smalltalk]]に似せている}}。[[ソースコード]]は機械語にコンパイルされるのではなく、中間言語 ([[Javaバイトコード]]) にコンパイルされ、[[仮想マシン]] ([[Java仮想マシン]]) の上で動作する。これにより、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない[[アプリケーションソフトウェア]]を開発できる。


2019年の時点で[[GitHub]]によると<ref name="名前なし-1">{{Cite web|author=Chan|first=Rosalie|title=The 10 most popular programming languages, according to the 'Facebook for programmers'|url=https://www.businessinsider.de/the-10-most-popular-programming-languages-according-to-github-2018-10?op=1|website=[[Business Insider]]|accessdate=June 29, 2019|archiveurl=https://archive.today/20190629083530/https://www.businessinsider.com/the-10-most-popular-programming-languages-according-to-github-2018-10?op=1&r=DE&IR=T|archivedate=June 29, 2019|date=January 22, 2019}}</ref>、Javaは特に[[クライアントサーバモデル|クライアント/サーバモデル]]の[[ウェブアプリケーション|Webアプリケーション]]で使用されている最も人気の高いプログラミング言語の1つであり<ref name="名前なし-1"/>、全世界でおよそ900万人の開発者がいるとレポートされている<ref>{{Cite web|url=https://www.oracle.com/technetwork/articles/java/afterglow2013-2030343.html|title=JavaOne 2013 Review: Java Takes on the Internet of Things|website=www.oracle.com|accessdate=2016-06-19|archiveurl=https://www.imarslan.com/javaone-2013-review-java-takes-on-the-internet-of-things|archivedate=April 19, 2016}}</ref>。最新バージョンは、2024年9月にリリースされたJava 23と、2021年9月にリリースされたJava 17の長期サポート(LTS)版である。オラクルは未解決のセキュリティ問題によるリスクを回避するために、旧バージョンのアンインストールと新バージョンへの移行を強く推奨している<ref>{{Cite web|url=https://www.java.com/en/download/faq/remove_olderversions.xml|title=Why should I uninstall older versions of Java from my system?|publisher=オラクル|accessdate=2016-09-09}}</ref>。
Javaは[[組み込みシステム]]や[[携帯機器]]([[携帯電話]]・[[PHS]]や[[携帯情報端末|PDA]]・[[スマートフォン]]等)のシステムから、企業の[[情報システム]]を担う大規模な[[データベース]]、[[サーバ]]、[[スーパーコンピュータ]]まで、多くの分野で使用されている。[[1995年]]のリリース時は他に似たような言語が無く、鳴り物入りで登場した。[[仮想機械|仮想マシン]]に基盤を置いたため、歴史の初期には動作速度や信頼性などの面で懐疑的な評価が行われることが多かったが、長年の実績の積み上げにより使い勝手の良さが広く認知され、基幹系や業務系のシステム開発では特に重宝されるようになっている。


== 概要 ==
== Javaの特徴 ==
現在の正規ベンダーである[[オラクル (企業)|オラクル]]の公式アピールは、以下の通りである<ref name=":0">{{Cite web|和書|title=Java Software {{!}} オラクル|url=https://www.oracle.com/java/|website=www.oracle.com|accessdate=2019-10-19}}</ref>。特に業務用システムの構築に最適であるとしている。
[[プログラミング言語]]Javaおよび[[Javaプラットフォーム]]は、[[1990年代]]前半当時、[[サン・マイクロシステムズ]]に在籍していた[[ジェームズ・ゴスリン]]、[[ビル・ジョイ]]を始めとする人々によって設計・開発され、1995年にリリースされた。その後2010年にサンは[[オラクル (企業)|オラクル]]に吸収合併され、Javaの著作権および管理もオラクルに移行した。Javaに対する追加提案などは、サン時代から続いている[[Java Community Process]] (JCP) というプロセスによって進められる。
{{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.<br/>
Javaは、コストを削減し、開発者の時間枠を短縮し、イノベーションを促進し、エンタープライズアーキテクチャ、財務、およびHRに最適なプログラミング言語としてアプリケーションサービスを改善します。 Javaは、製造・自動車・保険・公共部門などの多くの業界で使用されています。}}オラクルによると、全世界の3億のコンピュータデバイスでJava実行環境が動作しており、全世界の200万の人員がJava開発環境を使用しており、全世界で250億枚の[[Java Card]]が発行されている、と統計されている<ref name=":0" />。


=== Javaの構文 ===
Javaに関わる呼称とその意味内容は、[[コンテクスト|文脈]]に応じていくつか使い分けられている。サン・マイクロシステムズは、「Javaテクノロジ」(Java技術、Java technology)という呼称を使い、一方でJavaのさまざまな技術の形容詞として「Java」の呼称を使ってきた。<!--多くの[[プログラマ]]は、[[プログラミング言語]]の意味で「Java」の呼称を使っている。--><!-- ← 根拠不明。 -->Javaの実行環境は、Java実行環境 ([[Java Runtime Environment]]; JRE) と呼ばれる。Javaの基本的な開発環境は、Java開発キット ([[Java Development Kit]]; JDK) と呼ばれる。
{{main|Javaの文法}}Javaプログラム構文は、[[C++]]によく似たものである。[[オブジェクト指向言語]]の一面が強調されがちだが、C言語のような[[手続き型プログラミング|手続き型言語]]としてもプログラミングできる。Javaはオブジェクト指向パラダイムをそれほど強制しない。


Javaは、同時に[[マルチパラダイムプログラミング言語|マルチパラダイム言語]]でもある。JDK 1.1で[[JavaBeans]]/[[Java Remote Method Invocation|JavaRMI]]/[[CORBA]]による[[ソフトウェアコンポーネント|コンポーネントプログラミング]]と、[[リフレクション (情報工学)|リフレクション]]APIによる[[メタプログラミング]]が備えられた。J2SE 5.0でジェネリクス構文/APIによる[[ジェネリックプログラミング]]が追加された。Java SE 7で並行[[Application Programming Interface|API]]による[[並行コンピューティング|並行プログラミング]]が追加された。Java SE 8では[[ラムダ式]]/関数型インターフェース/ストリームAPIなどによる[[関数型プログラミング]]が追加された。2014年(Java 8)以降の関数型とジェネリクスを多用しているJavaプログラムは、それ以前のJavaプログラムから大きく様変わりしている。
Javaは[[クラスベース]]の[[オブジェクト指向プログラミング言語]]である([[#オブジェクト指向プログラミング]])。[[C++]]類似のクラス構文をベースとしつつ、機能を絞って簡素かつ明快な言語仕様としている。


=== オブジェクト指向 ===
Javaは[[例外処理]]機構を備えており、[[プログラム (コンピュータ)|プログラム]]実行中に生じた異常(例外)の扱いを、比較的安全な方法で行い、プログラムを読みやすく記述できる。
{{main|オブジェクト指向プログラミング}}Javaは、[[クラスベース]]の[[オブジェクト指向プログラミング言語|オブジェクト指向]]である<ref>広辞苑 第六版</ref>。[[クラス (コンピュータ)|クラス]]、[[インタフェース (抽象型)|インターフェース]]、[[インスタンス]]といった概念を中心にしたものである。クラスのメンバ要素は、フィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラス、コンストラクタ、ファイナライザである。インターフェースは抽象メソッドと定数で構成される純粋抽象クラスである。クラスはインスタンスのひな型であり、インスタンスはクラスを実体化したものである。Javaプログラムは、1個以上のクラス定義文から形成される。Javaのクラスは[[カプセル化]]、[[継承 (プログラミング)|継承]]、[[ポリモーフィズム|多態性]]をサポートしている。


[[カプセル化]]は、クラスメンバの可視性 (private, package, protected, public) でサポートされている。可視性とはメンバのアクセス許可範囲を定めるものであり、<code>private</code>は同クラス内限定、<code>package</code>は同クラス内と同パッケージ内限定、<code>protected</code>は同クラス内と同パッケージ内と派生クラス内限定、<code>public</code>は制限なしを意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性は、ファイル単位の<code>package</code>なので隠蔽性よりも利便性が重視されている。
Javaでは簡潔なメモリモデルを採用しており、[[プログラマ]]がメモリ ([[主記憶装置]]) を管理する負担を軽減する。プリミティブ型を除き、あらゆるオブジェクトはメモリ内の[[ヒープ領域|ヒープ]]という領域に割り当てられる。メモリ管理は、[[Java仮想マシン]]に統合された[[ガベージコレクション]]の機能によって行われる。C/C++では、ヒープ領域に動的に確保・生成したデータやオブジェクトについては、もはや必要が無くなったときに破棄する指示をプログラマが自分で責任をもって行わなければならないが、これはプログラマにとって負担が大きく複雑で間違いやすい作業であり、ソフトウェアの安全性・開発効率・保守性を損なう要因だった。Javaではガベージコレクションの機能によって、動的に生成したオブジェクトの破棄が自動化されるため、プログラマの負担は大きく軽減される。


[[継承 (プログラミング)|継承]]は、スーパークラスが一つに限られる単一継承をサポートしている。多重継承は不可である。既存クラスに任意メンバを追加した新規クラスを作成できる。Javaの全クラスは<code>Object</code>クラスをルートクラスとしてデフォルト継承する。<code>Object</code>クラスには[[ロック (計算機科学)|ロック]]機能が備えられており、これは[[並行プログラミング]]を前提にした仕様である。
Javaでは、C/C++のような、整数と[[ポインタ (プログラミング)|ポインタ]]の相互変換、配列の要素へのポインタによるアクセス、ポインタ演算といった機能は、基本機能としては提供されていない。ただし、オブジェクトへの参照は内部的にはアドレスである。


[[多態性]]は、[[仮想関数]]、[[抽象クラス]]、[[インタフェース (抽象型)|インターフェース]]、動的[[ダウンキャスト]]でサポートされている。スーパークラスの<code>virtual</code>メソッドを、サブクラスの同名メソッドで[[オーバーライド]]できる機能を仮想関数と言う。スーパークラス変数にサブクラスインスタンスを代入してその変数からサブクラスのメソッドが呼ばれるようにするのは、[[サブタイピング (計算機科学)|サブタイピング]]になる。インターフェースは抽象メソッドだけの純粋抽象クラスであり、任意の数だけクラスに実装できる。実行時ダウンキャストは<code>instanceof</code>演算子の実行時型チェックが可能で、ダウンキャスト失敗時は[[例外処理|例外]]発生する。
Javaでは[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存を目標の一つとし、またバージョン間の[[互換性]]に注意して開発が進められている。Javaプラットフォーム自体への依存を除き、オペレーティングシステムなどのプラットフォームには依存しない[[アプリケーションソフトウェア]]の開発と配備を行うことができると主張される。従来の[[プログラミング言語]]の多くはオペレーティングシステムやプロセッサ ([[CPU]]) アーキテクチャに依存したネイティブなコードに[[コンパイラ|コンパイル]]することを前提として設計されていたが、Javaはこうした言語と異なり、中間言語([[バイトコード]])にコンパイルされ、[[Java仮想マシン]]で実行されるよう設計された([[pコードマシン]]など、過去にもあったものだが、{{要出典範囲|date=2017年10月|なぜか新しいものであるかのように宣伝される}})。性能向上のため、Java仮想マシンの成熟した実装では多くの場合、[[ジャストインタイムコンパイル方式]]が使われる。


プラットフォーム非依存とバージョン間の互換性の目標は、完全に達成できたわけではなく課題が残っている。
=== プラットフォーム非依存 ===
{{main|Java仮想マシン}}[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaプログラムが特定の[[ハードウェア]]や[[オペレーティングシステム]]に依存せずに、あらゆる環境での共通動作を保証する概念である。”''Write once, run anywhere''”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)とされる。Javaのプラットフォーム非依存性は次のようにして実現されている。


#[[Javaコンパイラ]]は、Javaソースコードを、[[Javaバイトコード]]という[[中間表現]]にコンパイルする。Javaバイトコードは、[[Java仮想マシン]]用の実行コードである。Javaバイトコードは通常、[[Javaクラスファイル]]にまとめられる。
Javaでは[[スレッド (コンピュータ)|スレッド]]を言語仕様で規定しており、[[マルチスレッド]]による[[並行計算]]や[[マルチコア]]CPUを活かした[[並列計算]]を、従来の言語と比べて簡単に実装できる。
#[[Java仮想マシン]]は、各プラットフォームの差異を吸収するクッション的なソフトウェアである。Java仮想マシンは、様々なコンピュータ環境対応バージョンが提供されており、各プラットフォームに[[Java実行環境]]の中核としてインストールされる。
#[[Java仮想マシン]]は、任意の[[Javaクラスファイル]]を[[Javaクラスローダー]]で読み込み、その[[Javaバイトコード]]を解釈実行する。インタプリタ式の解釈走行と、[[実行時コンパイラ]]で解釈走行させるものがある。


Java初期のインタプリタ式で走行されるJavaプログラムの実行速度は遅かったが、[[実行時コンパイラ]]技術と動的再コンパイル技術 (dynamic recompilation) の導入によって実行速度問題はほぼ解決した。実行時コンパイラとは、一定のJavaバイトコードをまとめて[[ネイティブコード]]にコンパイルして継続的に実行させる技術である。Java仮想マシンはメモリ境界と[[バッファオーバーフロー]]のチェックを行いながらプログラムを走行させる。また、クラスロード時のバイトコード検証機能によって、あからさまなコード暴走や致命的エラーの頻発を事前抑止している。
Javaでは充実した[[Javaクラスライブラリ|標準クラスライブラリ]]により、[[コンピュータネットワーク]]を活用するソフトウェアを、効率良く開発できる。Javaはその初期のバージョンから、[[インターネット・プロトコル・スイート|TCP/IP]] のライブラリを備えていた。分散オブジェクト環境 ([[Java Remote Method Invocation|Java RMI]], [[Common Object Request Broker Architecture|CORBA]]) のソフトウェアの開発も早い時期からできるようになっていた。{{いつ範囲|date=2017年10月|近年}}では、さまざまな[[ネットワークプロトコル]]の高水準なライブラリが使えるようになっている。[[W3C]]により標準化された、汎用[[マークアップ言語]]のひとつである[[Extensible Markup Language|XML]]で記述された文書を扱うライブラリも早期に実装・標準サポートされた。{{いつ範囲|date=2017年10月|近年}}では、XMLプロセサと[[XSL Transformations|XSLT]]プロセサがJava標準ライブラリに統合され提供されている。充実したネットワーク機能とXML文書を扱う機能を有効に組み合わせることにより、Javaは標準機能だけでも高度なシステムを構築できる言語の一つとなっている。


=== マルチスレッド ===
Javaは[[コンピュータセキュリティ|セキュリティ]]を考慮して設計されており、[[サンドボックス (セキュリティ)|サンドボックス]]モデルに基づいたセキュリティ機構を備えている。セキュリティ機構を正しく実装したJava実行環境を適切に使うことで、遠隔のコンピュータ上にある実行コードを安全に実行できる([[Javaアプレット]])。
{{main|マルチスレッド}}Javaプログラムは、複数以上の[[スレッド (コンピュータ)|スレッド]]を同時走行できる。これをマルチスレッドと言う。多数のスレッドを扱う大規模システムにも対応しており、例えばスレッドグループAPIは、スレッドたちを役割や性質でグループ化して一括操作できる。これは[[クライアント・サーバシステム]]の実装向けである。また、多数の断続的[[トランザクション]]をさばくシステムにおいて発生しがちなスレッド生成/破棄の反復による負荷増大を回避するための、スレッドプールとタスクキューを合わせたスレッドモニタAPIも用意されている。


Javaのマルチスレッド[[並行計算]]は、[[クリティカルセクション]][[同期]]が基準にされている。Javaの全インスタンスは、[[ロック (計算機科学)|ロック]]機能を備えている<code>Object</code>クラスをルート継承しているので、クリティカルセクションのロックオブジェクトにできる。Javaでは<code>synchronized</code>で指定された範囲がクリティカルセクションになる。Javaの標準ロック手法は、[[ミューテックス]]の[[モニタ (同期)|モニタ]]である。<code>synchronized</code>メソッドはその全体が排他セクションになり、そこでは[[This (プログラミング)|This]]インスタンスがロックオブジェクトになる。<code>synchronized</code>静的メソッドでは、システム内の専用インスタンスがロックオブジェクトになる。また、<code>synchronized(指名変数)</code>構文でメソッド内の任意範囲をクリティカルセクションにして、そこでは指名変数がロックオブジェクトになる。
また、[[名前空間]]の機構をもつ言語であり、ライブラリおよびアプリケーションに含まれる多数の Java のプログラム(クラスとインタフェース)は、[[パッケージ (Java)|パッケージ]]という階層構造で管理できる。


ミューテックスのモニタ以外の、カウント[[セマフォ]]や[[バリア (計算機科学)|バリア]]や読み書きロックなどのロック手法は、並行APIの方で用意されている。
[[Javaに対する批判]]も少なくない。いくつかの批判に対しては、サン(後にはオラクル)やJCPに参加する人々の努力により、Javaの改良が行われている。一方で{{いつ範囲|date=2017年10月|現在}}、{{要出典範囲|date=2017年10月|多くのソフトウェア開発者は、Javaについて、広く使われている言語としては優れた言語の一つと評価している}}。


=== ガベージコレクション ===
[[JavaScript]] ([[ECMAScript]]) は、Javaにちなんで命名されたスクリプト言語である。とはいえ基本構文の一部がJavaやC系言語に似ているだけであり、またクラスベースではなく[[プロトタイプベース]]のオブジェクト指向言語であるため、言語仕様的な共通点は少ない。
{{see also|ガベージコレクション}}
Javaプログラムのメモリ管理は、[[Java仮想マシン]]の[[ガベージコレクション]]によって行われる。ガベージコレクションとは、すでにどこからも参照されていないインスタンスを自動的に特定して破棄し、その占有メモリ領域を自動的に解放する機能である。人の手によるオブジェクトの生成と破棄を正確に対応させるメモリ管理作業は煩雑化するのが常であり、[[メモリリーク]]や不正リリースによるエラーを引き起こしやすく、バグの温床と化すのが通例であった。それらを自動化したガベージコレクションは、Javaプログラマを複雑なメモリ管理作業から解放する。


ガベージコレクタのプロセスは、システムスレッドに乗って未参照のインスタンスを探し続ける。どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する。Javaではガベージコレクション機能に並々ならぬ力が入れられており、その技術更新は現在も進行中である。[[世代別ガベージコレクション|世代別ガベージコレクタ]]、応答時間短縮化の[[レイテンシ]]重視ガーベジコレクタ、休止時間短縮化の[[スループット]]重視ガーベジコレクタなどが導入されて更に改訂を重ねており、運用環境別の選択使用も可能にされている。
表記は"J"のみが大文字の「Java」が正しい。「JAVA」は正式な表記ではない<ref>きしだなおき 「創るJava[改訂第2版] NetBeansでつくって学ぶ Java GUI & Webアプリケーション」 毎日コミュニケーションズ、26頁。</ref>。


=== 分散コンピューティング ===
== 歴史 ==
{{see also|分散コンピューティング}}
{{更新|date=2018年9月|section=1}}
Javaの[[分散コンピューティング]]プログラミングは、[[Object Request Broker|オブジェクト要求ブローカー]]に準拠している。これはネットワーク上に存在する様々なプラットフォームの間で、互いに異なる環境を意識せずにリクエストとレスポンスを送りあい任意のタスクを遂行する[[分散システム]]の構築をサポートする。各プラットフォーム上で稼働されるサーバアプリケーションとクライアントアプリケーションは、それぞれオブジェクトを内包しており、業界共通規格の[[Common Object Request Broker Architecture|CORBA]]またはJava独自規格の[[Java Remote Method Invocation|RMI]]が提供する運用アーキテクチャと通信プロトコルを通して、他のオブジェクトと相互にコミュニケーションする。それらは分散オブジェクトと呼ばれている。


業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるようにRMI over IIOPなどの様々な技術が実装されている。CORBAの通信プロトコルは[[IIOP]]、RMIの方はJRMPである。分散オブジェクトを実装するためのAPIとクラスライブラリの多くは[[Jakarta EE]]に属している。分散オブジェクトの中でサーバ機能に特化されたものは[[Enterprise JavaBeans|EJB]] (Enterprise JavaBeans) と呼ばれている。
この節では次の構成でJavaの歴史と近況を説明する。
*[[#草創]]と[[#インターネットの世界へ]]で、Javaの最初の正式なバージョンが公開されるまでの歴史を述べる。
*[[#2000年代の動向]]で、その後から2000年代までの動向をいくつかの側面から述べる。
*[[#バージョン履歴]]で、最初のバージョン以降のJava (JDK, [[Java Platform, Standard Edition|Java SE]]) のバージョンの履歴を述べる。


[[Enterprise JavaBeans|EJB]]は、クライアントと同期通信を行いトランザクションを管理するセッションビーン、データベースとリンクして永続データを管理するエンティティビーン、様々なイベントからの非同期通信を管理するメッセージドリブンビーンの三種に大別される。これらのEJBは、[[EJBコンテナ]]に内包されて運用される。分散オブジェクト同士が通信するためのプロトコルは、IIOPかJRMPが使われる。[[Java Naming and Directory Interface|JNDI]]は、照会された識別名からネットワーク上の分散オブジェクトや各種リソースのロケーションを特定して通信ないしアクセスできるようにする。
=== 草創 ===
[[ファイル:Duke3D.png|thumb|right|'''Duke''' Javaのマスコット<br>Duke は2006年のJavaのオープンソース化発表と同時に[[BSDライセンス]]付与のオープンソース化が行われており、ウィキペディアに掲載することが可能である]]
[[Javaプラットフォーム]]および[[プログラミング言語]]Javaは、1990年12月に[[サン・マイクロシステムズ]]が1つの内部プロジェクトを立ち上げたことから始まった。この内部プロジェクトでは、[[C言語|C]]/[[C++]]の代替となる[[プログラミング言語]]を開発した。この言語は、プロジェクトで Green[[オペレーティングシステム]] (Green OS) と共に、同OSの標準言語として開発された。この言語は、1992年頃プロジェクト内では'''Oak'''と呼ばれていたが、後に'''Java'''の呼称に変更されることになる。呼称変更の理由は、Oakはすでに別の会社が商標として使っていたからである。


EJBコンテナは、[[Webコンテナ|WEBコンテナ]]と連携して運用されるのが普通である。EJBコンテナはWEBコンテナを一般的なクライアント窓口として使用することが多い。WEBコンテナは[[サーブレット]]と[[JavaServer Pages|JSP]](Java Server Pages)を内包しているWEB用サーバアプリケーションであり、[[HTTP]]プロトコルを通して一般的な[[WEBブラウザ]]との同期通信を行う。WEB方面の分散オブジェクトは、WEBコンポーネントと呼ばれる。JSPはいわゆるWEBサイトの表示に特化したコンポーネントである。サーブレットはWEBサイトへのリクエストを処理し、場合によってはセッションビーンにトランザクションを委譲するコンポーネントである。[[EJBコンテナ]]では[[JBoss]]や[[WebSphere Application Server|WebSphere]]などが有名である。EJBコンテナはWEBコンテナと統合されて提供されている事が多い。[[Webコンテナ|WEBコンテナ]]では[[Apache Tomcat]]が有名である。
1990年頃、サンのエンジニア、パトリック・ノートンは、自社のプログラミング言語C++とCの[[アプリケーションプログラミングインタフェース]](API)と[[プログラミングツール|開発ツール]]に不満を募らせていた。その頃、[[NeXT]]が注目を浴びていたことがきっかけとなって、ノートンはサンでプログラミング環境の開発の仕事をすることになった。NeXT[[ワークステーション]]と、その環境である[[NEXTSTEP]]では、主力の言語として[[Objective-C]]が開発されていた(余談になるが、その「直系の子孫」に当たるのは、[[macOS]]および[[IOS (アップル)|iOS]]と、[[Swift (プログラミング言語)|Swift]]である)。こうした経緯のなかで「ステルスプロジェクト」が始まった。


=== セキュリティ ===
ステルスプロジェクトには、始まってすぐに[[ジェームズ・ゴスリン]]とマイク・シェルダンが参加し、プロジェクトの名称は「グリーンプロジェクト」に変更された。プロジェクトには他のエンジニアたちも参加し、彼らは[[アメリカ合衆国]][[カリフォルニア州]][[メンローパーク (カリフォルニア州)|メンローパーク]]市サンドヒルロードの道沿いにある小さなオフィスで作業を始めた。プロジェクトの目的は、次世代の家電製品のための新しいプログラミング言語を設計し、その処理系を開発することだった。サンはこの分野が重要な市場になると予測していた。
{{see also|サンドボックス (セキュリティ)}}
分散ネットワークプログラミングを重視しているJavaは、[[サンドボックス (セキュリティ)|サンドボックス]]モデルに基づいたセキュリティ機構を備えている。これは遠隔ダウンロードされた追加プログラム([[Javaバイトコード]])による実行環境への予期せぬ操作やユーザー資源への好ましくないアクセスを防止するためのものである。分散(distributed)指向のJavaプログラムでは、[[Javaクラスファイル]]を遠隔ロードする機会が多いので、サンドボックス実行は必須になる。Javaのサンドボックスは、大抵は以下の手順になる。


*[[クラスローダ|クラスローダー]]は、バイトコードをダウンロードして順次クラス化する。
プロジェクトチームでは当初は[[C++]]を検討していたが、いくつかの理由から却下された。理由は、当時の彼らの目的が、家電製品すなわち[[組み込みシステム]]だったからである。組み込みシステムでは、利用できるコンピュータ資源が少ないという制約がある。彼らはC++ではコンピュータ資源を食いすぎると判断した。またC++は複雑なプログラミング言語であり、C++を使う[[プログラマ]]は注意していても間違いを犯しがちである。
*実行環境内のセキュリティポリシーファイルに従って、各種パーミッションが各クラスに付与される。セキュリティポリシーは主に、クラス名とそのパーミッションのペアで記述されている。
*実行環境に元からあるクラスは、オールパーミッション付与がデフォルトである。
*スレッドがリソースアクセスなどの操作をする度に、セキュリティマネージャが現行のパーミッションを調べて対象外なら例外を発生させる。
*その際は、スレッドの各通過メソッドのクラスのパーミッションが全チェックされ、原則的に最少パーミッションの方に合わせる。
*遠隔ロードされたappletクラスなどのパーミッション皆無のクラスのメソッドを一度でも通ったスレッドは、完全なサンドボックス実行になりほとんどのリソースにアクセスできなくなる。


実際には上記に加えて、各クラスを役割やセキュリティレベルでまとめるドメイン機構、認証と承認によるユーザーパーミッション機構、バイトコード送受信時の署名付き証明書機構などが組み合わされて実装運用される。
C++には[[ガベージコレクション]]の機能が無い。ガベージコレクションが無いということは、プログラマが自分でオブジェクトの寿命(生存期間)を管理しなければならないことを意味する。プログラマが自分でオブジェクトの寿命を管理することは、冒険的で間違いやすい作業である。


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


=== 誕生の経緯 ===
一方で、サンの別のエンジニア、[[ビル・ジョイ]]は、[[ゼロックス]]の[[パロアルト研究所]]で[[Alto]]という[[ワークステーション]]試作機のために開発された[[プログラミング言語]]・Mesaと[[C言語|C]]の良いとこどりをした新しいプログラミング言語を構想していた。ジョイは ''Further'' という名前で呼ばれる論文を書き、自社で[[C++]]に基づいた[[オブジェクト指向]]環境を開発するべきであることを進言した。まず[[ジェームズ・ゴスリン]]がC++を改変し拡張することを試みた。ゴスリンはこの拡張版C++を、"C++ ++ --"と名付けた。しかしゴスリンは、すぐにこの拡張版C++の開発を中止して、全く新しいプログラミング言語を開発する方針を採ることにした。ゴスリンはこの新しい言語に'''Oak'''という名前をつけた。この名前の由来は、ゴスリンのオフィスのすぐそばに[[オーク]]の木が立っていたことによる。
'''家電向けプロジェクトの立ち上げ(1990年12月)'''
[[ファイル:James Gosling 2008.jpg|サムネイル|181x181ピクセル|ジェームズ・ゴスリン]]
Javaの歴史は、1990年12月に[[サン・マイクロシステムズ]](サン)が、次世代の家電製品が内蔵するマイクロコントローラ向けのプログラミング言語を開発するための水面下プロジェクトをリサーチ段階を兼ねて試験的に立ち上げた事から始まる。サンはこの分野が今後の重要市場になると予測していた。サンのエンジニアである[[ジェームズ・ゴスリン]]やパトリック・ノートンらの参加により、現実味を帯びたプロジェクトの名称は正式に「グリーンプロジェクト」と定められた。彼らはカリフォルニア州[[メンローパーク (カリフォルニア州)|メンローパーク]]市サンドヒルロードに用意された比較的小さなオフィスで開発を始めた。


'''Oak言語とGreen OSの誕生(1991年)'''
プロジェクトチームは残業までして作業を続け、1992年の夏までに新しい[[プラットフォーム (コンピューティング)|プラットフォーム]]を、Green OS、Oak言語、[[ライブラリ]]、[[ハードウェア]]によって部分的なデモンストレーションができるようになった。1992年9月3日の最初のデモンストレーションでは、チームは Star7という[[携帯情報端末]]機器を開発することに力点をおいていた。この機器の名称の由来は、電話機能が ''*7'' とボタンを押すことで有効になることによる。


グリーンチーム内では当時の主流であったオブジェクト指向を採用する事で一致していた。彼らはそのモデル言語である[[C++]]に白羽の矢を立て、当初はその移植版を検討していたが、プロジェクトの対象が家電製品の[[組み込みシステム]]であったために自然と却下された。C++の複雑な言語仕様はコンピュータ資源の浪費とプログラムエラーの発生率を高めがちであり、堅牢性と安全性が最重要の家電製品の制御装置には不向きであると判断されたためだった。加えてC++では[[移植性]]に対応できない点も指摘され、[[プラットフォーム非依存]]も重要な議題として提起された。彼らはC++に代わる言語の開発と同時に、あらゆる機器に容易に移植できるプラットフォームの必要性も認識するようになった。こうして新言語プログラムの動作環境になる「Green OS」の開発も始められた。
この機器は、グラフィカルなインタフェースを備え、"Duke" という名前の知的な仮想代理人が利用者を支援した。同年11月、サンはグリーンプロジェクトを分離して完全子会社のFirstPerson, Incを設立した。それにともないチームは[[パロアルト (カリフォルニア州)|パロアルト]]に引っ越した。FirstPersonチームは、高度にインタラクティブな機器に関心を持っていた。そのおり[[タイム・ワーナー]]がケーブルテレビの[[セットトップボックス]]のRFP (Request For Proposal) を公表していた。そこでFirstPersonチームは自分たちの目標を変更し、タイム・ワーナーの RFP に応じてセットトップボックスの提案を提出した。しかし、<!-- However, the [[cable TV|cable]] industry felt that their platform gave too much control to the user and-->FirstPersonは入札で[[シリコングラフィックス]](SGI)に負けた。その後に[[3DO]]社の[[セットトップボックス]]の案件もあったが、契約には至らなかった。FirstPersonは[[テレビ]]業界では利益を出すことができず、サンはFirstPersonを解散してチームを自社に戻した。


一方で、[[Mesa]]言語と[[C言語]]の長所を理想にしていたサンのエンジニアの[[ビル・ジョイ]]は、C++をモデルにした新しいオブジェクト指向言語の開発を提案するワーキングペーパーに''Further''という題名を付けて自社に上申した。それを受けてまずジェームズ・ゴスリンがC++の拡張言語を提出した。ゴスリンはこれを「C++ ++ --」と名付けたがすぐに取り下げ、改めて一から設計しなおしたプログラミング言語を1991年秋に誕生させた。オフィスの側に立つオークの木を眺めながら開発を進めていたゴスリンは、この新しい言語に「Oak」という名前をつけた。これがJavaの前身である。
=== インターネットの世界へ ===
[[1994年]]の[[6月]]から[[7月]]にかけて、ジョン・ゲージと、[[ジェームズ・ゴスリン]]、[[ビル・ジョイ]]、パトリック・ノートン、ウェイン・ロジン、[[エリック・シュミット]]の間で、3日間かけて[[ブレインストーミング]]を行い、プロジェクトチームは[[World Wide Web|ウェブ]]の世界に主眼を置くという方針変更を行う。彼らは、革新的な[[ウェブブラウザ]]である[[NCSA Mosaic]]の出現を目の当たりにし、ウェブを含む[[インターネット]]の世界は、ケーブルテレビの世界に劣らず、高度にインタラクティブな媒体に発展しつつあると認識するようになった。Oakを使った[[プロトタイプ]]として、ノートンはWebRunnerという小さなウェブブラウザを開発。このウェブブラウザの名称は後に [[HotJava]] と変更される。[[ウェブページ]]に[[Javaアプレット]]という小さなJavaプログラムを埋め込んでおいて、ウェブブラウザHotJavaでそのページにアクセスすると、HotJava上でアニメーションの表示やマウスによるインタラクティブな操作ができた。


'''携帯端末、テレビ機器市場への参入と撤退(1992年 - 1994年5月)'''[[ファイル:Duke3D.png|thumb|Javaのマスコット「'''Duke'''」with [[BSDライセンス]]|代替文=|190x190ピクセル]]1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとより広範囲な可能性を秘めるようになったグリーンプロジェクトの対象は当初の家電機器から、当時のトレンドであった[[携帯情報端末]] (PDA)へとシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このStar7のユーザーインターフェース上で後のマスコットキャラ「Duke」が初登場している。
同年、チームはOakの名称を'''Java'''に変更する。変更の理由は、[[商標]]を調べて、"Oak" という名前がすでにビデオカードアダプタの製造会社 (Oak Technology) によって使われていたことが判明したからである。Javaという名称は、一部のチームメンバーがよく出入りしていた近くのコーヒーショップで命名されたという。
この名称が、何かの[[頭字語]]であるかどうかについては、よく分かっていない。
* 頭字語ではないとの説が一般的に受け入れられている。
*近くのコーヒーショップで供されていたコーヒーのブランドに由来すると考える人が多い。その根拠は、[[Javaクラスファイル]]([[バイトコード]])の最初の4バイトが[[十六進法|十六進記数法]]で必ず0xCAFEBABEとなっていることである<!-- (なお、[[プログラミング (コンピュータ)|プログラミング]]の世界ではこの0xCAFEBABEのようなデータを[[マジックナンバー (プログラム)|マジックナンバー]]という) -->。
*また、アメリカ英語においてはcoffeeを意味する一般名詞である。
*ただし一部では、'''J'''ames Gosling, '''A'''rthur '''V'''an Hoff, and '''A'''ndy Bechtolsheimの頭字語との説がある。
*また、'''J'''ust '''A'''nother '''V'''ague '''A'''cronymの頭字語との説もある。
[[1994年]][[10月]]に、HotJavaと[[Javaプラットフォーム]]が、サン・マイクロシステムズの幹部社員の前でデモンストレーションされた。そして1994年内に Java 1.0a([[アルファ版]])がダウンロードできるようになる。


1992年11月、サンはファーストパーソンという会社を設立しグリーンチームをそちらに所属させた。次世代のインタラクティブ機器に関心を持つファーストパーソンは、ケーブルテレビ用[[セットトップボックス]]事業への参入を決めて、[[タイム・ワーナー]]と[[3DO]]にそれぞれOakテクノロジを提示した。しかし、その余りに高度な柔軟さが却って倦厭されてしまい契約実現には到らなかった。サン本社はファーストパーソンの解散を決め、グリーンチームも本社に戻された。
JavaとHotJavaが最初に公的な場で公表されたのは、[[1995年]]5月23日のSunWorldカンファレンスだった。サンは、ウェブブラウザHotJava中で、[[Javaアプレット]]により、[[ウェブページ]]内でアニメーションの表示やマウスによるインタラクティブな操作が可能であることをアピールした。カンファレンスでアナウンスを行ったのは、サンの技術部長ジョン・ゲージである。このカンファレンスではまた、ゲージのアナウンスに関連する、当時の[[ネットスケープコミュニケーションズ]]の上級副社長[[マーク・アンドリーセン]]によるアナウンスが人々を驚かせた。それは、ネットスケープが自社の[[ウェブブラウザ]]である[[Netscape Navigator (ネットスケープコミュニケーションズ)|Netscape Navigator]]にJavaの実行機能を追加する予定だというものだった。このアナウンスにより業界の耳目を集める話題となった。


'''ワールドワイドウェブ参入(1994年6月{{~}}1994年9月)'''
1995年秋にはJava 1.0の[[ベータ版]]が公開された。[[1996年]]1月9日にサンは、JavaSoft部門を立ち上げた[http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960109.14048.html]。その2週間後に、最初の正式バージョンであるJava 1.0がリリースされた。


1994年6月、サン技術部長ジョン・ゲージが[[ジェームズ・ゴスリン]]、[[ビル・ジョイ]]、パトリック・ノートン、[[エリック・シュミット]]ら集めて、延べ3日に渡るブレインストーミングが行われた。ここで彼らは[[World Wide Web|ワールドワイドウェブ]]をプロジェクトの本命に据える事で一致した。革新的な[[ウェブブラウザ]]である「[[NCSA Mosaic]]」の登場に触発された彼らは、インターネットの世界がケーブルテレビのそれを超えたインタラクティブな媒体に発展しつつある事を認識していた。パトリック・ノートンはOakテクノロジをベースにした「WebRunner」という小さなウェブブラウザを開発した。Oakによる小さなアクティブプログラムが埋め込まれたウェブページにアクセスすると、WebRunner上でマウス操作に連動するインタラクティブなアニメーションが表示された。
=== 2000年代の動向 ===
Javaの最初のバージョンが公開されてから2000年代までの動向を、いくつかの側面から述べる。なお、Javaの開発元である[[サン・マイクロシステムズ]]はこの後の[[2010年]]1月に[[オラクル (企業)|オラクル]]により買収されており、Javaに関する権利も同社に移転している。


'''Javaの始動(1994年10月~1996年1月)'''
==== ウェブ(クライアント側) ====
[[ファイル:Hotjava.jpg|サムネイル|180x180ピクセル|HotJavaブラウザ]]
Javaアプレットは、WWWブラウザで動作するJavaプログラムであり、クライアントサイドのウェブアプリケーションの実装方法のひとつとして広く使われている。いくつかの有力な競合が存在する。競合技術の代表としてMicrosoft [[ActiveX]]および[[Adobe Flash]]が挙げられるが、これらはいずれも衰退している。
1994年秋までにグリーンチームは、Oakを「Java」に、WebRunnerを「[[HotJava]]」に改称した。Green OSは「Java Runtime Environment」に落とし込まれた。改称の理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたと言われる。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(Bean)はJavaテクノロジ内でコンポーネントを指す用語にされている。


1994年10月、JavaランタイムとHotJavaブラウザがサンの幹部社員たちの前でデモンストレーションされた。1995年5月にアルファ版が社内公開され、5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここでは[[Javaアプレット]]の技術がセールスポイントとしてアピールされた。同時に[[ネットスケープコミュニケーションズ|ネットスケープ]]が「[[Netscape Navigator (ネットスケープコミュニケーションズ)|Netscape Navigator]]」ブラウザへのJavaアプレット機能導入をアナウンスして業界の注目を集めた。1995年秋にベータ版が社外公開された。1996年1月9日にサンは、正式にJavaソフトウェア部門を立ち上げた。基幹テクノロジは市場リリース段階まで進捗していたが、その他のテクノロジは未だ途上段階であり、プラットフォームと呼べる域までは達しておらず、初回リリースのプロダクト名は、Javaランタイム環境を内包したデヴェロップメントキットになった。1月23日に最初の公開バージョンである「JDK 1.0」が市場リリースされた。
なお、Javaの最初の普及期であった20世紀末の頃には圧倒的なシェアを持っていた、[[Microsoft Windows 95]]上での[[Internet Explorer]]が、Javaアプレットを使用したページを表示しようとする際に、VMの起動のために、数十秒〜数分間操作を受け付けなくなったことが(なお、起動してしまえば実際には高性能だったのだが)、「Javaは重い」という風評の根源である。その後は、携帯端末等を含めれば、Windowsのシェアが圧倒的という状況が順調に消滅したため、IEのシェアが圧倒的ということも無くなり、一方でそのような風評のせいで、Javaの利用先としてサーバサイドが注力されたこともあり、遅いなどと言われることもほとんどなくなった。

簡単でインタラクティブなアニメーション用には、Javaアプレットよりも[[Graphics Interchange Format|GIF]]89aや[[Adobe Flash]]を採用する事例が多い。この分野においては、{{いつ範囲|date=2017年10月|最近}}では[[Ajax]]も普及しつつある。Ajaxアプリケーションの作成に欠かせないJavaScriptの開発では、Java開発で一般的に用いられているほどドキュメントや技術が成熟した標準ライブラリ、サードパーティーライブラリ、IDE、単体テストツールなどの開発環境がないが、Java開発環境を利用してJavaScriptによるAjaxウェブアプリケーションを開発するツールとして[[Google Web Toolkit]]を用いることができる。GWTコンパイラはJavaソースコードをバイトコードの代わりにJavaScriptにコンパイルし、ブラウザのJavaScript解釈エンジンをあたかもJVMのように活用することを可能にする。これによりJavaを用いてブラウザ上で動作するデスクトップアプリケーションと遜色ないウェブアプリケーションを作成することが可能となっている。[[HTML5]]によって導入されるデータベースのWeb Storage、ファイルAPI、クライアントハードウェアの位置情報を得るジオロケーション、JavaScriptをマルチスレッドで起動するWeb workerなどのクライアント側技術はJavaScriptによる呼び出しを前提としている。GWTやサードパーティのGWTライブラリはHTML5APIのJavaラッパーを提供しており、開発者は複雑なクライアント側プログラムをJavaのIDEでデバッグ、テストしながら開発し、最適化されたJavaScriptにコンパイルして実行させることができる。2011年Adobe社は携帯向けのFlash開発を断念し、HTML5にクライアント側技術の焦点を変更した。携帯機器を含めると2012年現在ではFlashよりもJavaScriptが普及してはいるが、Flashほど充実した開発環境やライブラリはない。アプレットはFlashよりも普及していない。GWTはJavaScriptの普及度とJavaの充実した開発環境の両方を用いることができるため、Java経験者のリッチクライアント作成ツールとしてアプレットに取って代わる存在となりうる。

以上のように、ネットワーク越しにダウンロードしたアプリケーションをその場で実行する、というような場合に不可欠なのは、サンドボックスと呼ばれる一種の仮想化環境である、という事実はJavaが設計された当初から(あるいは、それ以前の先駆的な事例から)基本的に何ら変わるものではない。そのためのJava以外のものとしては、インタプリタベースのJavaScriptの他、バイトコード(あるいはネイティブコードの安全な実行<ref>アプリへの署名による安全性を強調する企業もあるが。</ref>)を指向したものとしては[[Google Native Client|NaCl (PNaCl) ]]や、[[WebAssembly]]がある。

==== ウェブ(サーバ側) ====
現在、[[World Wide Web|ウェブ]]の[[サーバ]]側において、Java技術 ([[Java Platform, Enterprise Edition|Java EE]]) は広く使われている。多くの[[ウェブサイト]]が、[[Java Servlet|Javaサーブレット]] (Java Servlet) や[[JavaServer Pages]] (JSP)<!--、[[JavaServer Faces|JSF]](JavaServer Faces)--> などのJava EE技術を使って動的にページを生成するウェブを構築している。Javaサーブレットは[[2000年]]前後から急速に広く使われるようになり、現在では多くの[[ウェブアプリケーション]](動的な[[ウェブページ]])がサーブレットとして稼動するようになっている。

サン・マイクロシステムズが開発したJavaサーブレット技術を簡単に説明する。必ずしも厳密な説明ではない。

# Javaの実行環境の[[プロセス]](サーブレットコンテナ)を起動して[[Webサーバ|ウェブサーバ]]のマシンに常駐させる。
# ウェブサーバが、[[ウェブブラウザ]]からアクセスされる(リクエストを受ける)。
# ウェブサーバは、そのリクエストをサーブレットコンテナに渡す。
# サーブレットコンテナで動くJavaプログラム([[Java Servlet|Javaサーブレット]])は、受け取ったリクエストに基づき、[[ウェブページ]]を動的に生成する。
# サーブレットコンテナは、サーブレットが生成したウェブページをウェブサーバに渡す。
# ウェブサーバは、サーブレットコンテナから受け取ったウェブページを、ウェブブラウザに返す。

サンがJavaサーブレット技術を開発した1990年代末当時、[[ウェブアプリケーション]]の開発には、次に述べるようないくつかの問題があった。

* ウェブアプリケーション(動的なウェブページ)を記述するには[[Common Gateway Interface|CGI]]を用いるか、[[マイクロソフト]]の[[Internet Information Services|IIS]]による[[Active Server Pages]] (ASP) を用いるのが大半だった。
* CGIはその特性から実行時のオーバーヘッドが高く、性能を向上することが難しかった。
* ASPは[[サーバ]]が高価な [[マイクロソフト|Microsoft]] [[Microsoft Windows NT|Windows NT]] Server である必要があった。
Javaサーブレットはこれらの問題をある程度解決することができる技術だった。

==== デスクトップにおける展開 ====
[[デスクトップ環境]]においては、[[スタンドアローン|スタンドアロン]]のJava ([[Java Platform, Standard Edition|Java SE]]) の[[アプリケーションソフトウェア]]([[Javaアプリケーション]])は、これまではあまり多く使われていなかったが、{{いつ範囲|date=2019年2月|近年}}はいくつかのソフトウェアが広く使われるようになっている。{{いつ範囲|date=2019年2月|近年}}になって使われるようになってきた理由としては、次のことが挙げられる。

* コンピュータの処理性能が急速に向上してきた。
* Javaの[[仮想機械|仮想マシン]]([[Java仮想マシン]]、Java VM)と[[Javaコンパイラ]]が大きく改良されてきた。
* 使い勝手の良いJavaの[[デスクトップアプリケーション]]を簡単に開発できる強力な開発環境が、[[オープンソース]]界と商用開発企業の双方からさまざまに提供されるようになってきた。

広く使われているJavaのソフトウェアとしては、[[NetBeans]]および[[Eclipse (統合開発環境)|Eclipse SDK]]の[[統合開発環境]]や、[[LimeWire]]や[[Azureus]]のような[[ファイル共有ソフト|ファイル共有クライアント]]のソフトウェアなどがある。また数学ソフトウェア[[MATLAB]]においても、[[ユーザインタフェース]]のレンダリングと計算機能の一部を実現するために使われている。多くの Java の[[Swing]]や[[Standard Widget Toolkit|SWT]]の[[ウィジェット・ツールキット]]を使ったアプリケーションが、{{いつ範囲|date=2019年2月|現在}}も開発されている。

このように、{{いつ範囲|date=2019年2月|近年}}はデスクトップ上でJavaアプリケーションを使う事例が増えつつあるものの、従来は次に述べるいくつかの理由のためにあまり使われてこなかった[http://weblogs.java.net/blog/joshy/archive/2005/03/why_dont_you_sh.html]。

* Javaアプリケーションは、Java実行環境のオーバーヘッドのため、ネイティブアプリケーションと比べて、大量の[[主記憶装置|メモリ]]を使うことが多い。
* [[グラフィカルユーザインタフェース]] (GUI) は実行対象となる[[プラットフォーム (コンピューティング)|プラットフォーム]]特有のヒューマンインタフェースガイドライン (HIG) を考慮しない傾向があった。HIG を考慮したアプリケーションを開発することによって、ユーザはアプリケーションをすぐに使い慣れることができる。また、デフォルトではフォントスムーシングが使えない。そのためユーザインタフェースの文字列(テキスト)の表示の品質が低くなってしまう。
* [[Java Development Kit|Java開発キット]] (JDK) として無償で提供される基本的な開発環境は、使い勝手の良いデスクトップアプリケーションを簡単に開発するには、力不足だった。
*: {{いつ範囲|date=2019年2月|近年}}では先述したとおり、使い勝手の良いJavaのデスクトップアプリケーションを簡単に開発できる強力なツールが、[[オープンソース]]/商用ともに提供され使えるようになっている。
* [[Java Runtime Environment|Java実行環境]] (JRE) はこれまで数度のメジャーバージョンアップを経ており、複数のバージョンが存在する。ユーザはJavaアプリケーションを使い始める際には、必要に応じて、そのアプリケーションが動くバージョン、もしくはそのバージョンより新しいバージョンのJava実行環境をインストールする必要があった。Java実行環境は、7MB 以上のサイズであり、そのダウンロードとインストールもやや不便な手順をふむ必要があった。
*: {{いつ範囲|date=2019年2月|近年}}では [[Java Web Start]]の登場によりダウンロードとインストールも自動化され、ブラウザでJavaアプリケーションを見つけるとクリック一回でJREのダウンロード、インストール、アップデートなどをその場で済ませてJava Web Start対応[[Swing]]アプリケーション実行が可能になっている。<!-- 現在あるJavaアプリケーションが Java Web Start 対応になってゆけば、これらの問題は解決される些細な問題になりつつある。 -->

一部の[[ソフトウェア開発者]]は、情報技術は[[World Wide Web|ウェブ]]を基盤としたモデルが主流となっており、[[スタンドアローン|スタンドアロン]][[アプリケーションソフトウェア|アプリケーション]]は流行遅れであり、新しい[[プログラミング (コンピュータ)|プログラミング]]技術は優れた[[ウェブアプリケーション]]を開発することに充てられている、と思っていた。この見解については、ソフトウェア技術者の間で賛否が分かれている。

{{いつ範囲|date=2019年2月|現在}}では、[[リッチクライアント]]や[[Web 2.0]]の登場により新たな[[パラダイム]]が生まれようとしている。すなわち[[World Wide Web|ウェブ]]を基盤とした[[ウェブアプリケーション]]と[[スタンドアローン|スタンドアロン]]アプリケーションの融合である。ウェブアプリケーションを[[Ajax]]や [[Java Web Start]]、[[Adobe Flash]] などと組み合わせることにより、Web2.0時代に見合ったより洗練されたアプリケーションを開発することができる。

==== パーソナルコンピュータにおける実行環境 ====
{{いつ範囲|date=2013年1月|一昔前}}、ほとんどの [[パーソナルコンピュータ]] (PC) のユーザは、何ら問題なく[[World Wide Web|ウェブ]]および[[デスクトップ環境]]上で[[Javaアプリケーション]]を実行できていた。かつて多くのPCメーカーは、自分たちが製造・販売する[[Microsoft Windows|Windows]] PCに[[Java Runtime Environment|Java実行環境]] (JRE) を同梱していた。[[アップル (企業)|アップル]]の[[macOS]]や、多くの[[Linuxディストリビューション]]でも、Java実行環境を同梱していた。{{いつ範囲|date=2013年1月|今}}では追加インストールが必要である。しかしながらパーソナルコンピュータにおいてJavaアプリケーションは殆ど使われなくなってしまっているので、[[マイクロソフト]]が2001年頃以降にJava実行環境をWindowsに同梱していないことの影響は小さい。

2001年頃にマイクロソフトによるJava実行環境をWindowsに同梱することを止めたという行動は、[[サン・マイクロシステムズ]]が同社を「品質の低い」Java実行環境を同梱してきたとして告訴したことが契機となった。マイクロソフトがそれまでWindowsに同梱してきたJava実行環境向けに開発されたJavaプログラムは、他のプラットフォームのJava実行環境で動かない可能性があった。

しかし{{いつ範囲|date=2013年1月|近年}}では、Javaアプリケーションパッケージ自体にJava実行環境を同梱する事例が少なくない。その背景にはJavaアプリケーション開発者の判断がある。Javaアプリケーションが想定どおりに機能するよう、Java実行環境のバージョンの違いによる非[[互換性]]に基づく不具合を避けるために、PCに同梱されているJava実行環境を使わないという判断である。

{{いつ範囲|date=2013年1月|現在}}では、[[Javaアプレット]]は動作対象のJava実行環境のバージョンを認識することができる。また、バージョン間の[[互換性]]も プログラミング言語の中では高い水準にあり、上位互換性についてはJava SE 1.3以降は大きな問題はほぼおきにくくなっている。さらに[[Java Web Start]]ではデスクトップにインストールされているJavaのバージョンを確認してアップデートできるならアップデートし、それだけでなくJava Web Start対応アプリケーションをもアップデートしようとする。そのため古いバージョンのJava実行環境を使っているマシンがあったとしても、自動アップデートされるためにそう難しい問題は起きない。

==== 組み込みシステム ====
[[組み込みシステム]]向けのJava([[Java Platform, Micro Edition|Java ME]])も広く使われている。

[[携帯機器]]([[携帯電話]]・[[PHS]]や[[携帯情報端末|PDA]]・[[スマートフォン]]等)にJavaの実行環境が実装されるケースが多い。Java環境はこれら携帯機器全般に広く普及している。一方、[[Symbian OS|Symbian]]および[[BREW]]は携帯電話や(日本的定義での)[[スマートフォン]]を主なターゲットとし、Javaと競合している。

Java MEでは、BREWとは異なり、開発者がライセンス料を支払わずに、プログラムを開発することができる。Java MEはSymbianより広く普及している。その理由は、Java MEがSymbianより広範な携帯機器、特に廉価なモデルで動作するからである。こうした事情からサードパーティにより[[Opera]] miniのようなフリーのJavaソフトウェアを開発することができるようになった。

携帯機器のJava MEプログラムは、[[サンドボックス (コンピュータ)|サンドボックス]]のもとで動くため、多くの開発者が特別な配慮をせずにプログラムを開発しても、安全に実行できる。携帯機器のJava技術が多様化するに伴い、異なるメーカーの携帯機器でもJavaプログラムが動くよう、携帯機器のためのJava技術の標準が必要となった。携帯機器のためのJava MEの標準が[[Mobile Information Device Profile]] (MIDP) である。最初の標準はMIDP 1で、小さい画面を想定したものであり、音声機能は無く、プログラムサイズは32kBまでという制限があった。後のMIDP 2の標準では、音声機能を備え、プログラムサイズの制限は64kBまでと緩和された。携帯機器の設計の進歩は標準化よりも急速であるため、一部のメーカーは、MIDP 2標準の最大プログラムサイズなどいくつかの制限を、意図的に緩和して携帯機器を開発している。

携帯機器におけるJava MEの競合技術について簡単に述べる。

* Symbianの技術は、[[シンビアン]]が開発した携帯電話向けのユーザインタフェースフレームワークを備えたプラットフォームであり、[[マルチスレッド]]機能や[[メモリ保護機能]]をもつ。開発用言語は[[C++]]や[[Java Platform, Micro Edition|Java ME]]などである。Java と同様に、開発者がライセンス料を支払わずに、プログラムを開発することができる。
* BREWの技術は、[[クアルコム]]が開発し推進している、携帯電話向けのプラットフォームである。開発用言語は [[C言語|C]]/[[C++]] である。Javaと異なり、プログラムを開発するために、開発者がライセンス料を支払う必要がある。BREWプログラムは、携帯電話利用者に課金する機能にアクセスすることができる。この課金機能は、クアルコムが管理する厳重な承認機能を、必要とする。この承認機能により、ライセンス料を徴収することができ、また携帯電話ごとにどの BREW プログラムが使えるかを制御することができる。BREWを採用する携帯電話事業社は、排他的なコンテンツ配布の技術を使うことができる。一部の携帯電話事業社はこのコンテンツ配布技術から利益を得ることができると考えている。

世界的な動向としては、

* [[GSM]]の方式を採用するほとんどの携帯電話事業社は、Javaを採用する傾向がある。
* [[符号分割多元接続|CDMA]]の方式を採用する携帯電話事業社の多くは、BREWを採用する傾向がある。ただし例外的に、CDMA式を採用する[[アメリカ合衆国]]の携帯電話事業者 [[スプリント・ネクステル|Sprint Nextel Corporation]] は、Javaを採用している。
* Symbian の[[スマートフォン]]は、スマートフォン市場で85%を占有している。
* Javaの実装は[[携帯機器]]([[携帯電話]]・[[PHS]]や[[携帯情報端末|PDA]]・[[スマートフォン]]等)に広く普及している。
: なお、[[Android]]のJavaライク仮想マシンの実装 ([[Dalvik仮想マシン|Dalvik]]、[[Android Runtime]]) はJava ME互換ではなく、様々な点で差異がある。

また、2001年には[[ソニー]]のコンシューマ[[ゲーム機]] [[PlayStation 2]] にJava仮想マシンが搭載される予定と発表され話題になった<ref>[https://tech.nikkeibp.co.jp/it/free/NSW/NEWS/20010606/1/ プレステ2でJavaが動く!――SCEIがPS2へのJava搭載を発表 | 日経 xTECH(クロステック)]</ref>。


=== バージョン履歴 ===
=== バージョン履歴 ===
{{main|Javaバージョン履歴}}
<!--[[画像:Java WebStartApplicationMan.png|thumb|[[Java Web Start]] '''J2SE 1.3''' から導入された、デスクトップ上のアイコンやウェブサイト上のリンクをクリックすることで、[[World Wide Web|ウェブ]]から[[Javaアプリケーション]]が配布される機構]]-->
{| class="wikitable"
Java は、[[Java Development Kit|JDK]](Java Development Kit; Java開発キット)1.0 以来、数度のメジャーバージョンアップを経ている。バージョンアップに伴い、多くの[[クラス (コンピュータ)|クラス]]と[[パッケージ (Java)|パッケージ]]が標準[[ライブラリ]]に追加されてきた。[[プログラミング言語]]Javaおよび[[Javaプラットフォーム]]は、高い水準でバージョン間の[[互換性]]を保ちつつ発展してきている。
! バージョン !! リリース日
|-
| JDK Beta || 1995年
|-
| JDK1.0 || 1996年1月23日<ref>{{cite web|url=http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml |title=JAVASOFT SHIPS JAVA 1.0|website=sun.com |access-date=2008-02-05 |url-status=dead |archive-url=https://web.archive.org/web/20070310235103/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml |archive-date=March 10, 2007}}</ref>
|-
| JDK 1.1 || 1997年2月19日
|-
| J2SE 1.2 || 1998年12月8日
|-
| J2SE 1.3 || 2000年5月8日
|-
| J2SE 1.4 || 2002年2月6日
|-
| J2SE 5.0 || 2004年9月30日
|-
| Java SE 6 || 2006年12月11日
|-
| Java SE 7 || 2011年7月28日
|-
| Java SE 8 || 2014年3月18日
|-
| Java SE 9 || 2017年9月21日
|-
| Java SE 10 || 2018年3月20日
|-
| Java SE 11 || 2018年9月25日<ref>{{cite web|url=https://blogs.oracle.com/java-platform-group/introducing-java-se-11|title=Introducing Java SE 11|first=Sharat|last=Chander|website=oracle.com|access-date=September 26, 2018|archive-url=https://web.archive.org/web/20180926093144/https://blogs.oracle.com/java-platform-group/introducing-java-se-11|archive-date=September 26, 2018|url-status=live|df=mdy-all}}</ref>
|-
| Java SE 12 || 2019年3月19日
|-
| Java SE 13 || 2019年9月17日
|-
| Java SE 14 || 2020年3月17日
|-
| Java SE 15 || 2020年9月15日<ref>{{cite web|url=https://blogs.oracle.com/java-platform-group/the-arrival-of-java-15|title=The Arrival of Java 15!|date=September 15, 2020|publisher=[[Oracle Corporation|Oracle]]|access-date=2020-09-15}}</ref>
|-
| Java SE 16 || 2021年3月16日
|-
| Java SE 17 || 2021年9月14日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/java17-jp-2021-09-17/|title=オラクル、Java 17をリリース|date=2021-09-17|publisher=[[Oracle Corporation|Oracle]]|access-date=2021-09-30}}</ref>
|-
| Java SE 18 || 2022年3月22日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/oracle-releases-java-18-2022-03-23/|title=オラクル、Java 18を発表|date=2022-03-22|publisher=[[Oracle Corporation|Oracle]]|access-date=2022-03-23}}</ref>
|-
| Java SE 19 || 2022年9月20日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/oracle-releases-java-19-2022-09-20/|title=オラクル、Java 19をリリース|date=2022-09-21|publisher=[[Oracle Corporation|Oracle]]|accessdate=2022-09-21}}</ref>
|-
| Java SE 20 || 2023年3月21日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/oracle-releases-java-20-2023-03-21/|title=オラクル、Java 20をリリース|date=2023-03-22|publisher=[[Oracle Corporation|Oracle]]|accessdate=2022-03-23}}</ref>
|-
| Java SE 21 || 2023年9月19日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/ocw-oracle-releases-java-21-2023-09-19/|title=オラクル、Java 21のリリースとサポート・ロードマップの延長を発表|date=2023-09-19|publisher=[[Oracle Corporation|Oracle]]|accessdate=2023-09-21}}</ref>
|-
| Java SE 22 || 2024年3月19日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/oracle-releases-java-22-2024-03-19/|title=オラクル、Java 22をリリース|date=2024-03-21|publisher=[[Oracle Corporation|Oracle]]|accessdate=2024-03-23}}</ref>
|-
| Java SE 23 || 2024年9月17日<ref>{{Cite web|和書|url=https://www.oracle.com/jp/news/announcement/oracle-releases-java-23-2024-09-17/|title=オラクル、Java 23をリリース|date=2024-09-17|publisher=[[Oracle Corporation|Oracle]]|accessdate=2024-09-18}}</ref>
|}


== Javaプログラミング例 ==
J2SE 1.4から、Javaの開発は[[Java Community Process|JCP]] (Java Community Process) という標準化プロセスで行うようになっている。JCPでは、JSRs (Java Specification Requests) という文書群により、Javaに対する追加機能やJavaプラットフォームに対する変更の提案と規定を行う。

また、J2SE 1.3以降では開発コードネームとして、メジャーバージョンには動物の名前が、マイナーバージョンには昆虫の名前が付けられる傾向がある。

言語仕様は JLS(Java Language Specification; Java言語仕様)により規定する。JLSは[http://www.jcp.org/en/jsr/detail?id=901 JSR 901]の管理下にある。

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

==== JDK 1.0 (1996年1月23日) ====
最初のバージョン。[http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.html プレスリリース (英語)]
* このバージョンでは日本語などの国際化対応はなされていなかった。

==== JDK 1.1 (1997年2月19日) ====
いくつかの重要な機能が追加された。[http://www.sun.com/smi/Press/sunflash/1997-02/sunflash.970219.0001.html プレスリリース (英語)]
* [[国際化と地域化|国際化]]対応([[日本語]]も含む)
* [[Abstract Window Toolkit|AWT]] イベントモデルにおける大規模な再構成
* 言語仕様に「内部クラス」が追加された
* [[JavaBeans]] [[ソフトウェアコンポーネント]]技術
* [[JDBC]] [[データベース]]接続[[アプリケーションプログラミングインタフェース|API]]
* [[Java Remote Method Invocation|Java RMI]] 分散オブジェクト技術
* [[リフレクション]] : クラス名や、クラスに定義されている操作である[[メソッド (計算機科学)|メソッド]]名を動的に指定して呼び出す。<ref>[http://docs.oracle.com/javase/jp/8/docs/api/java/lang/reflect/package-summary.html#package.description]</ref>

==== J2SE 1.2 (1998年12月8日) ====
コードネーム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) の基となるエディションであることが明確化された。[http://www.sun.com/smi/Press/sunflash/1998-12/sunflash.981208.9.html プレスリリース (英語)]
* <code>strictfp</code>キーワード : [[IEEE 754]]に基づいた厳密な[[浮動小数点数]]の演算を行う
* [[Swing]] [[グラフィカルユーザインタフェース]][[ウィジェット・ツールキット|ツールキット]]が標準ライブラリに統合された。
* サンの[[Java仮想マシン]]に[[ジャストインタイムコンパイル方式|ジャストインタイムコンパイラ]]が備わる。
* Java Plug-in : さまざまな[[ウェブブラウザ]]にJava実行環境を組み込むことができるようになり、[[Javaアプレット]]を実行できるようになった。
* Java IDLという [[インタフェース記述言語|IDL]](インタフェース記述言語)の実装が導入され、[[Common Object Request Broker Architecture|CORBA]]分散オブジェクト環境との相互運用ができるようになった
* [[コンテナ (データ型)|コレクション]]フレームワークの導入

==== J2SE 1.3 (2000年5月8日) ====
コードネームKestrel。[http://www.sun.com/smi/Press/sunflash/2000-05/sunflash.20000508.3.html プレスリリース (英語)] [http://java.sun.com/j2se/1.3/ja/docs/ja/relnotes/features.html 新機能の概要(日本語)]
* [[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) の導入。

==== J2SE 1.4 (2002年2月6日) ====
コードネームMerlin。このバージョンは、[[Java Community Process|JCP]] (Java Community Process) の下で開発された最初の[[Javaプラットフォーム]]である<ref>[http://www.jcp.org/en/jsr/detail?id=59 JSR 59]</ref>。[http://www.sun.com/smi/Press/sunflash/2002-02/sunflash.20020206.5.html プレスリリース(英語)] [http://java.sun.com/j2se/1.4/ja/docs/ja/relnotes/features.html 新機能の概要(日本語)]
*<code>assert</code> キーワード : ある程度、「[[契約による設計]]」に基づいたプログラミングが可能となる。[http://www.jcp.org/en/jsr/detail?id=41 JSR 41] で規定された。
*[[Perl]]のような[[正規表現]]のライブラリの導入により、[[文字列]]データ([[テキスト]])の高度な処理機能が提供される。
*連鎖[[例外処理|例外]]機能により、ある例外の原因となった例外を連鎖的に記録できるようになる。
*NIO (New I/O) : 新しい[[入出力]]機能。[http://www.jcp.org/en/jsr/detail?id=51 JSR 51]で規定。
*[[ログ|ロギング]] APIが標準ライブラリに追加される。[http://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文書処理機能のライブラリが、標準で提供されるようになった。[http://www.jcp.org/en/jsr/detail?id=5 JSR 5]および[http://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アプリケーション]]の配備と実行を簡素化する技術。[http://www.jcp.org/en/jsr/detail?id=56 JSR 56]で規定。Java Web Start自体は2001年3月に J2SE 1.3 向けのバージョンがリリースされていた。

==== J2SE 5.0 (2004年9月30日) ====
コードネームTiger。[http://www.jcp.org/en/jsr/detail?id=176 JSR 176] のもとで開発された。J2SE 5.0 では、言語仕様に大きく拡張が加えられ、多くの新しい言語機能が追加された。[http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html プレスリリース(英語)] [http://java.sun.com/j2se/1.5.0/ja/docs/ja/relnotes/features.html 新機能の概要(日本語)]。もともとは J2SE 1.5 という名称だったが、この名称はすでに内部的なバージョン番号として使われていた<ref>http://java.sun.com/j2se/1.5.0/docs/relnotes/version-5.0.html</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[[デザインパターン (ソフトウェア)|パターン]]が言語レベルでサポートされ、列挙型(順序つきリストの値、多くの場合は定数)を安全に定義することができる。このタイプセーフenumパターンの詳細は、ジョシュア・ブロックほか (2001) pp.97-106 「第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}}インタフェースを実装したコレクションオブジェクトである必要がある。この構文を使ったコーディング例を示す。

<source lang="java5">
void displayWidgets (Iterable<Widget> widgets) {
for (Widget w : widgets) {
w.display();
}
}
</source>

この例では、<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 SE 6 (2006年12月11日) ====
コードネームMustang。[http://www.jcp.org/en/jsr/detail?id=270 JSR 270]のもとで開発された。Java SE 6においては、サンは命名方針を変更して、"J2SE" から'''Java SE'''に変更し、バージョン番号から ".0" の部分を廃止している<ref>http://www.java.com/en/about/brand/naming.jsp</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サービス]]

=====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>[http://internet.watch.impress.co.jp/cda/news/2008/10/22/21274.html 「Java SE 6 Update 10」公開、動作速度を高速化]</ref>。[[Javaアプレット]]や[[Java Web Start]]の起動を容易にするための、配備ツールキットが公開された[http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/jweb/deployment_advice.html]。

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

Java SE 7に追加された項目は以下のとおりである。

*主として[[動的プログラミング言語|動的言語]]を想定した、invokedynamic の追加 (JSR 292)
*NIO.2 (JSR 203), [[Stream Control Transmission Protocol]], [[Sockets Direct Protocol]]
*JDBC 4.1
*コレクションや並列性のライブラリの機能追加 (JSR 166y)
*JAXP, JAXB, JAX-WSの更新
*ClassLoaderの改善
*Project Coinの一部
*[[JavaFX]] 2.0(Update 2より)

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

当初搭載予定だった、以下の機能はJava SE 9に延期となった<ref>[http://mreinhold.org/blog/on-the-next-train Project Jigsaw: On the next train]</ref>。
*言語レベルでのモジュール化のサポート (Project Jigsaw, JSR 294)

また、搭載予定だった以下の機能は廃止 (withdrawn) になった。
*Swing アプリケーションフレームワーク (JSR 296)

==== Java SE 9 (2017年9月21日) ====
Java SE 9 は Java SE 8 リリースの3年後の[[2017年]]9月21日にリリースされた。<ref>[http://openjdk.java.net/projects/jdk9/ JDK 9]</ref>。言語レベルでのモジュール化のサポート (Project Jigsaw, JSR 294) などを追加した。

[[オラクル (企業)|オラクル]]はJavaの開発速度向上のため、これまでの新機能の完成を待ってメジャーバージョンアップを行うリリースモデルから、毎年3月と9月の年2回メジャーバージョンアップを行うタイムベースのリリースモデルへと移行することを発表した。またサポートサイクルも見直され、Java SE 9は次のメジャーバージョンまでの6ヵ月間のみ公式アップデートが提供されるnon-LTSリリースとなり、2018年3月に公式アップデートが終了した。なお、LTSリリースとなるJava SE 11以降は配布形態が変更されるため、LTSリリースの公式アップデートは提供されなかった[https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html]。

==== 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>[http://openjdk.java.net/projects/jdk/10/ JDK 10]</ref>。ローカル変数[[型推論]]などの機能が追加されている。

==== 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リリースとなるが、[[オラクル (企業)|オラクル]]による長期サポートはOracle JDKを対象にしたものであり、[[オラクル (企業)|オラクル]]による[[OpenJDK]]の提供がJava SE 12リリース以降も行われるかは、2018年10月時点で未定である。

== 特徴 ==
Javaの主な特徴を述べる。

=== 思想 ===
Javaを開発する上では、5つの目標があった。

* [[オブジェクト指向プログラミング]]の方法論を採用する
* 異なるOS上で同一の[[プログラム (コンピュータ)|プログラム]]が動くようにする
* [[コンピュータネットワーク]]を扱う機能を標準で備える
* 遠隔のコンピュータ上にある実行コードを安全に実行できるよう設計する
* 開発をしやすくするために、従来の[[Smalltalk]]、[[C++]]などの[[オブジェクト指向プログラミング言語]]から良い部分を引き継ぐ

ネットワーク機能および遠隔コンピュータの実行コードの実行を実現するために、場合によっては、Java[[プログラマ]]は、[[Common Object Request Broker Architecture|CORBA]]やInternet Communications Engine、[[OSGi]]のような拡張機能を使う。

=== オブジェクト指向プログラミング ===
Javaは[[クラスベース]]の[[オブジェクト指向プログラミング言語]]である。[[オブジェクト指向]]とは、現実世界をモデル化する手法のひとつであり、データ(状態)とそれに関連する振る舞い(処理)をまとめて[[オブジェクト (プログラミング)|オブジェクト]](物体)として扱う。

Javaのプログラムは複数の[[クラス (コンピュータ)|クラス]]から構成される。[[オブジェクト指向]]におけるクラスとは、オブジェクトの設計図にあたるものである。各クラスから実体化した[[オブジェクト (プログラミング)|オブジェクト]]はインスタンスと呼ばれる。クラスは再利用可能なソフトウェア部品の単位としてよく使われる。Javaのクラスは[[カプセル化]]・[[継承 (プログラミング)|継承]]・[[ポリモーフィズム]]をサポートする。

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++では純粋仮想関数のみを持つクラスに相当し、実装を持たない型である。ただし、Java 8以降はインタフェースのデフォルト実装により、実装の多重継承も限定的にサポートするようになった。なお、実装の多重継承をサポートしないという設計思想は、[[C Sharp|C#]]でも採用されている。

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

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

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

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

=== プラットフォーム非依存 ===
[[ファイル:GC SwingDemo.jpg|thumb|250px|Java [[Swing]][[グラフィカルユーザインタフェース]] (GUI) の[[Look and feel|ルックアンドフィール]]は、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない]]
<!--
[[画像:SwingSet.png|thumb|Java [[Swing]][[グラフィカルユーザインタフェース]] (GUI) の[[Look and feel|ルックアンドフィール]]は、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない]]
-->
Javaのもう一つの特徴は[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存していないことであり、これは、Javaの[[プログラム (コンピュータ)|プログラム]]がさまざまな[[ハードウェア]]や[[オペレーティングシステム]]上で必ず同じように動く、ということを意味する。一度Javaのプログラムを作成すれば、そのプログラムはどのプラットフォーム上でも動くのである。{{いつ範囲|date=2019年2月|近年}}では、Java実行環境を構成するJava仮想マシンに高速化の技術が導入され、プラットフォームに依存したプログラムと同水準の実行性能を実現している。

Javaのプラットフォーム非依存性は、次のようにして実現されている。

* ほとんどのJavaの[[コンパイラ]]([[Javaコンパイラ]])は、Javaの[[ソースコード]]を中間言語([[中間表現]])に[[コンパイル]]する。このJavaの中間言語のコードを[[バイトコード]]という。バイトコードは[[Java仮想マシン]](Java VM、[[仮想機械|仮想マシン]]の一種)で実行可能な簡潔な[[機械語]]命令からなる。
* Javaプログラムを実行する際には、このバイトコードをJava仮想マシン上で実行する。Java仮想マシンは、実行するハードウェアにネイティブなソフトウェアであり、中間言語であるバイトコードを解釈して実行する。
* Java実行環境は、Java仮想マシンの他に、標準[[ライブラリ]]を備えている。この標準ライブラリを利用することにより、Javaプログラムは、グラフィクス、[[スレッド (コンピュータ)|スレッド]]、[[コンピュータネットワーク|ネットワーク]] など実行するマシンのさまざまな機能を、プラットフォームに依存しない単一の方法で使うことができるようになる。プラットフォームごとに異なる方法を使い分ける必要は無い。
* Javaのバイトコードの実行時には、Java仮想マシンにより、最終的にはハードウェアにネイティブな[[機械語]]コードに変換されて実行される。このバイトコードから機械語コードへの変換は、Java仮想マシンが[[インタプリタ]]として行う場合と、Java仮想マシンが[[ジャストインタイムコンパイル方式|ジャストインタイムコンパイラ]]を使って行う場合とがある。

また、実際には[[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アプレット]]を動かすためには、別途に[[プラグイン]]が必要となった。しかし、サンなどの企業は、{{いつ範囲|date=2019年2月|近年}}のバージョンのWindowsのユーザが、無償でJava実行環境を利用できるようにした。そのため、ほとんどのWindows PCのユーザは、何ら問題なくウェブおよびデスクトップ上でJavaアプリケーションを実行できる。

最初期の[[Java Runtime Environment|Java実行環境]]の実装では、Javaプログラムの実行速度が遅かったが、{{いつ範囲|date=2019年2月|近年}}では大きく改善されて、高速に実行できるようになった。最初期のJava実行環境の[[Java仮想マシン]]の実装は、[[移植性]]を実現するために[[インタプリタ]]として動作する[[仮想機械|仮想マシン]]を採用した。こうした初期のJava実行環境の実装では、Javaプログラムの実行速度が[[C言語|C]]や[[C++]]のプログラムと比べて遅かった。そのため、Javaプログラムの実行速度は遅いという評判が広まった。{{いつ範囲|date=2019年2月|近年}}のJava実行環境の実装では、いくつかの技術を導入することにより、{{いつ範囲|date=2019年2月|以前}}と比べて、Javaプログラムをかなり高速に実行できるようになった。

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

Java の[[移植性]]([[プラットフォーム (コンピューティング)|プラットフォーム]]非依存性)がどの程度実現できているかについては、議論の対象となっている。技術的には、移植性とは実現が難しい目標である。多くのプラットフォームにおいて同一に動作するJavaプログラムを作成することは、可能である。{{要出典範囲|date=2019年2月|しかし実際には、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は[[ガベージコレクション]]機能を備えており、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、[[プログラマ]]の負担が完全に解消されるわけではないものの、大きく軽減される。{{いつ範囲|date=2019年2月|近年}}のJavaでは[[世代別ガベージコレクション]]というより効率的な技術を導入している。

ガベージコレクションを備えていない[[C++]]やその他の言語の場合、プログラマが適切にメモリの管理をしなければならない。[[オブジェクト指向プログラミング]]をするプログラマは一般に、Javaと同様メモリ内の[[ヒープ領域|ヒープ]]に[[オブジェクト (プログラミング)|オブジェクト]]を格納する領域を割り当てる。そしてオブジェクトがもはや必要なくなった場合に、必ず明示的にオブジェクトを削除する指示を記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならない。メモリ管理が不十分なプログラムでは、[[メモリリーク]]が発生する可能性がある。メモリリークとは、不適切な指示などで、解放されなかったメモリ領域が累積していき、利用できるメモリの量が減っていくことで、気付かないうちに大量のメモリを消費してしまう問題が起こり得る。他にも、メモリ領域を解放する際に、解放の指示を重複して行ってしまい、プログラムの実行を不安定にするなどのケースがあり、悪くすると異常終了してしまうこともある。

ガベージコレクション機能は、このような潜在的な問題の多くを未然に防ぐことができる。プログラマは任意の時点で[[オブジェクト (プログラミング)|オブジェクト]]を生成することができ、Java実行環境は生成されたオブジェクトのライフサイクルを管理する責任を持つ。

プログラム(オブジェクト)は、他のオブジェクトへの[[参照 (情報工学)|参照]]を持ち、そのオブジェクトの[[メソッド (計算機科学)|メソッド]]を呼び出すことができる。他のオブジェクトへの参照とは、低水準の視点で述べると、メモリ内の[[ヒープ領域|ヒープ]]という領域上に確保されたそのオブジェクトを指すアドレスのことである。

オブジェクトがどこからも参照されなくなった場合、Javaのガベージコレクション機能が自動的にその「到達不可能なオブジェクト」を削除し、そのメモリ領域を解放することで、解放し忘れた未解放メモリが累積していき利用できるメモリ量が減っていく[[メモリリーク]]を防ぐ。

ただしJavaのガベージコレクション機能は、メモリリークの問題を完全に解消するわけではない。[[プログラマ]]が、自分のプログラムでもはや必要のないオブジェクトへの参照を保持し続けた場合は、やはりメモリリークが発生する可能性がある。

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

C++においても、Javaと同等のメモリ管理の高速性と効率性を実現することは可能ではあるが、先に述べた通り、複雑な作業で間違いやすく、完璧に行おうとすれば開発期間が非常に長くなり、開発したソフトウェアはかなり複雑で難解になる。たとえば、C++で特定のクラスを対象として、高速実行およびメモリ利用の断片化の最小化を、高水準で達成できるメモリ管理モデルで設計開発する技法があるが、こうした技法は複雑である。

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

=== ネットワーク機能 ===
Javaでは充実した[[ライブラリ]]により、[[コンピュータネットワーク]]を使うソフトウェアを、効率良く開発できる。Javaの初期のバージョンから、[[インターネット・プロトコル・スイート|TCP/IP]] ([[IPv4]]) のライブラリを備えており、ネットワークで[[ソケット (BSD)|ソケット]]通信を行うソフトウェアを簡単に実装できた。分散オブジェクト環境のソフトウェアの開発も早い時期からできるようになった。[[Java Remote Method Invocation|Java RMI]]もしくは[[Common Object Request Broker Architecture|CORBA]]の分散オブジェクト技術を標準で使うことができる。{{いつ範囲|date=2019年2月|近年}}では、標準、拡張その他のライブラリにより、さまざまな[[通信プロトコル|ネットワークプロトコル]]を高水準で扱えるようになっている。
*[[ファイル転送プロトコル|FTP]]([[ファイル (コンピュータ)|ファイル]]送受信)
*[[Hypertext Transfer Protocol|HTTP]]([[World Wide Web|ウェブ]]によるデータ送受信)
*[[Simple Mail Transfer Protocol|SMTP]]/[[Post Office Protocol|POP]]/[[Internet Message Access Protocol|IMAP]]、[[Network News Transfer Protocol|NNTP]]([[電子メール]]送受信、[[ネットニュース]])
*[[Secure Shell|SSH]]、[[Transport Layer Security|TLS/SSL]](セキュアな通信により盗聴やなりすましを防ぐ)
*[[Server Message Block|SMB]]([[ファイルサーバ]]へのアクセス)
*ほか
{{いつ範囲|date=2019年2月|現在}}では[[IPv6]]も扱えるようになりつつある。

[[Extensible Markup Language|XML]]文書を扱う技術とネットワーク機能を有効に組み合わせることにより、高度なシステムやサービスを構築できるようになっている。

=== セキュリティ ===
Javaでは初期のバージョンから遠隔のコンピュータ上にある実行コード([[Javaアプレット]])を安全に実行できるよう設計されていた。
*[[Java仮想マシン]]の[[バイトコード]]検証機能により、Javaの実行コードであるバイトコードが正しいかどうかを検査する。
*Java実行環境の[[クラスローダ]]機能により、[[クラス (コンピュータ)|クラス]](バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査する。
*Java実行環境のセキュリティマネージャ機能([[サンドボックス (セキュリティ)|サンドボックス]])により、Javaアプレットが、ユーザによって許可された資源以外の資源に不正にアクセスすることを防ぐ。
**Java実行環境の既定の設定では、遠隔のコンピュータ上にある実行コード(Javaアプレット)に対して、ローカルにあるファイル等へのアクセスや、アプレットのダウンロード元以外の遠隔コンピュータとの通信を禁止している。

=== 名前空間 ===
Javaは、[[パッケージ (Java)|パッケージ]]という[[名前空間]]の機構を持つ言語であり、[[ライブラリ]]および[[アプリケーションソフトウェア]]に含まれる多数の Java の[[プログラム (コンピュータ)|プログラム]]([[クラス (コンピュータ)|クラス]]とインタフェース)を、パッケージの階層構造に分類・整理することができる。名前空間の機構を持たない言語と比べて、多数のクラスとインタフェースの管理が容易となり、クラスとインタフェースの命名についても、既存のクラス/インタフェースとの名前の衝突回避を考慮する労力が、大きく軽減される。

== 実行形態 ==
Java の[[バイトコード]]には複数の実行形態があると考えることができる。ただしいずれのバイトコードも、[[Java Runtime Environment|Java実行環境]] (JRE) の下で実行されるという点では、同じと考えることもできる。
;[[Javaアプリケーション]]
:ローカルのコンピュータで実行されるJavaプログラム。
;[[Javaアプレット]]
:[[コンピュータネットワーク|ネットワーク]]上に置かれ[[ウェブブラウザ]]上で実行できるJavaプログラム。ワンクリックで実行できるため、その動作には[[サンドボックス (セキュリティ)|サンドボックス]]機構の下で厳しい制限が加えられている。
;[[Java Servlet|Javaサーブレット]]
:[[ウェブページ]]を動的に作るJavaプログラム。[[Perl]]などによる[[Common Gateway Interface|CGI]]に比べ、サーバ側の負荷が低いなどのメリットがある。
;[[JavaServer Pages]] (JSP)
:[[Extensible HyperText Markup Language|XHTML]] ([[HyperText Markup Language|HTML]]) 内に記述するJavaプログラム。サーバ側で解釈して動的にウェブページを作り出す。コードの見た目は似ているが、[[ECMAScript]] ([[JavaScript]]) のようにブラウザ側で実行するスクリプトではない。サーブレットの機能を補完するもの。類似の技術に [[Active Server Pages]] (ASP)、[[ASP.NET]]、[[PHP (プログラミング言語)|PHP]] などがある。
;[[Java Web Start]]
:[[Javaアプリケーション]]を簡単に配備し実行する仕組み。[[拡張子]]がjnlpとなっているファイルをウェブブラウザなどでワンクリックしただけで自動ダウンロード、自動インストールを行い、また最新バージョンがあるかをネット上で自動チェックしあれば自動アップデートしてから実行する。[[Javaアプレット]]のように実行時にウェブブラウザを必要とすることはない。類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnce がある。

== 構文 ==
{{main|Javaの文法}}
{{main|Javaの文法}}
構文は、[[C言語|C]]および[[C++]]から多くを引き継いでいる。このため、設計当時には割合として多かった、CやC++しか書けない[[プログラマ]]にも習得しやすいと、{{要出典範囲|date=2017年10月|メーカーや信者は宣伝した}}。Javaが設計された1990年代中旬以前は、Cのプログラマが多く、また[[オブジェクト指向プログラミング言語]]の中では、[[C++]]は広く使われてきた言語の一つだった。

なお、JavaではC++と違って名前空間レベルの関数(メソッド)および変数(フィールド)の宣言および定義を許可しておらず、必ず何らかのクラス定義の中に記述することが特徴である。この特徴は後発の[[C Sharp|C#]]も踏襲している。

=== Hello world ===
次の節以降では、[[Hello world]][[プログラム (コンピュータ)|プログラム]]で、Javaプログラムの例を示して説明する。

Hello worldプログラムとは、"Hello, world" という文字列をディスプレイなどの出力装置に出力する簡単なソフトウェアプログラムである。プログラミング言語の初学者向けのプログラム例としてよく使われる。

なお先に述べた通り、Javaには複数の実行形態があると考えることができるので、以降では、それぞれの実行形態におけるHello worldプログラムを例示する。

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


=== Hello World ===
<source lang="java">
<syntaxhighlight lang="java">
// Hello.java
// Hello.java
public class Hello {
public class Hello {
478行目: 187行目:
}
}
}
}
</syntaxhighlight>
</source>


このプログラムについ説明する。
*Javaプログラムでは全のフィールドとメソッドが<code>'''class'''</code>内に記述される。
*Javaプログラムすべてを<code>'''class'''</code>内に記述する。コマンドラインのスタンドアロンアプリケションの場合も同じである。
*Javaプログラムは静的メソッド<code>'''public static void main (String[] args)'''</code>から開始される。<code>'''args'''</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に記述する方法もある。


== Javaプラットフォーム ==
=== 例: スタンドアロン (Swing) ===
{{Main|Javaプラットフォーム}}
[[グラフィカルユーザインタフェース]] (GUI) 環境で動く [[Swing]]を使った[[スタンドアローン|スタンドアロン]]の[[Javaアプリケーション]]の例を示す。Swingは、[[Java Platform, Standard Edition|Java SE]]の高度なGUIの[[ウィジェット・ツールキット]]の[[ライブラリ]]である。
Javaプラットフォーム (''Java Platform'') は、Javaプログラムを開発または実行する為のソフトウェア群の総称である。Javaプラットフォームは対象環境に合わせて、Java実行環境およびJava開発環境の構成内容と、Javaテクノロジの追加内容を変えたエディションに編集されて公開されている。Javaテクノロジは権利元ベンダーだけでなく[[サードパーティー]]側からも提供されており、その標準化は[[Java Community Process|Javaコミュニティプロセス]] (JCP) が管理している。Java実行環境とJava開発環境はオープンソース化されているので各企業、各団体、開発者各自が営利または非営利で様々なソフトウェアと関連技術を公開しており、巨大なITエコシステムを構築している。


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


; [[Java Platform, Standard Edition]] (Java SE)
public class Hello extends JFrame {
: [[スマートフォン]]や[[タブレット端末]]を含むパーソナルコンピュータ向けである。主にデスクトップアプリケーションとWEBアプリを開発または実行する。一般ユーザー用仕様と言える。
Hello() {
; [[Jakarta EE|Java Platform, Enterprise Edition]] (Java EE) / [[Jakarta EE]]
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
: サーバマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバ及び多層クライアントサーバ、業務用システムを開発する為の、様々な拡張技術クラスライブラリ&amp;APIが追加されている。業務用プロフェッショナル仕様であり大規模である。
add(new JLabel("Hello, world!"));
: 2017年9月にオラクルは今後の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=オラクル |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の商標は現行版のサポートを続けるオラクルが保持したので、エクリプス財団による今後のバージョンは'''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>。
pack();
; [[Java Platform, Micro Edition]] (Java ME)
}
: [[組み込みシステム]]、[[マイクロコントローラ]]向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&amp;APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
; [[Javaカード|Java Card]]
: [[スマートカード]](ICカード)、小型メモリデバイス上で運用されるプログラムを開発するためのエディションである。{{いつ範囲|date=2019年3月|現在}}では[[SIMカード]]や[[ATMカード]]など幅広い分野に普及している。Java仮想マシンの機能は非常にコンパクトにまとめられており、幾つかのプリミティブ型も省略されている。故に特殊なプログラミングスタイルが求められる。


=== Java実行環境 (JRE) ===
public static void main(String[] args) {
{{Main|Java Runtime Environment}}
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実行環境 (''Java Runtime Environment''; JRE) は、Javaアプリケーションを実行するために必要なソフトウェアである。[[Java仮想マシン]]、<nowiki>''</nowiki>Java.exe<nowiki>''</nowiki>のスターターを含めた各種実行サポートツール、Javaクラスライブラリで構成される。Java実行環境の中核はJava仮想マシンである。エディション毎に仮想マシンの仕様と性能は異なっており、また実行時は複数の動作モードを持つ。仮想マシンはスターターを通して稼働されるのが普通である。様々な使用状況に対応したスターターが最初に実行されて、そこから仮想マシンが呼び出されてJavaプログラムの実行を移譲される。仮想マシンはJavaクラスライブラリを逐次読み込みながらJavaプログラムを実行する。Java実行環境のツール内容とクラスライブラリ構成は、エディション毎に違いがある。
=== 例: アプレット ===
[[Javaアプレット]]は、他のアプリケーションに埋め込まれるプログラムである。多くの場合は、[[ウェブブラウザ]]に表示される[[ウェブページ]]に埋め込まれる。


;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つの要素の扱いは、ブラウザごとに異なることがある[http://java.sun.com/docs/books/tutorial/deployment/applet/applettag.html][http://java.sun.com/docs/books/tutorial/deployment/applet/mixedbrowser.html]。 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">
// 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!");
}
}
</source>
*'''<code>import</code>'''文は、[[コンパイル]]時にJavaコンパイラに対し、このソースコード内では'''{{Javadoc:SE|package=java.io|java/io}}'''パッケージおよび'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/package-summary.html javax.servlet]</code><!--{{Javadoc:EE|package=javax.servlet|javax/servlet}}-->'''パッケージ内のすべてのpublicなクラスとインタフェースを、パッケージ名をつけないでクラス名 / インタフェース名だけで使うことを、伝える。
*<code>'''Hello'''</code> <code>class</code> <code>'''extends'''</code> '''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/GenericServlet.html GenericServlet]</code><!--{{Javadoc:EE|javax/servlet|GenericServlet}}-->''' の部分は、<code>Hello</code>クラスが <code>GenericServlet</code>クラスを継承すること(<code>GenericServlet</code>の[[サブクラス (計算機科学)|サブクラス]]であること)を記述している。
*<code>GenericServlet</code>クラスは、サーブレットの一般的なフレームワークを提供する。[[サーバ]]上で、[[クライアント (コンピュータ)|クライアント]]から送られてきた要求をサーブレットに渡し、サーブレットのライフサイクルを制御する。
*<code>Hello</code>クラスは<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/Servlet.html Servlet]</code><!--{{Javadoc:EE|javax/servlet|Servlet}}-->で宣言された'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/Servlet.html#service(javax.servlet.ServletRequest,%20javax.servlet.ServletResponse) service(ServletRequest, ServletResponse)]</code><!--{{Javadoc:EE|name=service(ServletRequest, ServletResponse)|javax/servlet|Servlet|service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)}}-->'''メソッドをオーバーライドしている。このメソッドは、クライアントからの要求を扱うコードを開発者が記述する場所として、サーブレットフレームワークが開発者に提供しているメソッドである。<code>service(ServletRequest, ServletResponse)</code>メソッドは、'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/ServletRequest.html ServletRequest]</code><!--{{Javadoc:EE|javax/servlet|ServletRequest}}-->'''オブジェクトと'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/ServletResponse.html ServletResponse]</code><!--{{Javadoc:EE|javax/servlet|ServletResponse}}-->'''オブジェクトを<code>Hello</code>に渡す。<code>Hello</code>は<code>ServletRequest</code>と<code>ServletResponse</code>を受け取る。
**<code>ServletRequest</code>オブジェクトは、クライアントから送られてきた要求を表すオブジェクトである。
**<code>ServletResponse</code>オブジェクトは、クライアントに送り返す応答を表すオブジェクトである。
*<code>service(ServletRequest, ServletResponse)</code>メソッドの<code>throws ServletException, IOException</code>の部分では、このメソッドが<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/ServletException.html ServletException]</code><!--{{Javadoc:EE|javax/servlet|ServletException}}-->もしくは{{Javadoc:SE|java/io|IOException}}の[[例外処理|例外]]を投げる可能性があることを宣言している。これらの例外は、<code>Hello</code> サーブレットの実行中に何らかの問題が起こり、クライアントからの要求に正常な応答を返すことができなくなった場合に投げられる。
*'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/ServletResponse.html#setContentType(java.lang.String) setContentType(String)]</code><!--{{Javadoc:EE|name=setContentType(String)|javax/servlet|ServletResponse|setContentType(java.lang.String)}}-->'''メソッドを呼び出して、クライアントに返すデータの[[メディアタイプ|MIME Content-Type]]を '''"text/html"''' に設定する。
*'''<code>[http://www.jajakarta.org/tomcat/servletapi/servletapi-4.0/docs-ja/javax/servlet/ServletResponse.html#getWriter() getWriter()]</code><!--{{Javadoc:EE|name=getWriter()|javax/servlet|ServletResponse|getWriter()}}-->'''メソッドを呼び出して'''{{Javadoc:SE|java/io|PrintWriter}}'''オブジェクトを取得する。このオブジェクトを使ってクライアントに返すデータを書き出すことができる。
*'''{{Javadoc:SE|name=println(String)|java/io|PrintWriter|println(java.lang.String)}}'''メソッドを呼び出して、'''"Hello, world!"''' 文字列を応答データとして書き出す。
*<!--'''<code>[http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/PrintWriter.html#close() close()]</code>{{Javadoc:SE|name=close()|java/io|PrintWriter|close()}}'''メソッドを呼び出して<code>PrintWriter</code>のストリームを閉じる。-->そして応答データは[[ソケット (BSD)|ソケット]][[ストリーム (プログラミング)|ストリーム]]に書き出され、クライアントに返される。

== 構成 ==
[[Javaプラットフォーム]]の構成を説明する。
*[[#Java実行環境]] (JRE) は、[[Javaプラットフォーム]]に配置されたJavaアプリケーションを実行するために必要な、[[ソフトウェア]]である。[[Javaクラスライブラリ|標準クラスライブラリ]]や[[Java仮想マシン]]などから構成される。
*[[#Java開発キット]] (JDK) は、Javaプログラムの開発を支援する基本的なソフトウェアである。
*[[#JREとJDKの複数の実装]]で、JREとJDKの開発と提供の状況について簡単に述べる。
*[[#Javaのエディション]]で、[[オラクル (企業)|オラクル]]と[[Java Community Process|JCP]]が規定している3つのJavaのエディションについて簡単に述べる。
*[[#拡張機能と関連技術]]で、Javaの主な拡張機能と関連する技術を述べる。

=== Java実行環境 ===
{{Main|Java Runtime Environment}}


Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。
Java実行環境 (JRE; Java Runtime Environment) は、[[Javaプラットフォーム]]に配置されたJavaアプリケーションを実行するために必要な、[[ソフトウェア]]である。標準クラス[[ライブラリ]]や[[Java仮想マシン]]などから構成される。


# 基礎ライブラリ - Java言語の基礎を扱う。
エンドユーザは普通、Javaソフトウェアパッケージや[[ウェブブラウザ]][[プラグイン]]の利用を通じてJREを使う。[[オラクル (企業)|オラクル]] / [[Java Community Process|JCP]]をはじめ複数の団体や企業により、 さまざまな[[プラットフォーム (コンピューティング)|プラットフォーム]]向けに、多くの JRE の[[実装]]が開発・提供されている。
# 入出力ライブラリ - ファイル入出力など。
# コレクションライブラリ - 動的配列と動的連想配列。データ集合の操作。
# 数学ライブラリ - 各種計算を扱う。
# 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの[[国際化と地域化]]を扱う。
# ネットワークライブラリ - ソケット通信を扱う。
# GUIライブラリ - グラフィカル・ユーザーインターフェースを扱う。
# アプレットライブラリ - アプレット生成用。
# Javaビーンズライブラリ - ソフトウェアコンポーネント作成用。
# データベース接続ライブラリ - SQLを扱う。
# リモートメソッドライブラリ - 分散オブジェクトを扱う。
#セキュリティライブラリ - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。


;Javaアプリケーションの形態
JREの他、オラクル / JCPなどの団体・企業は、Java開発キット (JDK) と呼ばれるJREのスーパーセットの実装を開発・提供している。JDKは、Javaプログラムの開発を支援する基本的なソフトウェアであり、多くの開発ツールが含まれている。
Java実行環境に用意されている特定のJavaクラスライブラリを利用する事でJavaプログラムは結果的に、以下の四種類のアプリケーション形態に派生する。


;[[Javaアプリケーション]] (application)
==== 実行環境の構成 ====
:パーソナルコンピュータなどのローカル環境で実行されるJavaプログラム。「[[Java Web Start]]」は任意のjnlpファイル(''java network launching protocol'')をダウンロードして実行できるJavaアプリの配布システムである。この類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnceがある。
Java実行環境は、[[Javaクラスライブラリ|標準クラスライブラリ]]と[[Java仮想マシン]]、およびいくつかのファイルとソフトウェアから構成される。
;[[Javaアプレット]] (applet)
*Java[[クラス (コンピュータ)|クラス]][[ライブラリ]]群(標準クラスライブラリ)
:サーバからダウンロードされてWEBブラウザ上で実行されるJavaプログラム。[[サンドボックス (セキュリティ)|サンドボックス]]機能下で厳しい動作制約が加えられている。{{独自研究範囲|当初はJavaの目玉技術であったが、様々な理由からさほど普及しなかった|date=2020年12月10日 (木) 13:45 (UTC)}}。
*:実行環境に含まれるJavaクラスライブラリ群の実体は、JRE(Java実行環境)を実装した人々がJava標準クラスライブラリの[[ソースコード]]から[[コンパイラ|コンパイル]]した[[バイトコード]]である。このライブラリ群はJavaアプリケーションを実行するために必要であり、またJavaアプリケーション開発者も標準クラスライブラリを使って開発する。この標準クラスライブラリには、以下のライブラリが含まれる。
:Java Cardプラットフォームの分野である[[スマートカード]](ICカード)上で動くJavaプログラムもアプレットと呼ばれており、現在ではこちらに舞台を移している。
**コアライブラリ
;[[Java Servlet|Javaサーブレット]] (servlet)
***[[コレクション]]のライブラリ
:サーバマシンで実行されるJavaプログラム。その名の通り手軽にサーバプログラムを実装出来るが、大規模サーバの構築にも適している。サーブレットはクライアントからのリクエストを逐次トランザクションして順次レスポンスする。WEBクライアントにはHTMLなどのプロトコルページ及び各種メディアをレスポンスしてWEBブラウザ上で表示させる。[[Perl]]などによる[[Common Gateway Interface|CGI]]に比べ、サーバ側の負荷が低いなどのメリットがある。
***:[[線形リスト|リスト]]や[[連想配列]]<!--ディクショナリ-->([[ハッシュテーブル]])、[[木構造 (データ構造)|木構造]](ツリー)、[[集合]](セット)などの[[データ構造]]および[[アルゴリズム]]を実装している。
;[[JavaServer Pages|Javaサーバページ]] (server page)
***[[リフレクション]] : Javaでは実行時にも[[クラス (コンピュータ)|クラス]]や[[メソッド (計算機科学)|メソッド]]の情報をもっており、クラス名やメソッド名を動的に指定して呼び出すことができる。
:サーブレットをWEBサーバ用に特化したものであり、[[Extensible HyperText Markup Language|XHTML]] ([[HyperText Markup Language|HTML]]) 内に記述するJavaプログラムである。WEBクライアントからのリクエストに伴うパラメータに従い、それをサーバ側で解釈してWEBページ内容を動的に生成、変化させてレスポンスする。コードは似ているが、[[JavaScript]]の様にブラウザ側で実行するスクリプトではない。類似の技術に[[Active Server Pages]]、[[PHP (プログラミング言語)|PHP]]がある。
***[[Extensible Markup Language|XML]]文書を扱うライブラリ
***[[コンピュータセキュリティ|セキュリティ]]機能
***[[国際化と地域化]]のライブラリ
***[[シリアライズ]](serialization、オブジェクト直列化): [[オブジェクト (プログラミング)|オブジェクト]]の[[参照 (情報工学)|参照]]をたどって関連するオブジェクトをまとめてバイトストリームにすることができる。そのストリームを[[ファイル (コンピュータ)|ファイル]]に書き込めば、オブジェクトの状態をそのまま保存([[永続性 (計算機科学)|永続化]])できる。
**統合ライブラリ(外部システムとの連携機能)
***[[JDBC]]: [[データベース]]接続のAPI
***[[Java Naming and Directory Interface|JNDI]] (Java Naming and Directory Interface) : ネーミングサービス・[[ディレクトリ・サービス|ディレクトリサービス]]へのアクセス
***[[Java Remote Method Invocation|Java RMI]](Remote Method Invocation、遠隔メソッド呼び出し)と [[Common Object Request Broker Architecture|CORBA]] : 分散オブジェクト環境([[分散処理]]環境)
****分散システムなどで、別のJava仮想マシンにあるオブジェクトがお互いのメソッドを呼ぶことができる。[[ソケット (BSD)|ソケット]]等を直接利用する通信の低水準な実装をせずに、簡単に高水準な実装をすることができる。
**[[グラフィカルユーザインタフェース]] (GUI) のライブラリ
***[[Abstract Window Toolkit|AWT]](Abstract Window Toolkit、抽象[[ウィジェット・ツールキット|ウィンドウツールキット]])
***:重量コンポーネント(ネイティブコンポーネント)のライブラリ。重量コンポーネントを配置しイベント制御を行うことができる。
***[[Swing]]
***:軽量コンポーネントのライブラリ。AWT を使って開発されたが、ネイティブではない[[ウィジェット・ツールキット|ウィジェット]](GUIの部品要素)の実装を提供する。
***Java 2D : 2次元グラフィクスや画像([[JPEG]]など)を扱うライブラリ。
***Java Sound など音声を扱うAPI群(録音、再生、その他の処理)
**[[Javaアプレット]]
*[[jar]] (Java Archive) : Javaプログラムの標準圧縮ファイルの圧縮・展開機能。拡張子の関連付けをすれば、jarファイルをダブルクリックすることで実行できる。実際は [[ZIP (ファイルフォーマット)|ZIP]] で圧縮している。
*[[Java Native Interface|JNI]] (Java Native Interface) : JavaからCなど他の言語で実装されたネイティブなプログラムやライブラリを呼び出すことができる。
*[[Java仮想マシン]] (Java VM)
*:[[仮想機械|仮想マシン]]の一種であり、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存して実装された、JavaライブラリとJavaアプリケーションの[[バイトコード]]を実行する[[ソフトウェア]]
*[[プラグイン]]
*:[[ウェブブラウザ]]で[[Javaアプレット]]を実行するために必要なソフトウェア
*[[Java Web Start]]
*:Javaアプリケーションを[[World Wide Web|ウェブ]]を介して効率的にエンドユーザに配布する機構
*ライセンス文書および各種の文書


=== Java開発キット ===
=== Java開発キット (JDK) ===
{{main|Java Development Kit}}
{{main|Java Development Kit}}
Java開発キット (JDK; Java Development Kit) は、[[オラクル (企業)|オラクル]] / [[Java Community Process|JCP]] をはじめ複数の団体や企業により開発・提供されている、Javaプログラムの開発を支援する基本的なソフトウェアである。Javaが世に出て以来、広く使われてきたJavaの開発ツールである。[[javac]]、[[javadoc]]、[[デバッガ]]などを含む多くの開発ツールが含まれている。また、完全な[[Java Runtime Environment|Java実行環境]] (JRE) を同梱している。


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


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


;Java API
=== JREとJDKの複数の実装 ===
広く使われている[[プラットフォーム (コンピューティング)|プラットフォーム]]などに対しては、複数の団体や企業が独自にJREやJDKの[[実装]]を開発・提供している。独自の[[最適化 (情報工学)|最適化]]技術を適用したり、特定の用途に特化した最適化、あるいは異なるライセンスを採用するなど、それぞれ特徴がある。
*[[Linux]] / [[IA-32]]プラットフォーム : [[オラクル (企業)|オラクル]]、Blackdown、[[IBM]]、Kaffe.org、GNUプロジェクトなどがJREやJDKを実装・提供している。
*[[Microsoft Windows|Windows]]/IA-32プラットフォーム : オラクル、IBMなどがJREやJDKを実装・提供している。


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


# java.lang - Java言語の基礎を扱う。
サン / JCPはJava発表時からJava仮想マシンおよび標準ライブラリの仕様を公開しており、Java標準クラスライブラリの[[ソースコード]]もJDKの一部として提供していた。しかしソースコードの改変は下記のOpenJDKリリースまでライセンスで認めていなかった。そのため、サンの実装とは別に、オープンソースもしくはフリーソフトウェアでかつサンの実装と互換性のあるJava標準クラスライブラリとJava仮想マシンが開発された。また、2006年にサンはライセンスの方針を変更し近い将来オープンソースにする意向を表明し、[[2007年]]5月8日にJava SE 6をOpenJDKとして [[GNU General Public License]] にてリリースした<ref>{{Cite web
# java.io - ファイル入出力など。
|title = Sun Fulfills Promise of Open and Free Java Technology and Releases Java SE Platform to OpenJDK Community
# java.util - 動的配列と動的連想配列。データ集合の操作。
|url = http://www.sun.com/aboutsun/pr/2007-05/sunflash.20070508.3.xml
# java.math - 各種計算を扱う。
|author = Sun Microsystems, Inc
# java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
|date = 2007-5-8
# java.net - ソケット通信を扱う。
|accessdate = 2009年9月16日
# java.awt - グラフィカル・ユーザーインターフェイスを扱う。
}}</ref>。
# java.applet - アプレット生成用。
# java.beans - ソフトウェアコンポーネント作成用。
# java.sql - SQLを扱う。
# java.rmi - 分散オブジェクトを扱う。
# java.security - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。


;統合開発環境と開発支援ツール
{{main|Java#オープンソース/フリーソフトウェア}}


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


*'''[[NetBeans]]''' - ([[サン・マイクロシステムズ]]→[[オラクル (企業)|オラクル]])オープンソースIDE。[https://ja.netbeans.org NetBeans.org] [http://www.netbeans.jp/ NetBeans.jp]。
===== GNUプロジェクトによる実装 =====
*[[Eclipse (統合開発環境)|'''Eclipse SDK''']] - ([[IBM]]→[[Eclipse財団]])オープンソースIDE。Java用IDEの共通基盤存在である。ここからWebSphere Studio、JBuilderなど様々なIDEが派生している。[http://www.eclipse.org/ eclipse.org] [http://eclipsewiki.net/eclipse/ EclipseWiki]。
[[GNUプロジェクト]]が[[GNU Interpreter for Java]]および[[GNUコンパイラコレクション]] (GCC) のJava版である[[GNU Compiler for Java]]を出している。GNU Compiler for Javaはahead-of-timeコンパイラを搭載しており、Javaのソースコードやバイトコードをネイティブマシンコード([[Microsoft Windows|Windows]]の場合はexeファイル)に変換できる。クラスライブラリは[[GNU Classpath]]を使っており、1.4のほとんどの部分が対応しており、5.0の部分も実装が進んでいる。
*'''WebSphere Studio''' -([[IBM]])商用IDE。Eclipseに有料プラグイン機能を組み合わせたもの<ref>{{Cite web|和書|url=https://xtech.nikkei.com/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]。
*{{仮リンク|IBM Rational|en|Rational Application Developer|label='''IBM Rational'''}} - (IBM) [[Rational]]ブランド商用IDE。WebSphere Studioの後継製品。
*'''[[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システムズ]]→オラクル){{仮リンク|Oracle WebLogic Server|en|Oracle WebLogic Server|label=WebLogic}}と統合されている。[http://www.oracle.com/technetwork/jp/developer-tools/workshop/ Oracle Workshop]。
*'''[[BlueJ]]''' - ([[サン・マイクロシステムズ]]、豪[[ディーキン大学]]、英[[ケント大学]]の共同開発)フリーIDE。[http://www.bluej.org/ BlueJ]。
*'''[[IntelliJ IDEA]]''' - (JetBrains) 商用IDE。[[Android Studio]]のベースになった。[http://www.jetbrains.com/idea/ IntelliJ IDEA]。
*'''JCreator''' - (Xinox Software) 商用IDE。[http://www.jcreator.com/ JCreator]。
*'''[[Xcode]]''' - ([[Apple]])[[macOS]]に付属するIDE。


開発サポートツールは、プロジェクト管理、自動ビルド、デバッグ、モニタリングを容易にする。下記の他にも多くの支援ツールが存在する。
Windows環境では、GCJは[[MinGW]] (Minimalist GNU for Windows) もしくは[[Cygwin]]を使って実行できる。Cygwinの場合は、対象がライセンスが[[GNU General Public License|GPL]]のソフトウェアに限られるが、MinGWの場合は商用含め、すべてのソフトウェアで利用できる。


*'''[[Apache Ant]]''' - Javaアプリケーションのビルドツール。[[Apacheソフトウェア財団]]のプロジェクトによって開発された。コンパイル、[[バージョン管理システム]]との連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。[[make (UNIX)|make]] と同種のツールであり、[[Extensible Markup Language|XML]]ファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
==== Excelsior JET ====
*'''[[Apache Maven]]''' - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
米Excelsior社がExcelsior JETというahead-of-timeコンパイラを販売している[http://www.excelsior-usa.com/jet.html]。Java SE 用に書かれたプログラムを [[Microsoft Windows|Windows]]のネイティブマシンコードであるexeファイル(実行ファイル)に変換できる。起動の高速化やアプリケーションの[[難読化コード|難読化]]を実現する。
*'''[[Gradle]]''' - [[Apache Ant]]や[[Apache Maven]]のコンセプトに基づくオープンソースビルド自動化システム。
*'''[[JUnit]]''' - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。[[xUnit]]の一種である。[[テスト駆動開発]]を支援する。


==== Windows exeパッケー ====
=== Javaテクノロの数々 ===
{{Main|Java Community Process}}<!--================================================================================
[[Microsoft Windows|Windows]]にて、配布、実行しやすくするために、Javaの[[jar]]ファイルを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]
Java Web Startには、適切なバージョンのJREをインストールする機能があるが、そもそも、JREがインストールされていない場合は、それが不可能である。JSmoothなどでは、ラッピングされたexeが、必要なJREがインストールされていないことを検出した時は、JREをダウンロードして、インストールする機能を持つ。また、上記3つすべてにおいて、JREを同梱して、同梱したJREを使ってアプリケーションを実行する機能を持つ。

また、通常のJavaアプリケーションでは、Windowsのタスクマネージャには、java.exeやjavaw.exeと表示され、Javaのアイコンが表示されるが、自前のexeファイル名と自前のアイコンを表示する機能を持つ。

さらに、上記のいくつかは、アプリケーションの2重起動を防止したり、アプリケーションをWindowsサービス(NTサービス)化する機能を持つ。

サンが特定のOSに特化した機能を提供することを嫌がっていたため、これらの機能が不足しており、それを補うために、exeパッケージ化が存在する。<!-- ただし、これらのツールには最新の[[JDK]]でコンパイルされた[[jar]]ファイルには対応していないなどの欠点もある上、{{いつ範囲|date=2019年2月|近年}}の [[Microsoft Windows|Windows]] にはほとんどにJavaがインストールされているため、あまり普及していない。 -->

=== Javaのエディション ===
[[オラクル (企業)|オラクル]]と[[Java Community Process|JCP]]は、さまざまな環境に対応するため、3つの[[Javaプラットフォーム]]のエディションを規定している。Javaの[[アプリケーションプログラミングインタフェース|API]]の多くは分類され各エディションに割り当てられている。

エディションごとに実行環境と開発環境がある。[[Java Runtime Environment|Java実行環境]] (JRE) は、[[Java仮想マシン]]と標準[[ライブラリ]]の[[実装]]から構成される。JDK 1.1のバージョンまでは、[[Java Platform, Standard Edition|Java SE]]に相当するエディションのみが提供されていた。3つのエディションが規定されたのは、JDK 1.1の次のバージョンからである。オラクル / JCPが規定しているエディションを次に示す。
;Java SE
:[[Java Platform, Standard Edition|Java SE]] (Java Platform, Standard Edition) は、[[ワークステーション]]、[[パーソナルコンピュータ]]や[[サーバ]]などの機器で、汎用的な用途に使われる。
;Java EE
:[[Java Platform, Enterprise Edition|Java EE]] (Java Platform, Enterprise Edition) は、Java SE に加え、多層[[クライアント・サーバ|クライアントサーバ]]の大規模システムを開発するための、さまざまな[[アプリケーションプログラミングインタフェース|API]]が追加されている。
;Java ME
:[[Java Platform, Micro Edition|Java ME]] (Java Platform, Micro Edition) は、コンピュータ資源が限られている、[[組み込みシステム]]などを用途として想定したエディションである。機器の種類に応じた、ライブラリのいくつかの異なるセット(プロファイル)を規定している。Java SEのいくつかのAPIは実装していないが、このエディションで対象とする用途には十分な機能を持っている。完全なJava SEのライブラリを使うには、このエディションで対象とする用途では記憶装置の容量が足りない。
Java [[アプリケーションプログラミングインタフェース|API]] に含まれるクラスは、[[パッケージ (Java)|パッケージ]]と呼ばれるグループに分類される。各パッケージは、相互に関連する[[インタフェース (抽象型)|インタフェース]]、[[クラス (コンピュータ)|クラス]]、[[例外処理|例外]]を含む。Java の各エディションでどのような機能が使えるかについては、それぞれのエディションの項目 ([[Java Platform, Standard Edition|Java SE]], [[Java Platform, Enterprise Edition|Java EE]], [[Java Platform, Micro Edition|Java ME]]) を参照のこと。

JavaのAPIセットは、[[オラクル (企業)|オラクル]]と他の個人や企業・団体が共同で、[[Java Community Process|JCP]] (Java Community Process) プログラムに沿って管理している。このプロセスに参加する人々が、Java APIの設計と開発に関わっている。このプロセスのあり方については、議論の対象となっている。

2004年より、[[IBM]]と[[BEAシステムズ]](後に[[オラクル (企業)|オラクル]]が買収)は、Javaの公式の[[オープンソース]][[実装]]を作る動きを、公的に支援している。2006年まで、サンはこうした動きに対しては拒否する立場をとってきたが、方針を変えて自社とJCPによるJavaの実装をオープンソースにする意向を表明し実行に移し始めている。

=== 拡張機能と関連技術 ===<!--
================================================================================
ここには、Java Community Process のもとで開発された拡張機能と関連技術のみを記述します。
ここには、Java Community Process のもとで開発された拡張機能と関連技術のみを記述します。
=================================================================================-->
=================================================================================-->
Javaテクノロジは、個人を含む各種組織から様々な形態で公開されている。開発元から提示された技術は、[[Java Community Process]] (JCP) による審査を合格した後にJavaテクノロジの一つとして認証される。これを標準化 (''standardization'') と言う。Javaテクノロジが準拠すべき規範仕様は、JCP管理下で発行される数々の[[:Category:Java specification requests|Java仕様要求]] (Java Specification Request) にて定義されている。Javaテクノロジは様々な分野に導入されている。その一例を以下に列挙する。
Javaの標準機能に対する拡張機能は、多くの場合、<code>javax.*</code>[[パッケージ (Java)|パッケージ]]に属する。こうした拡張機能は、[[Java Platform, Standard Edition|Java SE]]の Java開発キット (JDK) や Java実行環境 (JRE) には含まれない。Java の拡張機能や関連技術は、プログラミング言語Javaと密接に連携する。主なJavaの拡張機能と関連技術を示す(いくつかの拡張機能は{{いつ範囲|date=2019年2月|近年}}のJava SE標準ライブラリに統合された)。
*[[Java Platform, Enterprise Edition|Java EE]](従来のJ2EE)(Java Platform, Enterprise Edition) - 大規模で分散化された企業システムもしくは[[インターネット]]サーバ向けの Java のエディション
*[[Java Platform, Micro Edition|Java ME]](従来のJ2ME)(Java Platform, Micro Edition) - [[携帯機器]]など資源が限られている環境向けの Java のエディション
*JMF (Java Media Framework) - 音声・動画などのマルチメディア向けの[[アプリケーションプログラミングインタフェース|API]]
*[[Java Naming and Directory Interface|JNDI]] (Java Naming and Directory Interface) - ネーミングサービス・[[ディレクトリ・サービス|ディレクトリサービス]]へのアクセス
* JSML (Java Speech Markup Language) - [[音声合成]]システムにテキストの注釈を追加する
*[[JDBC]]<!--(Java Database Connectivity)--> - [[データベース]]接続の API
*[[Java Data Objects|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 - 分散した記憶装置を管理する技術
*[[Javaカード|Java Card]] - スマートカードなどの機器で安全にJavaアプリケーションの実行を実現する技術
*JavaSpaces - 分散環境でJavaオブジェクトの送受信・永続化などを支援する技術
*JML (Java Modeling Language) - [[契約による設計]] (Design by contract) に基づいた開発を支援する技術
*JMI (Java Metadata Interface) - Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
*[[Java Management Extensions|JMX]] (Java Management Extensions) - 分散環境における機器・アプリケーション・ネットワークサービスの管理 / 監視を行う技術
*[[JavaServer Pages|JSP]] (JavaServer Pages) - [[Java Platform, Enterprise Edition|Java EE]] による[[ウェブアプリケーション]]で [[Extensible HyperText Markup Language|XHTML]] などの[[ファイル (コンピュータ)|ファイル]]に Java のコードを埋め込み、動的に文書を生成する技術
*[[JavaServer Faces|JSF]] (JavaServer Faces) - Java EE によるウェブアプリケーションでユーザインタフェースの簡易な開発を支援する技術
*[[Java Native Interface|JNI]] (Java Native Interface) - Java から他の言語で実装されたネイティブなプログラムやライブラリを呼び出すための仕様
*[[JXTA]] - [[Peer to Peer]] (P2P) の仮想ネットワークのためのオープンプロトコル
*[[Java3D|Java 3D]] - 3次元グラフィクスプログラミングのための高水準な API [https://java3d.dev.java.net/ Java 3D] <!--([http://java.sun.com/products/java-media/3D/ ホーム]、[http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/ API])-->
*JOGL (Java OpenGL) - [[OpenGL]] を使う3Dグラフィクスプログラミングのための低水準な API
*[[LWJGL]] (Light Weight Java Game Library) - ゲームを開発するための低水準な API で、[[OpenGL]]、[[OpenAL]]、[[OpenCL]] および多様な[[入力機器]]の制御機能も提供する
*[[OSGi]] - サービスの動的な管理と遠隔保守<!--
*Java Media APIs [http://java.sun.com/products/java-media/](リンク切れ?) - java.media - マルチメディア向けAPI--><!--
*Shared Data ToolkitSound-->
*[http://community.java.net/javadesktop/ JavaDesktop]<!--
================================================================================
上記には、Java Community Process のもとで開発された拡張機能と関連技術のみを記述します。
=================================================================================-->


; [[Java Native Interface|JNI]] (Java Native Interface) : 他の言語で実装されたネイティブコードを呼び出す技術
== Java技術の標準化 ==
; JMI (Java Metadata Interface) : Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
:''詳細は [[Java Community Process]] (JCP) を参照''
; JML (Java Modeling Language) : [[契約による設計]] (DbC) を指向した形式言語をソースコードに導入する
現在、[[Javaプラットフォーム]]の将来のバージョンや機能は、[[Java Community Process|JCP]] (Java Community Process) の標準化プロセスのもとで開発されている。JCPのメンバになることで、Java技術の将来のバージョンや機能の定義に関与することができる。JCPには、[[IBM]]、[[ボーランド]]、[[富士通]]、[[Apacheソフトウェア財団]]、[[ヒューレット・パッカード]] など、さまざまな個人、団体、企業がメンバとして参加している。
; [[Java Management Extensions|JMX]] (Java Management Extensions) : 主に分散システムで[[依存性の注入]]によるJavaプログラムの動的な再構成技術
; JDMK (Java Dynamic Management Kit) : JMX仕様に基づいた開発支援ソフトウェア
; [[Java Data Objects|JDO]] (Java Data Objects) : [[オブジェクト (プログラミング)|オブジェクト]][[永続性|永続化]]の仕様
; Jini : 分散システムを構築するネットワークアーキテクチャ
; JavaSpaces : Jiniの分散システム環境でオブジェクトの送受信と永続化などをサポートするテクノロジ
; JAIN (Java API for Integrated Networks) : 統合通信ネットワーク用のAPI
; [[JavaServer Faces|JSF]] (Java Server Faces) : WEBクライアントにユーザーインターフェースを提供するサーバ用テクノロジ
; [[JXTA]] : [[Peer to Peer|P2P]]の仮想ネットワークのためのオープンプロトコル
; [[OSGi]] : サービスの動的な管理と遠隔保守
; [[Java3D]] : 3次元グラフィクスプログラミングのための高水準なAPI。[https://java3d.dev.java.net/ Java 3D]<!--([http://java.sun.com/products/java-media/3D/ ホーム]、[http://java.sun.com/products/java-media/3D/forDevelopers/J3D_1_3_API/j3dapi/ API])-->
; JOGL (Java OpenGL) : [[OpenGL]]を使う3Dプログラミングのための低水準なAPI
; JAI (Java Advanced Imaging) : 高水準な画像操作API
<!--; Java Media APIs [http://java.sun.com/products/java-media/](リンク切れ?) : java.media - マルチメディア向けAPI-->
; [[LWJGL]] : ゲーム開発用のAPI。[[OpenGL]], [[OpenAL]], [[OpenCL]]を扱える。様々なゲーム用コントローラーも扱える。
; JSML (Java Speech Markup Language) : [[音声合成]]システムにテキスト注釈を追加する
<!--; Shared Data ToolkitSound-->
; [[BD-J|Blu-ray Disc Java]] : ブルーレイディスク (BD) で実行される各種コンテンツ制作用


=== Javaオープンソースモデル ===
JCPは、Javaプラットフォームに追加する仕様や技術を、JSRs (Java Specification Requests) という文書群に記述する。
[[サン・マイクロシステムズ]]は1996年のリリース当初からJava実行環境とJava開発環境をオープンソース化しており、サードパーティーにJavaテクノロジ開発への参入をアピールしていた。ただしJavaの普及に一定のコントロールをかける為にソースコードの改変までは認めていなかった。2004年になると[[IBM]]が業界の優位性を活かしてJavaオープンソースプロジェクトの主導権を握るようになった。[[Java Community Process|Javaコミュニティプロセス]]を取り巻く業界の変化を悟ったサン・マイクロシステムズはIBMとの本格的な提携を承認し、2007年に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プロジェクト]]は「[[GNU Interpreter for Java]]」、[[GNUコンパイラコレクション]]の「[[GNU Compiler for Java]]」、互換クラスライブラリの「[[GNU Classpath]]」を公開した。Windows用GNU Compilerは、[[MinGW]]と併せて[[Cygwin]]の環境上でも実行できた。


WindowsやLinuxなどのメジャーOSでは、オラクル、IBM、Blackdown、GNUプロジェクト、Kaffe.orgなどによるJavaプラットフォームが公開されている。また、JavaソースコードをそのままWin用実行ファイルに変換する「Excelsior JET」や<ref>http://www.excelsior-usa.com/jet.html</ref>、JarファイルをWin用実行ファイルに変換する「[http://exewrap.osdn.jp/ exewrap]」「[http://launch4j.sourceforge.net/ Launch4j]」「[http://nsis.sourceforge.net/Java_Launcher_with_automatic_JRE_installation NSIS]」「[http://jsmooth.sourceforge.net/ JSmooth]」なども販売ないし公開されている。<!-- ただし、これらのツールには最新の[[JDK]]でコンパイルされた[[jar]]ファイルには対応していないなどの欠点もある上、{{いつ範囲|date=2019年2月|近年}}の [[Microsoft Windows|Windows]] にはほとんどにJavaがインストールされているため、あまり普及していない。 -->
プログラミング言語JavaとJavaコアAPIに関わるいくつかの 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=41 JSR 41] ''A Simple [[表明|Assertion]] Facility'' (J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=47 JSR 47] ''[[ロギング|Logging]] API Specification''(J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=51 JSR 51] ''New I/O APIs for the Java Platform'' (J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=59 JSR 59] ''J2SE Merlin Release Contents'' (J2SE 1.4)
*[http://www.jcp.org/en/jsr/detail?id=121 JSR 121] ''Application Isolation API''
*[http://www.jcp.org/en/jsr/detail?id=133 JSR 133] ''Java Memory Model and Thread Specification Revision'' (J2SE 5.0)
*[http://www.jcp.org/en/jsr/detail?id=166 JSR 166] ''Concurrency Utilities'' (J2SE 5.0)
*[http://www.jcp.org/en/jsr/detail?id=175 JSR 175] ''A Metadata Facility for the Java Programming Language'' (J2SE 5.0)
*[http://www.jcp.org/en/jsr/detail?id=176 JSR 176] ''J2SE 5.0 (Tiger) Release Contents'' (J2SE 5.0)
*[http://www.jcp.org/en/jsr/detail?id=201 JSR 201] ''Extending the Java Programming Language with [[列挙型|Enumerations]], [[オートボクシング|Autoboxing]], [[foreach文|Enhanced for loops]] and Static Import'' (J2SE 5.0)
*[http://www.jcp.org/en/jsr/detail?id=203 JSR 203] ''More New I/O APIs for the Java Platform ("NIO.2") '' (Java SE 7)
*[http://www.jcp.org/en/jsr/detail?id=204 JSR 204] ''Unicode Supplementary Character Support'' (J2SE 5.0) - [[Unicode]] 3.1 のサポート
*[http://www.jcp.org/en/jsr/detail?id=244 JSR 244] ''Java EE 5 Specification'' (Java EE 5)
*[http://www.jcp.org/en/jsr/detail?id=270 JSR 270] ''Java SE 6 ("Mustang") Release Contents'' (Java SE 6)
*[http://www.jcp.org/en/jsr/detail?id=275 JSR 275] ''Physical Units/Quantities Support (Java SE) - JScienceをもとにした[[リファレンス実装]]
*[http://www.jcp.org/en/jsr/detail?id=901 JSR 901] ''Java Language Specification'' (J2SE 5.0)

== 開発ツール ==
Javaアプリケーションを開発するための開発ツール(開発用[[ソフトウェア]])をいくつか示す。次に示すツール以外にも、数多くのツールが開発・提供されている。
*[[Java Development Kit|Java開発キット]] (Java Development Kit, JDK) - Javaアプリケーションの基本的な開発環境。
*[[統合開発環境]] (IDE) - アプリケーションを開発できる多機能な開発環境。後述する。
*[[Apache Ant]] - Javaアプリケーションのビルドツール。[[Apacheソフトウェア財団]]のプロジェクトによって開発された。[[コンパイル]]、[[バージョン管理システム]]との連携、[[jar]]、[[javadoc]]生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。[[make]] と同種のツールであり、[[Extensible Markup Language|XML]]ファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
*[[Apache Maven]] - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
*[[JUnit]] - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。[[xUnit]]の一種である。[[テスト駆動開発]]を支援する。

=== 統合開発環境 ===
Javaプログラムを開発できるいくつかの[[統合開発環境]] (IDE) を示す。
*[[NetBeans]] - [[オラクル (企業)|オラクル]]([[サン・マイクロシステムズ]])を中心に開発されている[[オープンソース]]のIDE。Windows版、Linux版。Solaris版、Mac OS版。
**[https://ja.netbeans.org NetBeans.org] [http://www.netbeans.jp/ NetBeans.jp]
*WebSphere Studio - [[IBM]]。Eclipse SDK の上位版ともいえるもの。[[WebSphere]] [[WebSphere Application Server|Application Server]] と統合されている。Windows版、Linux版。Solaris版、Mac OS版。
**[http://www.ibm.com/jp/software/websphere/ft/studio/index.html WebSphere開発ツール]
*[[Eclipse (統合開発環境)|Eclipse SDK]] - [[Eclipse財団]]。以前はIBMが管理していた。Web Sphere Studioのオープンソース版ともいえる。Windows版、Linux版、Solaris版、Mac OS版。
**[http://www.eclipse.org/ eclipse.org(英語)] [http://eclipsewiki.net/eclipse/ EclipseWiki(日本語)]
*[[JBuilder]] - [[エンバカデロ・テクノロジーズ]]。Windows版、Linux版。Solaris版、Mac OS版。
**[http://www.embarcadero.com/jp/products/jbuilder JBuilder]
*[[JDeveloper|Oracle JDeveloper]] - [[オラクル (企業)|オラクル]]。Oracle Application Serverと統合されている。Windows版、Linux版。Solaris版。2005年6月28日に無料化した。
**[http://www.oracle.com/technetwork/jp/developer-tools/jdev/overview/ JDeveloper]
*Oracle Workshop for WebLogic - [[オラクル (企業)|オラクル]]([[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]
*[[IntelliJ IDEA]] - JetBrainsが開発販売している商用の統合開発環境。
**[http://www.jetbrains.com/idea/ IntelliJ IDEA]
*JCreator - Xinox Softwareが開発販売している商用の統合開発環境。
**[http://www.jcreator.com/ JCreator]
*[[Xcode]] - [[アップル (企業)|アップル]]。[[macOS]]に付属する統合開発環境。

== 批判 ==
{{main|Javaに対する批判}}

Javaに対しては、優れた技術だと評価する人々がいる一方で、批判も少なくない。Javaは、[[ソフトウェア]]に関する複雑さを管理する問題に対して、革新的な方法を提供するという目標の下で、開発された。多くの人々は、Java技術は、この期待に対して満足できる答えを提供したと評価している。しかしJavaにも欠点が無いわけではない。Javaは、どのようなプログラミング作法にも適応しているわけではない。また、どのような環境や要件にも普遍的に適応しているわけではない。

Javaに対する批判を大まかに記述する。

=== 実行性能 ===
{{main|Javaの性能}}
Javaの初期のバージョンでは、[[C言語|C]]や[[C++]]などの[[ネイティブ]]に[[コンパイラ|コンパイル]]する言語と比べて、とても実行が遅く[[主記憶装置|メモリ]]の消費が激しいとして、批判されることが多かったが、{{いつ範囲|date=2017年10月|近年}}のバージョンでは改善されてきている。{{いつ範囲|date=2019年2月|近年}}の[[Java仮想マシン]]で採用している[[ジャストインタイムコンパイル方式|ジャストインタイムコンパイラ]]や動的再コンパイルの実行性能は、従来の言語のネイティブコンパイラとほぼ同じ水準の実行性能かそれ以上を達成することがある。これは頻繁にメモリアクセスを行う[[プログラム (コンピュータ)|プログラム]]においてJavaの[[ガベージコレクション]]の技術が、[[C言語|C]]の[[malloc]]や[[free]]よりも高い性能を発揮できることによる。こうした事情から、Javaの実行性能については、議論の対象となっている。

=== ルックアンドフィール ===
[[Look and feel|ルックアンドフィール]]に関して、Javaの[[Swing]]の[[ウィジェット・ツールキット|ツールキット]]を使った[[グラフィカルユーザインタフェース]] (GUI) を備えたアプリケーションの既定のルックアンドフィールが、従来のネイティブなアプリケーションとは大きく異なるため、エンドユーザの人々にとってJavaのGUIアプリケーションはなじみにくいと批判されることがある。Javaではプラグイン可能なルックアンドフィールの機構を備えており、サンは [[Microsoft Windows|Windows]]、[[macOS]]および[[Motif (GUI)|Motif]]の各ルックアンドフィールのクローンを提供した。そのため、Swingの既定のルックアンドフィールではなく、プラットフォームネイティブと同様のルックアンドフィールでJavaのアプリケーションを動かすよう指定することができる。しかしエンドユーザにとってこの指定方法は簡単ではないと指摘されることがある。

=== 言語設計 ===
言語の設計(デザイン)に対する批判をいくつかの側面から述べる。

Javaの設計者は、他の[[プログラミング言語]]では備えているいくつかの機能をJavaから排除した。利便性より言語設計の簡潔さを優先した結果だが、こうした設計上の判断については賛否が分かれている。
*[[多重継承]]
*[[演算子]]の[[多重定義|オーバーロード]]
*[[プロパティ]]
*タプル (tuple)

また、Javaは、[[Smalltalk]]のように「純粋な」[[オブジェクト指向プログラミング言語]]ではないとして、設計の一貫性のなさを批判されることがある。たとえばJavaには、プリミティブ型という、クラス型(参照型)ではないものがある。Javaの設計者は、実行性能上の理由から、意図的にプリミティブ型をJavaに導入した。例えば、<code>int</code>型などの組み込み型がプリミティブ型に相当する。<code>int</code>型の値はオブジェクトではなく、これをクラス型のオブジェクトとして扱うには、ラッパーである<code>Integer</code>クラス型への変換(ボクシング)が必要になる。J2SE 5.0以降では[[オートボクシング]]により、プリミティブ型と、それに対応するボックスクラス型の間のやりとり(変数への代入や値の参照など)は、コンパイラによって自動的に行われるようになり、[[ソースコード]]上の煩雑さは軽減されたが、本質的に同じものを指すはずのデータ型が複数存在するという矛盾や、組み込み配列型以外のコレクションにプリミティブ型を格納する際の空間的オーバーヘッドの問題を依然として抱えたままである。

一方で、C++のように名前空間レベルのメソッドやフィールド(クラスに属さないフリー関数や[[グローバル変数]])を定義できず、必ずクラス定義が必要であることから、クラスを定義する側も利用する側も記述量が肥大化しがちである。J2SE 5.0 では、メソッドとフィールドのstaticインポートを行えるようになり、クラス修飾なしでstaticメンバーを利用できるようになった。しかしstaticインポートを不用意に使うとソースコードを判読困難にする可能性がある。サン / JCPはstaticインポートを適切に使用するガイドラインを合わせて公開した<ref>[https://docs.oracle.com/javase/jp/1.5.0/guide/language/static-import.html static のインポート]</ref>。

なお、[[C Sharp|C#]]は[[Delphi]]の設計思想を取り入れた言語であり、登場当初からプロパティをサポートしている。演算子オーバーロードについても、C++より限定的ではあるがサポートされる。そのほか、Javaで問題視されていたプリミティブ型の扱いやジェネリクスなどに対して、C#は独自の解決策を提示している。

{{see also|C SharpとJavaの比較}}

=== クラスパス ===
一般に、Javaプログラムを実行する際、-classpathオプションを使用するか、[[環境変数]]の[[クラスパス]] (CLASSPATH) を必要に応じて適切に設定する必要がある。クラスパスを指定すると、既定のカレントディレクトリという設定が上書きされる。したがって、クラスパスを変更するソフトをインストールするなど設定を変えられた場合は、Java実行環境は正しくJavaプログラムを実行することができなくなることがある。このため Javaを使い始めた人々は、クラスパスについて戸惑うことがある。サンは-classpathオプションを指定する方法を推奨していた。{{要出典|date=2018-08}}

=== 移植性・互換性 ===
Javaは高い[[移植性]]と[[互換性]]を実現するべく開発されており、ある程度の水準まで達成しているが、課題が残っている。Javaのバージョン間の[[下位互換]]性・[[上位互換]]性が完全ではないことが問題として議論の対象になっている。Javaは高い移植性を保つため、一部のプラットフォームにしかない独自の機能はJavaからは使えない。[[Java Native Interface]] (JNI) を経由することで、C/C++言語などを利用して特定のプラットフォーム固有あるいはプロセッサ独自の機能にアクセスすることはできるが、その場合はJavaによる移植性や互換性の恩恵は得られなくなる。
<!--

=== 移植性・互換性に対する批判 ===
「[[Write once, run anywhere]]」(WORA、一度書けばどこでも動く)という言葉があるとおり、Javaの目標の一つに[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存が挙げられる。[[Javaコンパイラ]]は[[Java仮想マシン]]用の中間言語([[バイトコード]])を生成する。[[コンパイル]]されたJavaのプログラムは、Java仮想マシンを実行環境として動作する。この仮想マシンがハードウェア間の差異を吸収することで、プラットフォーム非依存を実現している。ただし、現時点では一部に[[プラットフォーム (コンピューティング)|プラットフォーム]]依存の部分があり、完全な[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存ではない。

また、マルチプラットフォームにするということは、一部のプラットフォームにしかない独自の機能はJavaから使えないことを意味する。たとえば [[Microsoft Windows|Windows]]用グラフィックス [[アプリケーションプログラミングインタフェース|API]]、[[Microsoft DirectX|DirectX]]はJavaから直接呼び出すことはできない。そのため、橋渡しをするための拡張[[アプリケーションプログラミングインタフェース|API]]が提供されている。

またJavaではバージョン間の[[下位互換]]性・[[上位互換]]性の問題が議論の対象になっている。Javaではバージョン間の互換性をある程度の水準まで達成している。しかし、バージョンの異なる実行環境の取り扱いには課題が残っている。たとえば J2SE 1.4実行環境用に書かれたプログラムは、実行環境にJ2SE 1.3を想定すると明示的に指定してコンパイルしなければJ2SE 1.3実行環境では動かず、利用する[[ライブラリ]]がJ2SE 1.4以降から追加されたものである場合にはJ2SE 1.3実行環境での実行を諦めなければならない。J2SE 1.3からの上位互換性は、J2SE 5.0まで保証されている。J2SE 1.3以降のJavaプログラムでは下位互換性は保証されないが、Java実行環境 (JRE) の自動アップデート機能によって仮想マシンを最新バージョンにアップデートすれば解決できる。--><!--ただし1.1, 1.2時代のJavaプログラムの場合、下位互換性だけでなく、上位互換性問題に引っかかる可能性がある。--><!--
JDK 1.1、J2SE 1.2時代のJavaプログラムは、現在となっては古いため、上位互換性問題に引っかかる可能性がある。

その場合は、そのJavaプログラムを作った者に最新版のJavaコンパイラでもコンパイルが通るように直してもらうしかない。この問題も、[[オラクル (企業)|]]のJavaコーディング規約をJava[[プログラマ]]が守っていればほぼ起きることがなく、Javaソースコード上のimport宣言や新しく加わった[[予約語 (Java)|Javaキーワード]] (enum や assert) と被るものが無ければほぼ心配することもなくなる。とくに、多くの場合において、これらの問題はコーディング規約だけでなく、[[統合開発環境|IDE]]や[[CheckStyle]]、[[FindBugs]]など各種ツールなどによって解決できるケースがある。Javaプログラマは、日頃から [[CheckStyle]] や [[FindBugs]] を使って[[プログラミング]]していれば、上位互換性にぶち当たる可能性は大幅に下がる。

===その他===
*'''2億9千万年問題''': 西暦[[2000年]]近辺で[[2000年問題]]が話題になった当時には「Javaには2000年問題は存在しない」と言われていたが、2億9千万年問題と言われるものが存在する。西暦[[292,471,208年]]には時刻が桁溢れを起こし西暦[[1970年]]に戻ってしまうという問題だが、遠い未来の話であるため、それほど批判の対象にまでは至っていない。仮に3億年後の未来を扱った計算を行う場合があったとして、別の対応策があるため気にするほどのことではない。
-->


== Java認定資格 ==
== Java認定資格 ==
[[File:Java Certification Path.gif|thumb|認定パス]]
[[サン・マイクロシステムズ]]は複数のJava認定資格を主催していた。[[オラクル (企業)|オラクル]]による買収後、一部資格は変更されている。ただし、買収前に以下の資格を取得した者は買収後も有効資格である。
オラクル{{efn|買収前は[[サン・マイクロシステムズ]]によって。}}は複数のJava認定資格を主催している。Javaのバージョンアップに伴って資格も変更されることがある。ただし、変更前に取得した資格は変更後も有効である。<!--
*Sun認定 Java アソシエイツ (SJC-A)
*Sun認定 Java プログラマ (SJC-P)
*Sun認定 Java ディベロッパ (SJC-D)
*Sun認定 Web コンポーネントディベロッパ (SJC-WC)
*Sun認定ビジネスコンポーネントディベロッパ (SJC-BC)
*Sun認定 Java Web サービスディベロッパ (SJC-WS)
*Sun認定モバイルアプリケーションディベロッパ (SJC-MA)
*Sun認定エンタープライズアーキテクト (SJC-EA)
現行はオラクルが以下のJava認定資格を主催している<ref>{{Cite web
|url = http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=433&p_org_id=70&lang=JA
|title = ミドルウェア/Java 認定資格
|publisher = 日本オラクル
|accessdate = 2011-09-19
}}</ref>。これらのうちOracle認定Java EE 6 Enterprise JavaBeansディベロッパ以外の試験はサン・マイクロシステムズが主催していた試験の、それぞれ略号の "OCJ" を "SJC" に変更したものに対応する位置付けにある<ref>{{Cite web
|url = http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=433&p_org_id=70&lang=JA
|title = Sun認定資格に関する重要なお知らせ
|publisher = 日本オラクル
|accessdate = 2011-09-19
}}</ref>。
*Oracle認定Javaアソシエイツ (OCJ-A)
*Oracle認定Javaプログラマ (OCJ-P)
*Oracle認定Javaディベロッパ (OCJ-D)
*Oracle認定Webコンポーネントディベロッパ (OCJ-WC)
*Oracle認定ビジネスコンポーネントディベロッパEE 5 (OCJ-BC)
*Oracle認定Java WebサービスディベロッパEE 5 (OCJ-WS)
*Oracle認定モバイルアプリケーションディベロッパ (OCJ-MA)
*Oracle認定エンタープライズアーキテクト (OCJ-EA)
*Oracle認定Java EE 6 Enterprise JavaBeansディベロッパ<!--
認定資格は年3回の受験制限がある。ただし何らかの理由で4回以上受験の際には、アメリカのサン・マイクロシステムズ本社に連絡する必要がある。
認定資格は年3回の受験制限がある。ただし何らかの理由で4回以上受験の際には、アメリカのサン・マイクロシステムズ本社に連絡する必要がある。
→日本オラクルのサイトに上記制限が見つからないのでコメントアウト。でもどこかで見たような気がするんだよなぁ。
→日本オラクルのサイトに上記制限が見つからないのでコメントアウト。でもどこかで見たような気がするんだよなぁ。
代わりに現行のオラクルの再受験ポリシーを記述する。-->
代わりに現行のオラクルの再受験ポリシーを記述する。-->認定試験に不合格だった場合、その試験日を含めて14日以内は同一試験を受験することができない。
{| class="sortable wikitable" style="font-size:small"
認定試験に不合格だった場合、その試験日を含めて14日以内は同一試験を受験することができない。
|+ 現在受験可能な資格<ref>{{Cite web|和書|url=https://education.oracle.com/ja/oracle-certification-path/product_267 |title=オラクル Java SE 認定資格パス 概要 |accessdate=2019-03-07}}</ref><ref>{{Cite web|和書|url=https://education.oracle.com/ja/oracle-certification-path/product_264 |title=オラクル Java EE and Web Services 認定資格パス 概要 |accessdate=2019-03-07}}</ref><ref>{{Cite web|url=https://education.oracle.com/products/trackp_372 |title=Java Foundations Certified Junior Associate (novice-level certification) |accessdate=2019-03-10}}</ref><ref>{{Cite web|和書|url=http://www.oracle.com/jp/education/certification/examlist-172597-ja.html#2 |title=認定試験一覧 |accessdate=2019-03-07}}</ref>
! 資格名 !! レベル !! 対象バージョン
|-
| Java Foundations Certified Junior Associate || data-sort-value="0" | Junior Associate || {{Unknown}}
|-
| Oracle Certified Java Programmer, Bronze SE 7/8{{efn|日本でのみ行われている<ref>{{Cite web|和書|url=https://www.atmarkit.co.jp/ait/articles/1209/27/news141.html |title=Java資格が大幅リニューアル。Bronze/Silver/Goldが登場 |accessdate=2019-03-07}}</ref>。}} || data-sort-value="0" | Bronze || Java SE 7/8
|-
| Oracle Certified Java Programmer, Silver SE 8{{efn|日本以外での Oracle Certified Associate, Java SE 8 Programmer に対応。}} || data-sort-value="1" | Associate || Java SE 8
|-
| Oracle Certified Java Programmer, Gold SE 8{{efn|日本以外での Oracle Certified Professional, Java SE 8 Programmer に対応。}} || data-sort-value="2" | Professional || Java SE 8
|-
| Oracle Certified Professional, Java EE 7 Application Developer || data-sort-value="2" | Professional || Java EE 7
|-
| Oracle Certified Master, Java EE 6 Enterprise Architect || data-sort-value="3" | Master || Java EE 6
|-
| Oracle Certified Expert, Java EE 6 Enterprise JavaBeans Developer || data-sort-value="4" | Expert || Java EE 6
|-
| Oracle Certified Expert, Java EE 6 JavaServer Faces Developer || data-sort-value="4" | Expert || Java EE 6
|-
| Oracle Certified Expert, Java EE 6 Web Services Developer || data-sort-value="4" | Expert || Java EE 6
|-
| Oracle Certified Expert, Java EE 6 Java Persistence API Developer || data-sort-value="4" | Expert || Java EE 6
|-
| Oracle Certified Expert, Java EE 6 Web Component Developer || data-sort-value="4" | Expert || Java EE 6
|}

== 注釈 ==
{{Reflist|group=注釈}}


== 脚注 ==
== 出典 ==
{{reflist|2}}
{{Reflist|2}}


== 参考文献 ==
== 参考文献 ==
945行目: 380行目:
{{Commonscat|Java (programming language)}}
{{Commonscat|Java (programming language)}}
*[[Javaの文法]]
*[[Javaの文法]]
*[[キーワード (Java)|Javaのキーワード (予約語)]]
*[[Javaの性能]]
*[[Javaの性能]]
*[[キーワード (Java)]]
*[[Javaに対する批判]]
*[[C SharpとJavaの比較|C♯とJavaの比較]]
*[[Java Platform, Standard Edition]] (Java SE) - Java の汎用的なエディション
*[[Java仮想マシン]]
*[[Java Platform, Enterprise Edition]] (Java EE) - Java の大規模システム向けエディション
*[[Javaコンパイラ]]
*[[Java Platform, Micro Edition]] (Java ME) - Java の[[組み込みシステム]]向けエディション
*[[Javaプラットフォーム]]
*[[Java仮想マシン]] - Javaプログラムを実行する[[仮想機械|仮想マシン]]
*[[Javaコンパイラ]] - Javaプログラムを[[Javaバイトコード]]に変換する[[コンパイラ]]
*[[Java Development Kit]] - [[Javaアプリケーション]]を開発するために必要な開発キット。
*[[Java Runtime Environment]] - [[Javaアプリケーション]]を実行するために必要な環境。
*[[Java Servlet]] - [[サーバ]]側で動的に[[ウェブページ]]などを生成するJava技術
*[[Javaアプレット]] - [[ウェブブラウザ]]などで実行できるグラフィカルなJavaプログラム
*[[Java Web Start]] - [[Javaアプリケーション]]の配備と実行を簡素化する技術。Javaアプレットの代替にもなりうる。
*[[BD-J]]
*[[Java Community Process]] - Java技術の標準化プロセス
*[[Java Community Process]] - Java技術の標準化プロセス
*[[Javaチャンピオン]]
*[[JavaOne]]


== 外部リンク ==
== 外部リンク ==
=== オラクル・JCP関連 ===
'''オラクル・JCP関連'''
*[https://java.com/ja/ Java.com] {{Ref-ja}} - Javaのユーザー向け公式サイト
*[https://www.java.com/ja/ Java] {{Ja icon}} - Javaのユーザー向け公式サイト
*[https://www.oracle.com/jp/java/ Javaソフトウェア | オラクル | Oracle 日本] - オラクル
*[https://home.java.net/ Java.net] {{Ref-en}} - Javaの技術者向け公式サイト
*[https://www.jcp.org/ Java Community Process] {{Ref-en}} - JCPのサイト。JSRなどを閲覧できる
*[https://www.jcp.org/ Java Community Process] {{En icon}} - JCPのサイト。JSRなどを閲覧できる
**[https://www.oracle.com/jp/java/technologies/downloads/ Java Downloads]
*[http://www.oracle.com/technetwork/jp/java/ Oracle Technology Network - Java] {{Ref-ja}} - オラクルの技術者向けサイト
**[http://www.oracle.com/technetwork/java/javase/downloads/index.html Java SE ダウンロード]
**[https://docs.oracle.com/javase/jp/7/ Java Platform Standard Edition 7キュメント]
**[http://docs.oracle.com/javase/jp/7/ JDK プログラマーズ・ガイド]
**[https://www.oracle.com/jp/java/technologies/java-se-api-doc.html Java SE APIおよびキュメント]
**[http://docs.oracle.com/javase/jp/7/api/ コア API ドキメント]
**[https://docs.oracle.com/cd/E26537_01/tutorial/ Java リアル]
**[http://docs.oracle.com/cd/E26537_01/tutorial/ Java チュートリアル]

=== 技術情報 ===
*[http://www.atmarkit.co.jp/fjava/ @IT: Java Agile] {{Ref-ja}} - Java技術者のための情報提供/情報交換フォーラム
*[http://www.ibm.com/developerworks/jp/java/ IBM developerWorks Java technology] {{Ref-ja}} - IBM developerWorks の開発者向けの記事
*[http://www.computer-books.us/java.php Computer-Books.us] {{Ref-en}} - Java の複数の書籍(無償でダウンロード可能)

=== JRE(Java実行環境)と JDK(Java開発キット)の実装 ===

==== プロプライエタリ ====
*[http://www.oracle.com/jp/technologies/java/standard-edition/overview/ Java SE] - オラクル(旧サン)によるJREとJDKの実装
*[http://www.oracle.com/technetwork/jp/middleware/jrockit/overview/ Oracle JRockit] - オラクル(旧BEAシステムズ)によるJava仮想マシンとJDKの実装


'''技術情報'''
==== オープンソース/フリーソフトウェア ====
*[https://www.atmarkit.co.jp/ait/subtop/java/ @IT: Java Agile] {{Ja icon}} - Java技術者のための情報提供/情報交換フォーラム
*[http://openjdk.java.net/ OpenJDK] {{Ref-en}}
*[https://developer.ibm.com/languages/java/ IBM developerWorks Java technology] {{Ja icon}} - IBM developerWorks の開発者向けの記事
*[http://gcc.gnu.org/java/ GNU Compiler for Java (GCJ)] {{Ref-en}}
*[https://openjdk.org/ OpenJDK] {{En icon}}


{{Java}}
{{Java}}
992行目: 408行目:
{{プログラミング言語一覧}}
{{プログラミング言語一覧}}
{{FOSS}}
{{FOSS}}
{{典拠管理}}


{{DEFAULTSORT:JAVA}}
[[カテゴリ:Java|*]]
[[カテゴリ:Javaプラットフォーム|*Java]]
[[Category:Java|*]]
[[Category:Javaプラットフォーム|*Java]]
[[カテゴリ:オブジェクト指向言語]]
[[カテゴリ:サン・マイクロシステムズ]]
[[Category:サン・マイクロシステムズ]]
[[カテゴリ:オラクル]]
[[Category:オラクル]]
[[カテゴリ:プログラミング言語]]
[[Category:オブジェクト指向言語]]
[[Category:Java仮想マシンで動作するプログラミング言語]]
[[Category:プログラミング言語]]

2024年12月5日 (木) 12:23時点における最新版

Java
パラダイム オブジェクト指向, コンポーネントベース, リフレクティブ, ジェネリック, 関数型, 並行プログラミング
登場時期 1995年5月23日α版
1995年秋β版
1996年1月23日ver1.0
設計者 Java Community Process
開発者 サン・マイクロシステムズオラクル ウィキデータを編集
最新リリース Java Standard Edition 23.0.1/ 2024年10月15日 (2か月前) (2024-10-15)
型付け 強い静的型付け
主な処理系 Javaプラットフォーム
影響を受けた言語 C++, Ada[1], Eiffel[2], Mesa[3], Modula-3[4], Objective-C[5]
影響を与えた言語 C#, D, Dart, Groovy, Scala, Kotlin, Ceylon
プラットフォーム Solaris, Linux, Windows,
macOS, AIX, System i
ライセンス GNU General Public LicenseJava Community Process
ウェブサイト www.oracle.com/java/ ウィキデータを編集
拡張子 java、class、jar
テンプレートを表示

Java(ジャバ、ジャヴァ)は、汎用プログラミング言語ソフトウェアプラットフォームの双方を指している総称ブランドである[6]オラクルおよびその関連会社の登録商標である。1996年にサン・マイクロシステムズによって市場リリースされ、2010年に同社がオラクルに吸収合併された事によりJavaの版権もそちらに移行した。

プログラミング言語Javaは、C++に類似の構文、クラスベースオブジェクト指向マルチスレッドガベージコレクションコンポーネントベース分散コンピューティングといった特徴を持ち、平易性重視のプログラム書式による堅牢性と、仮想マシン上での実行によるセキュリティ性およびプラットフォーム非依存性が理念とされている。Javaプラットフォームは、Javaプログラムの実行環境または、実行環境と開発環境の双方を統合したソフトウェアであり、ビジネスサーバモバイル機器組み込みシステムスマートカードといった様々なハードウェア環境に対応したソフトウェア形態で提供されている。その中枢技術であるJava仮想マシンは各プラットフォーム環境間の違いを吸収しながら、Javaプログラムの適切な共通動作を実現する機能を備えている[7]。このテクノロジはwrite once, run anywhere」と標榜されていた[8]

2019年の時点でGitHubによると[9]、Javaは特にクライアント/サーバモデルWebアプリケーションで使用されている最も人気の高いプログラミング言語の1つであり[9]、全世界でおよそ900万人の開発者がいるとレポートされている[10]。最新バージョンは、2024年9月にリリースされたJava 23と、2021年9月にリリースされたJava 17の長期サポート(LTS)版である。オラクルは未解決のセキュリティ問題によるリスクを回避するために、旧バージョンのアンインストールと新バージョンへの移行を強く推奨している[11]

Javaの特徴

[編集]

現在の正規ベンダーであるオラクルの公式アピールは、以下の通りである[12]。特に業務用システムの構築に最適であるとしている。

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億のコンピュータデバイスでJava実行環境が動作しており、全世界の200万の人員がJava開発環境を使用しており、全世界で250億枚のJava Cardが発行されている、と統計されている[12]

Javaの構文

[編集]

Javaプログラム構文は、C++によく似たものである。オブジェクト指向言語の一面が強調されがちだが、C言語のような手続き型言語としてもプログラミングできる。Javaはオブジェクト指向パラダイムをそれほど強制しない。

Javaは、同時にマルチパラダイム言語でもある。JDK 1.1でJavaBeans/JavaRMI/CORBAによるコンポーネントプログラミングと、リフレクションAPIによるメタプログラミングが備えられた。J2SE 5.0でジェネリクス構文/APIによるジェネリックプログラミングが追加された。Java SE 7で並行APIによる並行プログラミングが追加された。Java SE 8ではラムダ式/関数型インターフェース/ストリームAPIなどによる関数型プログラミングが追加された。2014年(Java 8)以降の関数型とジェネリクスを多用しているJavaプログラムは、それ以前のJavaプログラムから大きく様変わりしている。

オブジェクト指向

[編集]

Javaは、クラスベースオブジェクト指向である[13]クラスインターフェースインスタンスといった概念を中心にしたものである。クラスのメンバ要素は、フィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラス、コンストラクタ、ファイナライザである。インターフェースは抽象メソッドと定数で構成される純粋抽象クラスである。クラスはインスタンスのひな型であり、インスタンスはクラスを実体化したものである。Javaプログラムは、1個以上のクラス定義文から形成される。Javaのクラスはカプセル化継承多態性をサポートしている。

カプセル化は、クラスメンバの可視性 (private, package, protected, public) でサポートされている。可視性とはメンバのアクセス許可範囲を定めるものであり、privateは同クラス内限定、packageは同クラス内と同パッケージ内限定、protectedは同クラス内と同パッケージ内と派生クラス内限定、publicは制限なしを意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性は、ファイル単位のpackageなので隠蔽性よりも利便性が重視されている。

継承は、スーパークラスが一つに限られる単一継承をサポートしている。多重継承は不可である。既存クラスに任意メンバを追加した新規クラスを作成できる。Javaの全クラスはObjectクラスをルートクラスとしてデフォルト継承する。Objectクラスにはロック機能が備えられており、これは並行プログラミングを前提にした仕様である。

多態性は、仮想関数抽象クラスインターフェース、動的ダウンキャストでサポートされている。スーパークラスのvirtualメソッドを、サブクラスの同名メソッドでオーバーライドできる機能を仮想関数と言う。スーパークラス変数にサブクラスインスタンスを代入してその変数からサブクラスのメソッドが呼ばれるようにするのは、サブタイピングになる。インターフェースは抽象メソッドだけの純粋抽象クラスであり、任意の数だけクラスに実装できる。実行時ダウンキャストはinstanceof演算子の実行時型チェックが可能で、ダウンキャスト失敗時は例外発生する。

プラットフォーム非依存

[編集]

プラットフォーム非依存とは、Javaプログラムが特定のハードウェアオペレーティングシステムに依存せずに、あらゆる環境での共通動作を保証する概念である。”Write once, run anywhere”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)とされる。Javaのプラットフォーム非依存性は次のようにして実現されている。

  1. Javaコンパイラは、Javaソースコードを、Javaバイトコードという中間表現にコンパイルする。Javaバイトコードは、Java仮想マシン用の実行コードである。Javaバイトコードは通常、Javaクラスファイルにまとめられる。
  2. Java仮想マシンは、各プラットフォームの差異を吸収するクッション的なソフトウェアである。Java仮想マシンは、様々なコンピュータ環境対応バージョンが提供されており、各プラットフォームにJava実行環境の中核としてインストールされる。
  3. Java仮想マシンは、任意のJavaクラスファイルJavaクラスローダーで読み込み、そのJavaバイトコードを解釈実行する。インタプリタ式の解釈走行と、実行時コンパイラで解釈走行させるものがある。

Java初期のインタプリタ式で走行されるJavaプログラムの実行速度は遅かったが、実行時コンパイラ技術と動的再コンパイル技術 (dynamic recompilation) の導入によって実行速度問題はほぼ解決した。実行時コンパイラとは、一定のJavaバイトコードをまとめてネイティブコードにコンパイルして継続的に実行させる技術である。Java仮想マシンはメモリ境界とバッファオーバーフローのチェックを行いながらプログラムを走行させる。また、クラスロード時のバイトコード検証機能によって、あからさまなコード暴走や致命的エラーの頻発を事前抑止している。

マルチスレッド

[編集]

Javaプログラムは、複数以上のスレッドを同時走行できる。これをマルチスレッドと言う。多数のスレッドを扱う大規模システムにも対応しており、例えばスレッドグループAPIは、スレッドたちを役割や性質でグループ化して一括操作できる。これはクライアント・サーバシステムの実装向けである。また、多数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成/破棄の反復による負荷増大を回避するための、スレッドプールとタスクキューを合わせたスレッドモニタAPIも用意されている。

Javaのマルチスレッド並行計算は、クリティカルセクション同期が基準にされている。Javaの全インスタンスは、ロック機能を備えているObjectクラスをルート継承しているので、クリティカルセクションのロックオブジェクトにできる。Javaではsynchronizedで指定された範囲がクリティカルセクションになる。Javaの標準ロック手法は、ミューテックスモニタである。synchronizedメソッドはその全体が排他セクションになり、そこではThisインスタンスがロックオブジェクトになる。synchronized静的メソッドでは、システム内の専用インスタンスがロックオブジェクトになる。また、synchronized(指名変数)構文でメソッド内の任意範囲をクリティカルセクションにして、そこでは指名変数がロックオブジェクトになる。

ミューテックスのモニタ以外の、カウントセマフォバリアや読み書きロックなどのロック手法は、並行APIの方で用意されている。

ガベージコレクション

[編集]

Javaプログラムのメモリ管理は、Java仮想マシンガベージコレクションによって行われる。ガベージコレクションとは、すでにどこからも参照されていないインスタンスを自動的に特定して破棄し、その占有メモリ領域を自動的に解放する機能である。人の手によるオブジェクトの生成と破棄を正確に対応させるメモリ管理作業は煩雑化するのが常であり、メモリリークや不正リリースによるエラーを引き起こしやすく、バグの温床と化すのが通例であった。それらを自動化したガベージコレクションは、Javaプログラマを複雑なメモリ管理作業から解放する。

ガベージコレクタのプロセスは、システムスレッドに乗って未参照のインスタンスを探し続ける。どこかの末端だけが途切れている参照の連鎖のかたまりも正確に特定して、参照の孤島に例えられたメモリ領域を一気に解放する。Javaではガベージコレクション機能に並々ならぬ力が入れられており、その技術更新は現在も進行中である。世代別ガベージコレクタ、応答時間短縮化のレイテンシ重視ガーベジコレクタ、休止時間短縮化のスループット重視ガーベジコレクタなどが導入されて更に改訂を重ねており、運用環境別の選択使用も可能にされている。

分散コンピューティング

[編集]

Javaの分散コンピューティングプログラミングは、オブジェクト要求ブローカーに準拠している。これはネットワーク上に存在する様々なプラットフォームの間で、互いに異なる環境を意識せずにリクエストとレスポンスを送りあい任意のタスクを遂行する分散システムの構築をサポートする。各プラットフォーム上で稼働されるサーバアプリケーションとクライアントアプリケーションは、それぞれオブジェクトを内包しており、業界共通規格のCORBAまたはJava独自規格のRMIが提供する運用アーキテクチャと通信プロトコルを通して、他のオブジェクトと相互にコミュニケーションする。それらは分散オブジェクトと呼ばれている。

業務用システムではすでにCORBAが普及していたので、高パフォーマンスだがJavaプラットフォーム間の限定になるRMIはその後追いであった。そのためRMIはCORBAと連携できるようにRMI over IIOPなどの様々な技術が実装されている。CORBAの通信プロトコルはIIOP、RMIの方はJRMPである。分散オブジェクトを実装するためのAPIとクラスライブラリの多くはJakarta EEに属している。分散オブジェクトの中でサーバ機能に特化されたものはEJB (Enterprise JavaBeans) と呼ばれている。

EJBは、クライアントと同期通信を行いトランザクションを管理するセッションビーン、データベースとリンクして永続データを管理するエンティティビーン、様々なイベントからの非同期通信を管理するメッセージドリブンビーンの三種に大別される。これらのEJBは、EJBコンテナに内包されて運用される。分散オブジェクト同士が通信するためのプロトコルは、IIOPかJRMPが使われる。JNDIは、照会された識別名からネットワーク上の分散オブジェクトや各種リソースのロケーションを特定して通信ないしアクセスできるようにする。

EJBコンテナは、WEBコンテナと連携して運用されるのが普通である。EJBコンテナはWEBコンテナを一般的なクライアント窓口として使用することが多い。WEBコンテナはサーブレットJSP(Java Server Pages)を内包しているWEB用サーバアプリケーションであり、HTTPプロトコルを通して一般的なWEBブラウザとの同期通信を行う。WEB方面の分散オブジェクトは、WEBコンポーネントと呼ばれる。JSPはいわゆるWEBサイトの表示に特化したコンポーネントである。サーブレットはWEBサイトへのリクエストを処理し、場合によってはセッションビーンにトランザクションを委譲するコンポーネントである。EJBコンテナではJBossWebSphereなどが有名である。EJBコンテナはWEBコンテナと統合されて提供されている事が多い。WEBコンテナではApache Tomcatが有名である。

セキュリティ

[編集]

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

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

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

Javaの歴史

[編集]

誕生の経緯

[編集]

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

ジェームズ・ゴスリン

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

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

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

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

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

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

1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとより広範囲な可能性を秘めるようになったグリーンプロジェクトの対象は当初の家電機器から、当時のトレンドであった携帯情報端末 (PDA)へとシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このStar7のユーザーインターフェース上で後のマスコットキャラ「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」に改称した。Green OSは「Java Runtime Environment」に落とし込まれた。改称の理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたと言われる。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(Bean)はJavaテクノロジ内でコンポーネントを指す用語にされている。

1994年10月、JavaランタイムとHotJavaブラウザがサンの幹部社員たちの前でデモンストレーションされた。1995年5月にアルファ版が社内公開され、5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここではJavaアプレットの技術がセールスポイントとしてアピールされた。同時にネットスケープが「Netscape Navigator」ブラウザへのJavaアプレット機能導入をアナウンスして業界の注目を集めた。1995年秋にベータ版が社外公開された。1996年1月9日にサンは、正式にJavaソフトウェア部門を立ち上げた。基幹テクノロジは市場リリース段階まで進捗していたが、その他のテクノロジは未だ途上段階であり、プラットフォームと呼べる域までは達しておらず、初回リリースのプロダクト名は、Javaランタイム環境を内包したデヴェロップメントキットになった。1月23日に最初の公開バージョンである「JDK 1.0」が市場リリースされた。

バージョン履歴

[編集]
バージョン リリース日
JDK Beta 1995年
JDK1.0 1996年1月23日[14]
JDK 1.1 1997年2月19日
J2SE 1.2 1998年12月8日
J2SE 1.3 2000年5月8日
J2SE 1.4 2002年2月6日
J2SE 5.0 2004年9月30日
Java SE 6 2006年12月11日
Java SE 7 2011年7月28日
Java SE 8 2014年3月18日
Java SE 9 2017年9月21日
Java SE 10 2018年3月20日
Java SE 11 2018年9月25日[15]
Java SE 12 2019年3月19日
Java SE 13 2019年9月17日
Java SE 14 2020年3月17日
Java SE 15 2020年9月15日[16]
Java SE 16 2021年3月16日
Java SE 17 2021年9月14日[17]
Java SE 18 2022年3月22日[18]
Java SE 19 2022年9月20日[19]
Java SE 20 2023年3月21日[20]
Java SE 21 2023年9月19日[21]
Java SE 22 2024年3月19日[22]
Java SE 23 2024年9月17日[23]

Javaプログラミング例

[編集]

Hello World

[編集]
// Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
  • Javaプログラムでは全てのフィールドとメソッドがclass内に記述される。
  • Javaプログラムは静的メソッドpublic static void main (String[] args)から開始される。argsはプログラム開始時のコマンドライン・パラメータである。
  • System.outはSystemクラスの静的フィールドoutを意味する。outはPrintStream型のインスタンスである。out.println("文字列")はoutのprintlnメソッドを呼び出す。

Javaプラットフォーム

[編集]

Javaプラットフォーム (Java Platform) は、Javaプログラムを開発または実行する為のソフトウェア群の総称である。Javaプラットフォームは対象環境に合わせて、Java実行環境およびJava開発環境の構成内容と、Javaテクノロジの追加内容を変えたエディションに編集されて公開されている。Javaテクノロジは権利元ベンダーだけでなくサードパーティー側からも提供されており、その標準化はJavaコミュニティプロセス (JCP) が管理している。Java実行環境とJava開発環境はオープンソース化されているので各企業、各団体、開発者各自が営利または非営利で様々なソフトウェアと関連技術を公開しており、巨大な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月にオラクルは今後のJava EEのバージョンアップがエクリプス財団によって行われる事を発表した[24][25]。Java EEの商標は現行版のサポートを続けるオラクルが保持したので、エクリプス財団による今後のバージョンはJakarta EEの名称で公開される事になった[26]
Java Platform, Micro Edition (Java ME)
組み込みシステムマイクロコントローラ向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
Java Card
スマートカード(ICカード)、小型メモリデバイス上で運用されるプログラムを開発するためのエディションである。現在[いつ?]ではSIMカードATMカードなど幅広い分野に普及している。Java仮想マシンの機能は非常にコンパクトにまとめられており、幾つかのプリミティブ型も省略されている。故に特殊なプログラミングスタイルが求められる。

Java実行環境 (JRE)

[編集]

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

Javaクラスライブラリ

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

  1. 基礎ライブラリ - Java言語の基礎を扱う。
  2. 入出力ライブラリ - ファイル入出力など。
  3. コレクションライブラリ - 動的配列と動的連想配列。データ集合の操作。
  4. 数学ライブラリ - 各種計算を扱う。
  5. 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
  6. ネットワークライブラリ - ソケット通信を扱う。
  7. GUIライブラリ - グラフィカル・ユーザーインターフェースを扱う。
  8. アプレットライブラリ - アプレット生成用。
  9. Javaビーンズライブラリ - ソフトウェアコンポーネント作成用。
  10. データベース接続ライブラリ - SQLを扱う。
  11. リモートメソッドライブラリ - 分散オブジェクトを扱う。
  12. セキュリティライブラリ - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。
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 - 動的配列と動的連想配列。データ集合の操作。
  4. java.math - 各種計算を扱う。
  5. java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
  6. java.net - ソケット通信を扱う。
  7. java.awt - グラフィカル・ユーザーインターフェイスを扱う。
  8. java.applet - アプレット生成用。
  9. java.beans - ソフトウェアコンポーネント作成用。
  10. java.sql - SQLを扱う。
  11. java.rmi - 分散オブジェクトを扱う。
  12. java.security - セキュリティポリシー、ユーザー認証と権限承認、公開鍵暗号方式など。
統合開発環境と開発支援ツール

統合開発環境 (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テクノロジは、個人を含む各種組織から様々な形態で公開されている。開発元から提示された技術は、Java Community Process (JCP) による審査を合格した後にJavaテクノロジの一つとして認証される。これを標準化 (standardization) と言う。Javaテクノロジが準拠すべき規範仕様は、JCP管理下で発行される数々のJava仕様要求 (Java Specification Request) にて定義されている。Javaテクノロジは様々な分野に導入されている。その一例を以下に列挙する。

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

Javaオープンソースモデル

[編集]

サン・マイクロシステムズは1996年のリリース当初からJava実行環境とJava開発環境をオープンソース化しており、サードパーティーにJavaテクノロジ開発への参入をアピールしていた。ただしJavaの普及に一定のコントロールをかける為にソースコードの改変までは認めていなかった。2004年になるとIBMが業界の優位性を活かしてJavaオープンソースプロジェクトの主導権を握るようになった。Javaコミュニティプロセスを取り巻く業界の変化を悟ったサン・マイクロシステムズはIBMとの本格的な提携を承認し、2007年にJava SE 6を「OpenJDK」としてGNU一般公開ライセンスの下でリリースした[28]。OpenJDKではソースコードの改変も認められた。GNUプロジェクトは「GNU Interpreter for Java」、GNUコンパイラコレクションの「GNU Compiler for Java」、互換クラスライブラリの「GNU Classpath」を公開した。Windows用GNU Compilerは、MinGWと併せてCygwinの環境上でも実行できた。

WindowsやLinuxなどのメジャーOSでは、オラクル、IBM、Blackdown、GNUプロジェクト、Kaffe.orgなどによるJavaプラットフォームが公開されている。また、JavaソースコードをそのままWin用実行ファイルに変換する「Excelsior JET」や[29]、JarファイルをWin用実行ファイルに変換する「exewrap」「Launch4j」「NSIS」「JSmooth」なども販売ないし公開されている。

Java認定資格

[編集]
認定パス

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

現在受験可能な資格[30][31][32][33]
資格名 レベル 対象バージョン
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. ^ 日本でのみ行われている[34]
  3. ^ 日本以外での Oracle Certified Associate, Java SE 8 Programmer に対応。
  4. ^ 日本以外での Oracle Certified Professional, Java SE 8 Programmer に対応。

出典

[編集]
  1. ^ Chaudhary, Harry H. (2014年7月28日). “Cracking The Java Programming Interview :: 2000+ Java Interview Que/Ans”. 2016年5月29日閲覧。
  2. ^ The Java Language Environment” (May 1996). May 6, 2014時点のオリジナルよりアーカイブMay 6, 2014閲覧。
  3. ^ The Java Language Specification, 2nd Edition”. August 5, 2011時点のオリジナルよりアーカイブFebruary 8, 2008閲覧。
  4. ^ The A-Z of Programming Languages: Modula-3”. Computerworld.com.au. January 5, 2009時点のオリジナルよりアーカイブ。2010年6月9日閲覧。
  5. ^ Patrick Naughton cites Objective-C as a strong influence on the design of the Java programming language, stating that notable direct derivatives include Java interfaces (derived from Objective-C's protocol) and primitive wrapper classes. [1] Java Was Strongly Influenced by Objective-C - ウェイバックマシン(2011年7月13日アーカイブ分)
  6. ^ What is Java and why do I need it?” (英語). 2019年1月閲覧。
  7. ^ 1.2 Design Goals of the Java™ Programming Language”. オラクル (January 1, 1999). January 23, 2013時点のオリジナルよりアーカイブ。2013年1月14日閲覧。
  8. ^ Write once, run anywhere?”. Computer Weekly (May 2, 2002). 2009年7月27日閲覧。
  9. ^ a b Chan (January 22, 2019). “The 10 most popular programming languages, according to the 'Facebook for programmers'”. Business Insider. June 29, 2019時点のオリジナルよりアーカイブ。June 29, 2019閲覧。
  10. ^ JavaOne 2013 Review: Java Takes on the Internet of Things”. www.oracle.com. April 19, 2016時点のオリジナルよりアーカイブ。2016年6月19日閲覧。
  11. ^ Why should I uninstall older versions of Java from my system?”. オラクル. 2016年9月9日閲覧。
  12. ^ a b Java Software | オラクル”. www.oracle.com. 2019年10月19日閲覧。
  13. ^ 広辞苑 第六版
  14. ^ JAVASOFT SHIPS JAVA 1.0”. sun.com. March 10, 2007時点のオリジナルよりアーカイブ。2008年2月5日閲覧。
  15. ^ Chander, Sharat. “Introducing Java SE 11”. oracle.com. September 26, 2018時点のオリジナルよりアーカイブSeptember 26, 2018閲覧。
  16. ^ The Arrival of Java 15!”. Oracle (September 15, 2020). 2020年9月15日閲覧。
  17. ^ オラクル、Java 17をリリース”. Oracle (2021年9月17日). 2021年9月30日閲覧。
  18. ^ オラクル、Java 18を発表”. Oracle (2022年3月22日). 2022年3月23日閲覧。
  19. ^ オラクル、Java 19をリリース”. Oracle (2022年9月21日). 2022年9月21日閲覧。
  20. ^ オラクル、Java 20をリリース”. Oracle (2023年3月22日). 2022年3月23日閲覧。
  21. ^ オラクル、Java 21のリリースとサポート・ロードマップの延長を発表”. Oracle (2023年9月19日). 2023年9月21日閲覧。
  22. ^ オラクル、Java 22をリリース”. Oracle (2024年3月21日). 2024年3月23日閲覧。
  23. ^ オラクル、Java 23をリリース”. Oracle (2024年9月17日). 2024年9月18日閲覧。
  24. ^ Opening Up Java EE - An Update” (英語). オラクル (2017年9月12日). 2019年3月10日閲覧。
  25. ^ EE4J、EclipseファウンデーションがオープンソースJava EEを準備”. InfoQ (2017年11月16日). 2019年3月10日閲覧。
  26. ^ Java EE は Jakarta EE となる”. InfoQ (2018年3月5日). 2019年3月10日閲覧。
  27. ^ 星 暁雄=日経BP Javaプロジェクト (2003年10月31日). “EclipseとWebSphere Studioはどう違うのか | 日経 xTECH(クロステック)”. 日経 xTECH(クロステック). Nikkei Business Publications, Inc.. 2019年11月17日閲覧。
  28. ^ 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日閲覧。
  29. ^ http://www.excelsior-usa.com/jet.html
  30. ^ オラクル Java SE 認定資格パス 概要”. 2019年3月7日閲覧。
  31. ^ オラクル Java EE and Web Services 認定資格パス 概要”. 2019年3月7日閲覧。
  32. ^ Java Foundations Certified Junior Associate (novice-level certification)”. 2019年3月10日閲覧。
  33. ^ 認定試験一覧”. 2019年3月7日閲覧。
  34. ^ Java資格が大幅リニューアル。Bronze/Silver/Goldが登場”. 2019年3月7日閲覧。

参考文献

[編集]

関連項目

[編集]

外部リンク

[編集]

オラクル・JCP関連

技術情報