削除された内容 追加された内容
編集の要約なし
編集の要約なし
(同じ利用者による、間の4版が非表示)
18行目:
}}
{{プログラミング言語}}
[[ファイル:Java 20131025 1864663017.jpg|境界|右|フレームなし|280x280ピクセル]]
'''Java'''(ジャヴァ)は、[[クラスベース]]の[[オブジェクト指向プログラミング|オブジェクト指向]]の、実装の[[結合度|依存関係]]をできるだけ少なくするように設計された汎用[[プログラミング言語]]である。これは、アプリケーション開発者が一度書いたらどこでも実行できるようにすること(WORA:''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コードは、再コンパイルを必要とせずに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=Oracle|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>。Javaアプリケーションは、通常、基礎となるコンピュータアーキテクチャに関係なく、あらゆるJava仮想マシン(JVM)上で実行できるバイトコードにコンパイルされる。Javaの構文は[[C言語|C]]および[[C++|C ++]]に似ているが、どちらよりも[[低水準言語|低レベル]]の機能が少ない。2019年の時点で、[[GitHub]] <ref name=":02">{{Cite web|url=https://www.wired.com/2013/01/java-no-longer-a-favorite/|title=Is Java Losing Its Mojo?|quote=Java is on the wane, at least according to one outfit that keeps on eye on the ever-changing world of computer programming languages. For more than a decade, it has dominated the [[TIOBE index|TIOBE]] Programming Community Index, and is back on top – a snapshot of software developer enthusiasm that looks at things like internet search results to measure how much buzz different languages have. But lately, Java has been slipping.|first=Robert|author=McMillan|date=August 1, 2013|publisher=[[wired.com]]|accessdate=March 8, 2017|archiveurl=https://web.archive.org/web/20170215115409/https://www.wired.com/2013/01/java-no-longer-a-favorite/|archivedate=February 15, 2017}}</ref> <ref>{{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=":02" /> <ref>{{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>、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>。
 
34 ⟶ 35行目:
 
=== オブジェクト指向 ===
Javaの主要プログラミングパラダイムは[[クラスベース]]の[[オブジェクト指向プログラミング言語|オブジェクト指向]]である<ref>広辞苑 第六版</ref>。オブジェクト指向にある複数の実装スタイルの一つであるクラスベースは、手続き型プログラミングを土台にして実践できる比較的万人向けのものである。クラスベース・オブジェクト指向はその名の通り[[クラス (コンピュータ)|クラス]]の仕組みを中心にする。クラスは任意のフィールド(=メンバ変数)と任意のメソッド(=メンバ関数)をひとまとめにしたものである。クラスのデザインはフィールド構成を中心にして、それに関連したメソッドを備えるのが基本とされる。クラス定義内の要素はフィールド、メソッド、静的フィールド、静的メソッド、定数、内部クラスの六種類である。内部クラスはクラス内で定義される入れ子のクラスであり、コンポジションパターンの実装が主な用途になる。メソッド内部で任意のクラスを派生元にした無名クラスを定義する事もできる。これは[[プロトタイプベース]]・オブジェクト指向のスタイルを取り入れたもので、その場限りのクラスをコードに組み込める利便性の高い機能である。クラスの定義文には上述のフィールド名やメソッド文などの要素がずらずらと羅列される。Javaプログラムは、この1個以上のクラス定義文を組み合わせてから形成される。Javaクラスベース・オブジェクト指向の三つの要点とされる機構は[[カプセル化]]、[[継承 (プログラミング)|継承]]、[[ポリモーフィズム|多態性]]をサポートしている。
 
Javaのカプセル化は、クラス定義文に記述する四つのアクセス修飾子(''private''、''package''、''protected''、''public'')によってサポートされている。アクセス修飾子これはフィールド定義とメソッド定義のそれぞれ先頭に記されて可視性を決定する。''private''は同クラス内限定、''package''は同クラス内と同パッケージ内限定、''protected''は同クラス内と同パッケージ内と派生クラス内限定、''public''はどこからでもアクセス可能を意味する。パッケージはプログラム全体を任意に分割したソースファイルの1個以上のまとまりである。Javaのデフォルト可視性はOOPでは変則的なファイル単位の''package''なので隠蔽性よりも利便性が重視されている。
 
Javaの継承は、スーパークラスが一つに限られる単一継承をサポートしており多重継承は除外されている。継承用のアクセス修飾子は無くタイプも除外されており''public''継承に統一されている。継承によって既存クラスの設計を引き継ぎつつ任意のフィールドとメソッドを追加した独自のクラスを作成できる。また既存とオリジナルJavaの全てのクラスは、基礎APIで用意されているObjectクラスをデフォルト継承最上位の基底する。全クラスの派生元のが強制されている。Objectクラスにはが持つロック機能が備えられているのでオブジェクト指向とマルチスレッド同期調和に一役買っさせている。
 
Javaの多態性は、[[仮想関数]]と[[インタフェース (抽象型)|インターフェース]]と実行時[[ダウンキャスト]]と[[リフレクション (情報工学)|リフレクション]]でサポートされている。親クラスの''abstract''メソッドが仮想関数の抽象メソッドになり、子クラスの同名オーバーライドメソッドが仮想関数の実装メソッドになる。インターフェースは抽象メソッドだけで構成される純粋抽象クラスであり、''implements''構文によって任意の数だけクラスに実装できる。インターフェースはJavaの中でも比較的重視されており各クラスの動作局面を明確にする。実行時ダウンキャストは''instanceof''演算子による実行時型チェックで事前確認でき、ダウンキャスト失敗時は例外発生によってフォローできる。リフレクションはクラスの構造内容を操作できる機能で[[ダイナミックバインディング|動的ディスパッチ]]、[[メッセージ転送|メソッドミッシング]]、[[モンキーパッチ]]などの実装に活用できる。ただし安易な使用は推奨されていない。
 
Javaの多態性は、インターフェースと仮想関数を中心にしてサポートされている。親クラスの定義文で''virtual''指定されたメソドが仮想関数を表す抽象メソッドになり、その子クラスの定義文で処理内容を記述された同名のメソッドが仮想関数のプロセスを表す実装メソッドになる。Javaは強い[[静的型付け]]と共に安全な[[動的型付け]]も採用しており、''instanceof''演算子による型審査と、''(typename)''によるダウンキャストの二つがそれにあたる。ダウンキャスト失敗時は例外発生によってフォローされる。両者とも実行時決定でありデータの遅延バインディングをサポートしている。Javaの中でも比較的重視されている[[インタフェース (抽象型)|インターフェース]]は抽象メソッドだけで構成される純粋抽象クラスであり、クラス定義文の''implements''によって任意の数だけ実装指定できる。インターフェースは各クラスの様々な動作局面表現を促して設計を明確にする。Javaには[[リフレクション (情報工学)|リフレクション]]も導入されている。これはクラスの構造内容を操作できる機能であり、Javaの理念である堅牢性とセキュリティを壊しかねない危うさを伴うが、[[分散コンピューティング]]の発展などを視野に入れたJavaテクノロジの拡張に不可欠とされて専用APIが用意された。リフレクションはメッセージベース・オブジェクト指向のスタイルに近い柔軟な多態性の動的ディスパッチを実装できる他、Javaプログラムの為のメタ的なモニタリングツールおよびフレームワークの構築などが主な用途になる。
=== プラットフォーム非依存 ===
[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaプログラムが特定のハードウェアおよびオペレーティングシステムの機能に依存する事なく、Java実行環境が導入されたあらゆるコンピューター環境上において共通した動作を見せる事を意味する。”''Write once, run anywhere''”(一度プログラムを書いてしまえば、どのコンピューターでも動くよ)がそのスローガンとされていた。Javaのプラットフォーム非依存性は次のようにして実現されている。
84 ⟶ 86行目:
'''家電向けプロジェクトの立ち上げ(1990年12月)'''
[[ファイル:James Gosling 2008.jpg|サムネイル|181x181ピクセル|ジェームズ・ゴスリン]]
Javaの歴史は、1990年12月に[[サン・マイクロシステムズ]]社が、次世代の家電製品が内蔵するマイクロコントローラ向けのプログラミング言語を開発するステルス・プロジェクトを立ち上げた事から始まる。サン社はこの分野が重要市場になると予測していた。サン社のエンジニアである[[ジェームズ・ゴスリン]]とマイク・シェルダンの参加により、現実味を帯びたプロジェクトの名称は正式に「グリーンプロジェクト」と定められた。彼らは、カリフォルニア州[[メンローパーク (カリフォルニア州)|メンローパーク]]市サンドヒルロードにある小さなオフィスで開発を始めた。
 
'''Oak言語とGreen OSの誕生(1991年)'''
90 ⟶ 92行目:
グリーンチーム内では当時隆盛していたオブジェクト指向を採用する事で一致していた。彼らはそのモデル言語である[[C++]]に白羽の矢を立て、当初はその移植版を検討していたが、プロジェクトの対象が家電製品の[[組み込みシステム]]であったために自然と却下された。C++の複雑な言語仕様はコンピュータ資源の浪費とプログラムエラーの発生率を高めがちであり、堅牢性と安全性が至上命題である家電製品の制御装置には不向きであると判断されたためだった。加えてC++では[[移植性]]に対応できない点も指摘されており、プロジェクトの中で[[プラットフォーム非依存]]が特に重要な議題として上がった。彼らはC++に代わる言語の開発と同時に、あらゆる機器に容易に移植できるプラットフォームの必要性も認識するようになった。こうして新言語プログラムの動作環境になる「Green OS」の開発も始められた。
 
一方で、[[Mesa]]言語と[[C言語]]の長所を理想にしていたサン社エンジニアの[[ビル・ジョイ]]は、''Further''(彼方へ)という名の論文を書いてC++をモデルにした新しいオブジェクト指向言語の開発を自社に提案した。それを受けてまずジェームズ・ゴスリンがC++の拡張言語を提出した。ゴスリンはこれを「C++ ++ --」と名付けたがすぐに取り下げ、改めて一から設計しなおしたプログラミング言語を誕生させた。オフィスの側に立つオークの木を眺めながら開発を進めていたゴスリンは、この新しい言語に'''Oak'''という名前をつけた。時に1991年秋でありこの「Oak」がJavaの前身になった。それと並行してOakプログラムが用いる基本ライブラリも整備された。
 
'''携帯端末、テレビ機器市場への参入と撤退(1992年~1994年5月)'''[[ファイル:Duke3D.png|thumb|Javaのマスコット「'''Duke'''」with [[BSDライセンス]]|代替文=|190x190ピクセル]]1992年夏にはGreen OSを実際の機器に載せてOakプログラムを実行できるようになっていた。この頃になるとグリーンプロジェクトの対象は、当初の家電機器から[[携帯情報端末]](PDA)にシフトされていた。1992年9月3日に最初のデモンストレーションが開催され「Star7」という名のPDA機器がOakプログラムの初のお披露目舞台になった。このStar7のユーザーインターフェース上で後のマスコットキャラ「Duke」が初登場している。1992年11月、サン社はファーストパーソン社を設立しグリーンチームをそちらに所属させた。次世代のインタラクティブ機器に関心を持つファーストパーソン社は、ケーブルテレビ用[[セットトップボックス]]事業への参入を決めて、[[タイム・ワーナー|タイムワーナー]]社と[[3DO]]社にそれぞれOakテクノロジを提示したが、その高度な柔軟さが逆に倦厭されて契約実現には到らなかった。サン本社はファーストパーソン社の解散を決め、グリーンチームも本社に戻された。
 
'''ワールドワイドウェブ参入(1994年6月~1994年9月)'''
 
1994年6月、サン社技術部長ジョン・ゲージが[[ジェームズ・ゴスリン]]、[[ビル・ジョイ]]、[[パトリック・ノートン]]、[[エリック・シュミット]]ら集めて、延べ3日に渡るブレインストーミングが行われた。ここで彼らは[[World Wide Web|ワールドワイドウェブ]]をプロジェクトの本命に据える事で一致した。革新的な[[ウェブブラウザ]]である「[[NCSA Mosaic]]」の登場に触発された彼らは、インターネットの世界がケーブルテレビのそれを超えたインタラクティブな媒体に発展しつつある事を認識していた。パトリック・ノートンはOakテクノロジをベースにした「WebRunner」という小さなウェブブラウザを開発した。Oakによる小さなアクティブプログラムが埋め込まれたウェブページにアクセスすると、WebRunner上でマウス操作に連動するインタラクティブなアニメーションが表示された。
 
'''Javaの始動(1994年10月~1996年1月)'''
[[ファイル:Hotjava.jpg|サムネイル|180x180ピクセル|HotJavaブラウザ]]
1994年秋までにグリーンチームは、Oakを'''Java'''に、WebRunnerを「[[HotJava]]」に改称した。Green OSは「Java Runtime Environment」に落とし込まれた。改称の理由はOakがすでにビデオカードアダプタ製造会社の登録商標になっていたからだった。この命名は一部のチームメンバーがよく出入りしていた近くのコーヒーショップで決定されたという言われる。Javaの由来は不明とされているが、ロゴが示している通りコーヒーに因んでいるのは明らかである。ジャワ島はコーヒー豆の名産地であり、豆(''Bean'')はJavaテクノロジ内でコンポーネントを指す用語にされている。
 
1994年10月、JavaランタイムとHotJavaブラウザがサン社幹部社員の前でデモンストレーションされ、α版が社内公開された。1995年5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここでは[[Javaアプレット]]の技術がセールスポイント的にアピールされた。同時に[[ネットスケープコミュニケーションズ|ネットスケープ社]]が「[[Netscape Navigator (ネットスケープコミュニケーションズ)|Netscape Navigator]]」ブラウザへもこのアプレット機能を配備するとアナウンスして業界の注目を集めた。1995年秋にβ版が社外公開された。1996年1月9日にサン社は正式にJavaソフトウェア部門を立ち上げた。その2週間後に最初の公開バージョンである「JDK 1.0」が市場リリースされた。
 
1994年10月、JavaランタイムとHotJavaブラウザがサン社の幹部社員たちの前でデモンストレーションされ、アルファ版が社内公開された。1995年5月23日のSunワールドカンファレンスで、JavaランタイムとHotJavaブラウザが社外初披露された。ここでは[[Javaアプレット]]の技術がセールスポイント的にアピールされ、同時に[[ネットスケープコミュニケーションズ|ネットスケープ社]]が「[[Netscape Navigator (ネットスケープコミュニケーションズ)|Netscape Navigator]]」ブラウザへもこのアプレット機能を配備するとアナウンスして業界の注目を集めた。1995年秋にベータ版が社外公開された。1996年1月9日にサン社は正式にJavaソフトウェア部門を立ち上げた。基礎およびコアテクノロジは市場リリースに恥じない段階まで進捗していたが、綜合基盤であるプラットフォームと呼べる域までは達しておらず、初リリースのプロダクト名はJavaランタイム環境を内包したデヴェロップメントキットになった。1月23日に最初の公開バージョンである「JDK 1.0」が市場リリースされた。
=== バージョン履歴 ===
{{main|Javaバージョン履歴}}1996年1月の初リリースからバージョン更新はおおむね数年おきに行われていたが <ref>{{Cite web|url=http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml|title=JAVASOFT SHIPS JAVA 1.0|accessdate=2008-02-05|archiveurl=https://web.archive.org/web/20070310235103/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml|archivedate=March 10, 2007}}</ref>、2017年9月の「Java SE 9」から一定の機能蓄積を待たずに強制公開する旨が発表され、毎年3月9月の年二回定期リリース制に変更された。それに伴い従来の長期間サポート(LTS)制度も廃止され、原則的に次回バージョンまでの半年間サポートになった。2018年9月の「Java SE 11」から有償契約LTS制度が発表され、このバージョンはLTS対象とされた<ref>{{Cite web|url=https://blogs.oracle.com/java-platform-group/introducing-java-se-11|title=Introducing Java SE 11|first=Sharat|author=Chander|website=oracle.com|accessdate=September 26, 2018|archiveurl=https://web.archive.org/web/20180926093144/https://blogs.oracle.com/java-platform-group/introducing-java-se-11|archivedate=September 26, 2018}}</ref>。LTS対象バージョンは安定版、そうでないものは新機能提供版といった位置付けである。現行のLTS対象バージョンは「Java SE 11」と「Java SE 8」である。
{{main|Javaバージョン履歴}}2019年3月現在、Java 8がサポートされており、Java 8と11の両方が長期間サポート(LTS)バージョンとしてサポートされている。Javaの主なリリースバージョンとリリース日は以下である。
 
{| class="wikitable" style="margin-left:9px;"
|-
! バージョン
! リリース日
! 無料公開アップデート期限<ref name="auto9">{{Cite web|url=https://www.oracle.com/technetwork/java/java-se-support-roadmap.html|title=Oracle Java SE Support Roadmap|website=www.oracle.com}}</ref><ref>{{Cite web|url=https://adoptopenjdk.net/support.html#roadmap|title=Support &#124; AdoptOpenJDK|website=adoptopenjdk.net}}</ref>
! 延長サポート期限
|-
| {{Version|o|JDK Beta}} || 1995 || {{dunno}} || {{dunno}}
|-
| {{Version|o|JDK 1.0}} || 1996年1月 ||{{dunno}} || {{dunno}}
|-
| {{Version|o|JDK 1.1}} || 1997年2月 ||{{dunno}} || {{dunno}}
|-
| {{Version|o|J2SE 1.2}} || 1998年12月 ||{{dunno}} || {{dunno}}
|-
| {{Version|o|J2SE 1.3}} || 2000年5月 ||{{dunno}} || {{dunno}}
|-
| {{Version|o|J2SE 1.4}} || 2002年2月 || 2008年10月 ||2013年2月
|-
| {{Version|o|J2SE 5.0}} || 2004年9月 || 2009年11月 ||2015年4月
|-
| {{Version|o|Java SE 6}} || {{date|2006年12月 }}|| 2013年4月 || 2018年12月
|-
| {{Version|o|Java SE 7}} || 2011年7月 ||{{date|2015年4月}}|| 2022年7月
|-
| {{Version|co|Java SE 8 (LTS)}} || 2014年3月 ||Oracle(商用)   2019年1月まで
Oracle(個人用)  2020年12月まで
 
AdoptOpenJDK  2026年5月以降も予定
 
Amazon Corretto 2023年6月までは保証<ref name="Corretto2018">{{cite web
* JDK 1.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|accessdate=2008-02-05|archiveurl=https://web.archive.org/web/20070310235103/http://www.sun.com/smi/Press/sunflash/1996-01/sunflash.960123.10561.xml|archivedate=March 10, 2007}}</ref>
| title = Introducing Amazon Corretto, a No-Cost Distribution of OpenJDK with Long-Term Support
* JDK 1.1(1996年2月19日)
| last = Gupta
* J2SE 1.2(1998年12月8日)
| first = Arun
* J2SE 1.3(2000年5月8日)
| url = https://aws.amazon.com/blogs/opensource/amazon-corretto-no-cost-distribution-openjdk-long-term-support/
* J2SE 1.4(2002年2月6日)
| date = 2018-11-14
* J2SE 5.0(2004年9月30日)
| accessdate = 2019-12-17}}</ref>
* Java SE 6(2006年12月11日)
*| Java SE 7(2011203071228日)
|-
* Java SE 8(2014年3月18日)
*| {{Version|o|Java SE 9(20179}} || 2017年9月21日) || OpenJDK 2018年3月 || {{n/a}}
|-
* Java SE 10(2018年3月20日)
| {{Version|o|Java SE 10}} || 2018年3月 || OpenJDK 2018年9月 || {{n/a}}
* 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|author=Chander|website=oracle.com|accessdate=September 26, 2018|archiveurl=https://web.archive.org/web/20180926093144/https://blogs.oracle.com/java-platform-group/introducing-java-se-11|archivedate=September 26, 2018}}</ref>
|-
* Java SE 12(2019年3月19日)
| {{Version|co|Java SE 11 (LTS)}} || 2018年9月 || Amazon Corretto 2024年8月以降も予定<ref name="Corretto2018"></ref>
* Java SE 13(2019年9月17日)
AdoptOpenJDK  2024年10月まで
* Java SE 14(2020年3月17日)
| 2026年9月
|-
| {{Version|o|Java SE 12}} || 2019年3月 || OpenJDK 2019年9月 || {{n/a}}
|-
| {{Version|o|Java SE 13}} || 2019年9月 || OpenJDK 2020年3月 || {{n/a}}
|-
| {{Version|c|Java SE 14}} || 2020年3月 || OpenJDK 2020年9月 || {{n/a}}
|-
| {{Version|p|Java SE 15}} || 2020年9月 || OpenJDK 2021年3月 || {{n/a}}
|-
| {{Version|p|Java SE 16}} || 2021年3月 || OpenJDK 2021年9月 || {{n/a}}
|-
| {{Version|p|Java SE 17 (LTS)}} || 2021年9月 || {{TBA}} || {{TBA}}
|-
| colspan="4" | <small>{{Version|l|show=111101}}</small>
|}
 
== Javaプログラミング例 ==
{{main|Javaの文法}}
 
=== アプリケーション(コマンドライン) ===
=== Hello World ===
<syntaxhighlight lang="java">
// Helloハローワールド.java
public class Hello {
public static void main(String[] args) {
135 ⟶ 183行目:
</syntaxhighlight>
 
*Javaプログラムでは全てのフィールド(変数)とメソッド(関数)が<code>'''class'''</code>内に記述される。
*Javaプログラムは静的メソッド<code>'''public void static main (String[] args)'''</code>から開始される。これはプログラムの中で一つだけ定義されるクラスメソッド(静的メソッド)である。<code>'''args'''</code>はJava実行環境から受け取るプログラム開始時パラメータであり、実行時のコマンドライン・パラメータ指定された文字列が渡される。
*<code>'''System.out'''</code>はSystemクラスのクラスフィールド(静的フィールド)であるoutを意味。outはPrintStreamクラスのインスタンスである。<code>'''out.println("文字列")'''</code>はoutによるprintlnメソッド呼び出しを指す。
 
=== サーブレット ===
<syntaxhighlight 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!");
}
}
</syntaxhighlight>
*'''<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の基本言語仕様は54種類程度に抑えたキーワードによって比較的コンパクトにまとめられている。Javaの構文はC++言語によく似たものであり、それよりも比較的平易化されている。従って以下のキーワードを眺めるだけでもJavaプログラミングの大まかなスタイルを掴むことができる。
{| class="wikitable"
! 類別 !! キーワード !! 説明
|-
| rowspan="5" align="center" | アクセス修飾子 || import || パッケージ名前空間の解決用
|-
| private || 同クラス内でアクセス可
|-
| package || 同クラス内と同パッケージ内でアクセス可、パッケージスコープの宣言
|-
| protected || 同クラス内と同パッケージ内と派生クラス内でアクセス可
|-
| public || 全範囲でアクセス可
|-
| rowspan="14" align="center" | クラス定義系 || abstract || 抽象クラス、抽象メソッド
|-
| class || クラス
|-
| enum || 列挙型
|-
| extends || スーパークラスの指定
|-
| final || クラスの継承不可、メソッドのオーバーライド不可、フィールドの定数化
|-
| implements || 実装するインターフェース
|-
| interface || インターフェース
|-
| native || そのメソッドは他言語コンパイルコードで実装される
|-
| static || 静的フィールド、静的メソッド、静的内部クラスはトップレベル扱いされる
|-
| strictfp || 指定クラス、指定メソッドで厳密な浮動小数点計算が行われる
|-
| synchronized || 同期用クラス、同期用メソッド、同期用ブロック
|-
| transient || 直列化から除外されるフィールド
|-
| void || 返り値無しのメソッド
|-
| volatile || そのフィールドは各スレッドからキャッシュ参照されない
|-
| rowspan="12" align="center" | 制御構文系 || break || ループ脱出
|-
| case || パターンマッチ項目
|-
| continue || ループ起点回帰
|-
| default || パターンマッチ外
|-
| do || 無条件ループ起点
|-
| else || 条件式の偽側フロー
|-
| for || 初期値定義と周回毎値変化で修飾された条件式ループ
|-
| if || 条件式の真側フロー
|-
| instanceof || インスタンスの実行時型チェック
|-
| return || メソッドの評価終了
|-
| switch || パターンマッチ起点
|-
| while || 条件式ループ
|-
| rowspan="6" align="center" | 例外処理系 || assert || 条件式が偽ならプログラム中断
|-
| catch || 例外パターン捕捉
|-
| finally || 例外デフォルト捕捉
|-
| throw || 例外発生
|-
| throws || そのメソッドで発生する例外候補
|-
| try || 例外発生ブロック
|-
| rowspan="11" align="center" | 基本値系 || boolean || 真偽値
|-
| byte || 8ビット値
|-
| char || 文字表現用16ビット値
|-
| double || 64ビット浮動小数点
|-
| float || 32ビット浮動小数点
|-
| false || 偽値
|-
| int || 符号付き32ビット値
|-
| long || 符号付き64ビット値
|-
| short || 符号付き16ビット値
|-
| true || 真値
|-
| null || ヌルポインタ
|-
| rowspan="3" align="center" | 参照値系 || super || スーパークラスのインスタンス
|-
| this || カレントクラスのインスタンス
|-
| new || インスタンスの生成
|-
| rowspan="2" align="center" | 予約語 || goto || 使用できない
|-
|const
|使用できない
|}
== Javaプラットフォーム ==
{{Main|Javaプラットフォーム}}
177 ⟶ 310行目:
; [[Java Platform, Enterprise Edition]] (Java EE) / Jakarta EE
: サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。
: 2017年9月にOracle社は今後のJava EEのバージョンアップグレードが[[Eclipse Foundation|エクリプス財団]]によって行われる事を発表した<ref>{{Cite web|url=https://blogs.oracle.com/theaquarium/opening-up-ee-update |title=Opening Up Java EE - An Update |date=2017-09-12 |publisher=Oracle |language=en |accessdate=2019-03-10}}</ref><ref>{{Cite web|url=https://www.infoq.com/jp/news/2017/11/towards-java-EE-at-eclipse |title=EE4J、EclipseファウンデーションがオープンソースJava EEを準備 |date=2017-11-16 |publisher=InfoQ |language=ja-jp |accessdate=2019-03-10}}</ref>。JavaEEの収益性低下と[[クラウドコンピューティング]]技術への対応急務がその背景にあったとされる。Java EEの商標は現行版のサポートを続けるOracle社が保持したので、エクリプス財団による今後のバージョンは'''Jakarta EE'''の名称で公開される事になった<ref>{{Cite web|url=https://www.infoq.com/jp/news/2018/03/java-ee-becomes-jakarta-ee |title=Java EE は Jakarta EE となる |date=2018-03-05 |publisher=InfoQ |language=ja-jp |accessdate=2019-03-10}}</ref>。
; [[Java Platform, Micro Edition]] (Java ME)
: [[組み込みシステム]]、[[マイクロコントローラ]]向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
252 ⟶ 385行目:
*[[Eclipse (統合開発環境)|'''Eclipse SDK''']] - [[IBM|IBM社]]→[[Eclipse財団]]。オープンソースIDE。Java用IDEの共通基盤存在である。ここからWebSphere Studio、JBuilderなど様々なIDEが派生している。[http://www.eclipse.org/ eclipse.org(英語)] [http://eclipsewiki.net/eclipse/ EclipseWiki(日本語)]。
*'''WebSphere Studio''' - IBM社。商用IDE。Eclipseに有料プラグイン機能を組み合わせたもの<ref>{{Cite web|url=https://tech.nikkeibp.co.jp/it/members/ITPro/J2EE/20031030/1/|title=EclipseとWebSphere Studioはどう違うのか {{!}} 日経 xTECH(クロステック)|accessdate=2019-11-17|publisher=Nikkei Business Publications, Inc.|author=星 暁雄=日経BP Javaプロジェクト|website=日経 xTECH(クロステック)|date=2003-10-31}}</ref>。現在はアップデート停止。[http://www.ibm.com/jp/software/websphere/ft/studio/index.html WebSphere開発ツール]。
*'''{{仮リンク|IBM Rational Application Developer for WebSphere Software|en|Rational Application Developer}}''' - 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]。