「Java」の版間の差分
削除された内容 追加された内容
Goldensundown2 (会話 | 投稿記録) |
|||
(6人の利用者による、間の44版が非表示) | |||
17行目:
|designer = [[Java Community Process]]
|developer = [[オラクル (企業)|オラクル]]([[サン・マイクロシステムズ]])
|latest release version = Java Standard Edition
|latest release date = {{release date|2019|
|型付け = 強い[[静的型付け]]
|プラットフォーム = [[Solaris]], [[Linux]], [[Microsoft Windows|Windows]],<br>[[macOS]], [[AIX]], [[i5/OS|System i]],<br>各種の[[組み込みシステム]]ほか多数
29行目:
}}
{{プログラミング言語}}
'''Java'''(ジャバ)は、狭義では[[プログラミング言語]]のJavaを指し、広義ではJava言語を中心にした[[プラットフォーム (コンピューティング)|コンピューティング・プラットフォーム]]を意味する<ref>{{Cite web|url=https://www.java.com/en/download/faq/whatis_java.xml |title=What is Java and why do I need it? |language=en |accessdate=2019-02-04}}</ref>。後者はJavaプラットフォームと呼ばれ
Java
Javaは、1995年に[[サン・マイクロシステムズ]]によって公開された。2010年にサンは[[オラクル (企業)|オラクル]]に吸収合併され、Javaの各種権利もオラクルに移行した。おおよそ数年おきに言語仕様の改訂が重ねられており、2019年
==
{{独自研究|section=1|date=2019年3月}}
{{正確性|section=1|date=2019年3月}}
{{出典の明記|section=1|date=2019年3月}}
Javaは5つの方針に基づいて開発された<ref>{{Cite web|url=https://www.oracle.com/technetwork/java/intro-141325.html |title=The Java Language Environment |accessdate=2019-04-24}}</ref>。これらはJavaテクノロジの中枢となる[[仮想マシン]]に向けられたものでもあるが、言語仕様にも大きく反映されている。
# シンプルで、[[オブジェクト指向プログラミング|オブジェクト指向]]で、見慣れたものにする(''simple, object-oriented, and familiar'')
# 堅牢で安全にする(''robust and secure'')
#[[プラットフォーム非依存]]で、[[移植 (ソフトウェア)|移植]]を容易にする(''architecture-neutral and portable'')
# 高いパフォーマンスで動作する(''to execute with high performance'')
#[[インタプリタ|インタプリタ式]]で、[[スレッド (コンピュータ)|スレッド式]]で、動的([[最適化 (情報工学)|最適化]])にする(''interpreted, threaded, and dynamic'')
Javaの言語仕様は、[[C++]]のそれから堅牢性を損ねる部分を取り除いたものと考える事が出来る。[[ポインタ (プログラミング)|ポインタ]]、直アドレスの[[インスタンス]]と[[配列]]、[[テンプレート (プログラミング)|テンプレート]]、[[演算子オーバーロード]]、[[goto文]]などが破棄された。[[例外処理]]構文は保持され使用が推奨された。プログラム構文の基本となる演算式と[[制御構文]]もC++と類似のものである。
'''変数の在り方'''
: Javaの全[[インスタンス]]は実体データを指す参照値(アドレス)に統一されている。[[配列]]は特殊なインスタンスとなっており、[[文字列]]も自動的にインスタンスとなった。これによって特に[[引数]]と返値の受け渡しに混乱が無くなり堅牢性も増した。非参照インスタンスを自動解放する[[ガベージコレクタ]]が導入されたので、メモリ管理の不要に伴うプログラムの簡素化と堅牢さも促進された。なお、8bitから64bitまでの数値を収納するデータは[[変数 (プログラミング)|直アドレス変数]]となっているが、そのアドレスを扱う事は出来ない。
'''型定義と関数の在り方'''
:[[テンプレート (プログラミング)|テンプレート]]([[ジェネリックプログラミング|ジェネリクス]])と[[演算子オーバーロード]](+[[関数オブジェクト]])を除外した事は同時に、データ型とメソッド呼出の認識を厳格化し、利便性よりも堅牢性を重視するという方針を示す事になったが、後年にはパラダイムシフトが発生している。比較的早期にコレクションクラスを対象にした[[ジェネリックプログラミング|ジェネリクス]]類似の構文が導入されている。後年のJava 8では[[無名関数|ラムダ式]]、[[型推論]]、メソッド参照、ストリームといった[[関数型プログラミング]]由来の構文が導入され、特に細部の実装に適用された事によりJavaの方向性は大きく変化したと言える。
'''オブジェクト指向の在り方'''
: オブジェクト指向は[[C++]]と同様の[[クラス (コンピュータ)|クラス]]のメカニズムに基づく仕様から[[多重継承]]が取り除かれ、無名クラスの構文が追加されている。後者は[[プロトタイプベース]]オブジェクトの取り扱いに近い利便性を実現した。[[カプセル化]]はソースコード単位がデフォルトの緩やかなもので利便性が優先されている。Javaの[[多態性]]の中心は[[仮想関数]]であり、その集合体である''interface''構文が専門に用意されている。''interfaceは[[継承]]と区別されて多重に[[派生型|実装]]できる。''また堅牢性を重視しながらも動的な[[型システム|型比較]]と[[型変換|型キャスト]]と[[リフレクション (情報工学)|リフレクション]]が備えられており、動的な多態性の実現が優先されている。上述二点の多態性の背景には[[分散コンピューティング]]の重視があり、その実現をサポートする[[ネットワーク・コンピューティング|ネットワーク]]機能と[[Java Remote Method Invocation|リモートメソッド]]および[[Common Object Request Broker Architecture|CORBA]]のAPIも充実している。
'''スレッドの在り方'''
: Javaでは[[スレッド (コンピュータ)|スレッド]]ベースの[[並行コンピューティング]]が重視されている。全てのインスタンスに[[同期 (計算機科学)|同期用]]の[[ロック (情報工学)|ロック機能]]が備えられているのでイメージ的にオブジェクト単位の[[排他制御]]の実装が容易となっており、オブジェクト指向との協調が図られている。これは仮想マシン組み込みの''synchronized''構文で用いられるが、その他にも様々な[[同期 (計算機科学)|同期用]]APIが揃えられている。スレッド資源の制約を解決する為にタスクの仕組みを併せた[[モニタ (同期)|モニタ]](''Executor)の技法''が導入されている。[[ロック (情報工学)|ロック手法]]には[[ミューテックス]]、[[セマフォ]]、バリア、読み書きロック、イベント(''CountDownLatch'')が揃えられており[[排他制御|排他制御手法]]の選択肢も広い。また[[アトミック操作]]をサポートするAPIも揃えられている。
'''堅牢性から利便性へ'''
: Javaの予約語は少なくAPIは膨大であり、シンプルで応用性に富んだ言語仕様と見る事が出来る。基礎部分を簡素化して残りをアドオン的にする設計は、Javaの主眼である[[マルチプラットフォーム|マルチプラットフォーム性]]を実現する為でもあった。加えてJava仮想マシン上でのプログラム実行は基礎レベルからの堅牢性とセキュリティを実現した。公開初期と比べたJavaの方向性は大きく変化している。[[ポリモーフィズム|動的多態性]]、[[分散コンピューティング|分散処理]]、[[並行処理]]、[[ジェネリックプログラミング|総称型構文]]、[[関数型プログラミング|関数型構文]]の拡張ないし追加が示すものは柔軟性(''flexible'')と利便性(''utility'')の追求であり、結果的に堅牢性(''robust'')を旨としたJavaの哲学に優越した。
== Javaの特徴 ==
=== オブジェクト指向 ===
77 ⟶ 98行目:
[[画像:SwingSet.png|thumb|Java [[Swing]][[グラフィカルユーザインタフェース]] (GUI) の[[Look and feel|ルックアンドフィール]]は、[[プラットフォーム (コンピューティング)|プラットフォーム]]に依存しない]]
-->
Javaでは[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存を目標の一つとし、またバージョン間の[[互換性]]に注意して開発が進められている。プラットフォームに依存しない(Javaプラットフォーム自体を除く)[[アプリケーションソフトウェア]]の開発と配備を行うことができると主張される。従来の[[プログラミング言語]]の多くはプラットフォーム([[CPU]])に依存したネイティブなコードに[[コンパイラ|コンパイル]]することを前提として設計されていたが、Javaはこうした言語と異なり、[[中間言語]]([[バイトコード]])にコンパイルされ、[[Java仮想マシン]]で実行されるよう設計された([[pコードマシン]]など、過去にもあったものだが、なぜか新しいものであるかのように宣伝される<sup class="noprint Template-Fact">[''[[Wikipedia:「要出典」をクリックされた方へ|要出典]]'']</sup>)。性能向上のため、Java仮想マシンの成熟した実装では多くの場合、[[ジャストインタイムコンパイル方式]]が使われる。プラットフォーム非依存とバージョン間の互換性の目標は、完全に達成できたわけではなく課題が残っている。
[[プラットフォーム (コンピューティング)|プラットフォーム]]非依存とは、Javaの[[プログラム (コンピュータ)|プログラム]]がさまざまな[[ハードウェア]]や[[オペレーティングシステム]]上で必ず同じように動く、ということを意味する。一度Javaのプログラムを作成すれば、そのプログラムはどのプラットフォーム上でも動くのである。{{いつ範囲|date=2019年2月|近年}}では、Java実行環境を構成するJava仮想マシンに高速化の技術が導入され、プラットフォームに依存したプログラムと同水準の実行性能を実現している。
Javaのプラットフォーム非依存性は、次のようにして実現されている。
108 ⟶ 131行目:
しかし、Javaのプラットフォーム非依存性は、[[サーバ]]側や[[組み込みシステム]]のアプリケーションに関しては成功を収めている。サーバ側 ([[Java Platform, Enterprise Edition|Java EE]]) では、Java の[[Java Servlet|サーブレット]]、[[Webサービス]]、[[Enterprise JavaBeans|EJB]] (Enterprise JavaBeans) などの技術が広く使われている。組み込みシステムの分野においても、組み込みシステム向けの Java環境 ([[Java Platform, Micro Edition|Java ME]]) を使った[[OSGi]]を基にした開発が広く行われている。
===
Javaではその前身であるGreenOS用言語およびOakと呼ばれていた頃にあたる、主に家電機器向け組込システムへの普及を目指していた初期の段階から、スレッド式(''threaded'')を基底要素にして設計されていた。組込システム開発では主に2~4タスクによる並行処理が要望される状況が頻出しており、大抵はシングルタスクでも実装可能なコルーチンによる交互切り替えフローで対応される事が多かった。家電機器の高機能化に伴うマルチタスク環境のニーズ増加を予測したサン社のプロジェクトチームは、その組み込み分野におけるシェア独占を目指してマルチスレッド機能の標準配備を、プログラミング言語と仮想マシン設計における重要課題としていた。初期バージョンにおけるJavaのスレッドは、仮想マシンソフトウェア上のユーザー空間で走行される純粋なユーザースレッドとして実装された。一台のJava仮想マシンの実行は一つのプロセスとなり、Javaのプロセスは始めから複数スレッド(糸)の寄り合わせとして設計されていた。この高度なネイティブスレッド・エミュレート技術は注目を集め、その開発チームの名に因んだグリーンスレッドという名称を確立し、ランタイムライブラリ及び仮想マシン上で走行されるマルチスレッドの代名詞となった。グリーンスレッドは公開初期においては、例えばLinuxのネイティブスレッドよりもやや軽量なパフォーマンスを発揮した。組み込みシステム向けのJava仮想マシンでは基本的にこのグリーンスレッドが標準仕様となり続けている。しかし、パソコンやサーバーマシン用の各OSの間で、マルチコアCPUの特性を活かして設計された更に軽量なネイティブスレッドが一般的になると、グリーンスレッドのパフォーマンスは明確に見劣りするようになった。やむなく開発チームはグリーンスレッドを順次廃止し、JavaのスレッドをOSが提供するネイティブスレッド上で走行させるように設計変更した。これはやや苦汁の決断だったようで、特に並行処理同期=排他制御を多用するJavaプログラムにおいては、この時点からプラットフォーム非依存性に対する問題が生じるようになったと言われる。
Javaの同期(''synchronization'')設計の特徴としては、全てのインスタンスにロックオブジェクト機能を持たせてる事が挙げられる。このロックは''synchronized''キーワードで示される標準同期構文で使用される。標準同期はJava仮想マシン内包仕様であり、機能的にはミューテックスに相当する。''synchronized''修飾子を付加された各メソッドはその全体が排他制御エリアとなり、呼び出し時はデフォルト的にthisインスタンスからロックを取得するので、イメージ的にオブジェクト(=インスタンス)単位となる排他制御が容易に実装できた。このロック普遍化はオブジェクト指向との協調を明確に表現した設計と言える。''synchronized''クラスメソッドの方は、システム内に存在するクラスオブジェクトからロック取得を試みるので、これもイメージ的に同種オブジェクト(同属性インスタンス)共通の同期と排他制御を表現できた。また、''synchronized()''定義子の波括弧で任意のコード部分を括る事により、メソッド内に部分的な排他制御エリアを設ける事が出来る。ここではthis以外のインスタンスもロックオブジェクトに指定出来るので多様な同期が可能となった。上述の排他制御エリアの仕組みは基本的に入口でロックを取得し、出口でロックを解放するものである。ロックが取得出来なかったら待機キューに入れられる。再入可能(リエントランス)に設計されているので再帰アルゴリズムなどで一度ロックを取得したスレッドが再び入口を通る時はそのまま素通りする。エリア内からのメソッドリターンは同時に出口通過と見なされてロックを解放する。ただしエリア内ですでにロック解放(''notify'')を行っている場合はそのまま脱出する。エリア内では任意位置での待機キュー入り(''wait'')も可能で同時にそこでロックも解放される。状態異常発生時は各スレッドに例外を投げて待機キューから強制脱出させる事も出来る。この標準同期は、組み込みシステムやさほど複雑でないアプリケーションの実装をほとんどカバー出来るものと言える。またこのミューテックス相当の機能は様々に応用可能でもある。しかし、実際にカウントセマフォやバリアや読み書きロックなどを再現しようとすると余計なワンステップを必要としがちなので、それらのロック手法は専用のAPIで用意されている。
スレッドはその性質ごとにスレッドグループにまとめる事が出来て同時に様々な一括操作も可能となっている。これはクライアント・サーバーシステムの実装でよく用いられる。また膨大な数の断続的トランザクションをさばくシステムにおいて発生しがちなスレッド生成と破棄の繰り返しによる負荷増大を解決する為の、スレッドプールとタスクキューを併せたいわゆるモニタの技法を提供するAPIも用意されている。
=== ガベージコレクション ===
{{see also|ガベージコレクション}}
Javaでは簡潔なメモリモデルを採用しており、[[プログラマ]]がメモリ([[主記憶装置]])を管理する負担を軽減する。あらゆるオブジェクトはメモリ内の[[ヒープ領域|ヒープ]]という領域に割り当てられる。メモリ管理は、[[Java仮想マシン]]に統合された[[ガベージコレクション]]の機能によって行われる。従来のオブジェクト指向プログラミング言語である[[C++]]では、ヒープ領域に生成したオブジェクトについて、もはや必要が無くなった時に破棄する指示を、プログラマが自分で責任をもって行わなければならなかった。これは、C++プログラマにとっては負担が大きく複雑で間違えやすい作業であり、ソフトウェアの安全性・開発効率・保守性を損なう要因だった。Javaではガベージコレクションの機能があるため、このようなことは無く、プログラマの負担は大きく軽減される。
[[ガベージコレクション]]機能を備えた事により、これを備えていない従来の多くの言語と比較して、プログラムの開発生産性と安定性が高く、[[プログラマ]]の負担が完全に解消されるわけではないものの、大きく軽減される。{{いつ範囲|date=2019年2月|近年}}のJavaでは[[世代別ガベージコレクション]]というより効率的な技術を導入している。
ガベージコレクションを備えていない[[C++]]などの言語の場合、プログラマが適切にメモリの管理をしなければならない。[[オブジェクト指向プログラミング]]において、[[オブジェクト (プログラミング)|オブジェクト]]を格納する領域をメモリ内の[[ヒープ領域]]に動的に割り当てた場合([[動的メモリ確保]])、そのオブジェクトがもはや必要なくなった場合に、プログラマは必ず明示的にオブジェクトを削除する指示を記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならない。メモリ管理が不適切なプログラムでは、[[メモリリーク]]が発生する可能性がある。メモリリークとは、プログラミングミスなどにより、解放されなかったメモリ領域が累積していき、利用できるメモリの量が減っていくことであり、気付かないうちに大量のメモリを消費してしまう問題が起こり得る。他にも、メモリ領域を解放する際に、解放の指示を重複して行ってしまい、プログラムの実行を不安定にするなどのケースがあり、悪くすると異常終了してしまうこともある。
131 ⟶ 160行目:
ガベージコレクションの機構は、Java仮想マシンに組み込まれており、開発者からは、事実上隠蔽されている。開発者は、場合にもよるが、ガベージコレクションがいつ起こるか意識しなくて良い。というのも多くの場合、ガベージコレクションの実行は、プログラマが自分で書いたコードによって明示的に起こる何らかの挙動と、必ずしも関連しているわけではないからである。
=== ネットワーク
Javaでは充実した[[
*[[ファイル転送プロトコル|FTP]]([[ファイル (コンピュータ)|ファイル]]送受信)
*[[Hypertext Transfer Protocol|HTTP]]([[World Wide Web|ウェブ]]によるデータ送受信)
144 ⟶ 174行目:
=== セキュリティ ===
Java
*[[Java仮想マシン]]の[[バイトコード]]検証機能により、Javaの実行コードであるバイトコードが正しいかどうかを検査する。
*Java実行環境の[[クラスローダ]]機能により、[[クラス (コンピュータ)|クラス]](バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査する。
150 ⟶ 181行目:
*Java実行環境の既定の設定では、遠隔のコンピュータ上にある実行コード(Javaアプレット)に対して、ローカルにあるファイル等へのアクセスや、アプレットのダウンロード元以外の遠隔コンピュータとの通信を禁止している。
===
Javaは[[例外処理]]の構文を備えている。これは制御フローの一種であり、例外想定ブロック内の実行中に状態異常が発生すると例外オブジェクトが生成されて、その宛先となる例外捕捉ブロックに強制ジャンプするという仕組みを指す。これは「例外を投げる」と形容されている。例外捕捉ブロックでは、渡された例外オブジェクトの情報に基づいた任意の処理を行った後に例外ブロックを抜ける事になった。
例外処理は様々なコード局面での使用が推奨されたが、例外発生後のコードが全スキップされるというフロー上の性質から例外想定ブロック内のコード行数は比較的少ないものとなり、それら例外ブロックの断続的な羅列は却ってソースコードの可読性低下にも繋がった。例外処理による堅牢性と、コーディングレベルでの利便性および実用性は様々な部分でマッチしなかったとも言える。また、実行中の多方面に影響が及ぶような致命的な例外ほど、単純な例外ブロックの記述では対応しきれず、細部の例外ブロックから更に大枠の例外ブロックへ飛ぶというような大胆なジャンプを頻発させてプログラムの把握が難しくなるという欠点もあった。結果的に例外処理は、入出力機能の呼び出しなど決まりきった状態異常の発生部分では積極的に用いられるが、それ以外ではコーディングの頻雑さに勝るだけの有用性がそれほど認められていないのが実情となっている。
=== その他 ===
Javaは「[[パッケージ (Java)|パッケージ]]」という[[名前空間]]を持つ。これはクラスとインタフェースを文字列レベルで分類し、またクラス名定義の衝突を回避するための機能である。パッケージ名は任意の数だけピリオドで繋ぐことができる。同時にこれはパッケージの階層構造を表現できる。パッケージの実体はクラス名に付ける接頭辞の羅列であり、その接頭辞文字列によってクラス名をユニークなものにしている。プログラミングの際はソースコード冒頭に、フルパス先頭から任意の数だけ指定したパッケージ名以降をワイルドカード化し、そのパッケージ内のクラスをデフォルト指定できるので短いコード記述が可能となる。
== Javaの歴史 ==
{{更新|date=2018年9月|section=1}}
348 ⟶ 380行目:
==== J2SE 5.0 (2004年9月30日) ====
コードネームTiger。[http://www.jcp.org/en/jsr/detail?id=176 JSR 176] のもとで開発された。J2SE 5.0 では、言語仕様に大きく拡張が加えられ、多くの新しい言語機能が追加された<ref>{{cite press|url=http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html |title=Sun Ships New Version of Java Platform |publisher=Sun Microsystems |language=en |accessdate=2006-07-08 |deadlinkdate=2019-03-04 |archiveurl=https://web.archive.org/web/20050215094036/http://www.sun.com/smi/Press/sunflash/2004-09/sunflash.20040930.1.html |archivedate=2005-02-15}} </ref><ref>{{cite web|url=https://docs.oracle.com/javase/jp/1.5.0/relnotes/features.html |title=J2SE(TM) 5.0 の新機能 |language=ja-jp |accessdate=2006-07-08}}</ref>。もともとは J2SE 1.5 という名称だったが、この名称はすでに内部的なバージョン番号として使われていた<ref>{{Cite web|url=https://docs.oracle.com/javase/1.5.0/docs/relnotes/version-5.0.html |title=Version 1.5.0 or 5.0? |language=en |accessdate=2006-07-08}}</ref>。またマーケティング上の理由もあった。
* [[総称型]] ([[ジェネリ
* [[オートボクシング]]/オートアンボクシング : <code>int</code>型のような[[プリミティブ型]](primitive type)と{{Javadoc:SE|java/lang|Integer}}クラスのような[[プリミティブラッパークラス]]の間の変換が自動的に行われるようになった。[http://www.jcp.org/en/jsr/detail?id=201 JSR 201]で規定。
* [[列挙型]] : <code>enum</code>キーワードにより、Javaで安全な[[列挙型]]を実現する[[デザインパターン (ソフトウェア)|デザインパターン]]であるタイプセーフenum[[デザインパターン (ソフトウェア)|パターン]]が言語レベルでサポートされ、列挙型(順序つきリストの値、多くの場合は定数)を安全に定義することができる{{efn|このタイプセーフenumパターンの詳細は、{{Cite book|title=Effective Java Programming Language Guide |author=Joshua Bloch |authorlink=ジョシュア・ブロック |year=2001 |pages=97-106 |chapter=第5章 項目21 enum構文をクラスで置き換える}}を参照。}}。以前のバージョンまではこのような場合、タイプセーフではない整数の定数値で定義するか、[[プログラマ]]が自分でタイプセーフenumパターンで実装するかの、どちらかの方法しか無かった。[http://www.jcp.org/en/jsr/detail?id=201 JSR 201]で規定。
418 ⟶ 450行目:
==== 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の商用利用は有償サポート契約を結んだ顧客のみとなっている。
==== JSR 386にて仕様が規定され、[[2019年]]3月19日にリリースされた。Unicode 11がサポートされている。
== Java言語の構文 ==
{{main|Javaの文法}}
構文は、[[C言語|C]]および[[C++]]から多くを引き継いでいる。このため、設計当時には割合として多かった、CやC++しか書けない[[プログラマ]]にも習得しやすいと、{{要出典範囲|date=2017年10月|メーカーや信者は宣伝した}}。Javaが設計された1990年代中旬以前は、Cのプログラマが多く、また[[オブジェクト指向プログラミング言語]]の中では、[[C++]]は広く使われてきた言語の一つだった。なお、JavaではC++と違って名前空間レベルの関数(メソッド)および変数(フィールド)の宣言および定義を許可しておらず、必ず何らかのクラス定義の中に記述することが特徴である。この特徴は後発の[[C Sharp|C#]]も踏襲している。
次の節以降では、[[Hello world]][[プログラム (コンピュータ)|プログラム]]で、Javaプログラムの例を示して説明する。Hello worldプログラムとは、"Hello, world" という文字列をディスプレイなどの出力装置に出力する簡単なソフトウェアプログラムである。プログラミング言語の初学者向けのプログラム例としてよく使われる。なお先に述べた通り、Javaには複数の実行形態があると考えることができるので、以降では、それぞれの実行形態におけるHello worldプログラムを例示する。
=== スタンドアロン(コマンドライン) ===
[[キャラクターユーザインタフェース|コマンドライン]]環境で動く[[スタンドアローン|スタンドアロン]]の[[Javaアプリケーション]]の例を示す。Javaでは、他のプログラミング言語と同様に、コマンドライン環境で動く[[プログラム (コンピュータ)|プログラム]]を簡単に開発できる。
<source lang="java">
// Hello.java
434 ⟶ 473行目:
</source>
このプログラムについて説明する。
*Javaのプログラムではすべてを<code>'''class'''</code>内に記述する。コマンドラインのスタンドアロンアプリケーションの場合も同じである。
*[[ソースコード]]の[[ファイル (コンピュータ)|ファイル]]名は、そのファイルで記述している[[クラス (コンピュータ)|クラス]]の名前に ".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に記述する方法もある。
=== スタンドアロン(GUIアプリ) ===
579 ⟶ 623行目:
{{独自研究|section=1|date=2019年3月}}
{{Main|Javaプラットフォーム}}
Javaプラットフォーム(''Java Platform'')は、Javaプログラムを開発または実行する為のソフトウェア群の総称であり、より具体的に言うと{{独自研究範囲|'''Java実行環境'''(JRE)と'''Java開発キット'''(JDK)と'''
=== エディション ===
{{いつ範囲|date=2019年3月|現在}}、Java
; [[Java Platform, Standard Edition]] (Java SE)
: スマートフォンやタブレットを含むパーソナルコンピュータ
; [[Java Platform, Enterprise Edition]] (Java EE) / Jakarta EE
: サーバーマシン、ワークステーション向けである。スタンダード版に加え、WEBサーバー及び多層クライアントサーバーや業務用システムを開発する為の、様々な拡張技術クラスライブラリ&APIが追加されている。業務用プロフェッショナル仕様であり大規模である。プロファイルとしてWeb開発者向けの「Web Profile」が存在する。
: 2017年9月
; [[Java Platform, Micro Edition]] (Java ME)
: [[組み込みシステム]]、[[マイクロコントローラ]]向けである。コンピュータ資源が制限されている集積回路や電子機器に対応した特定技術仕様であり、専用のクラスライブラリ&APIも用意されている。Java仮想マシンも比較的コンパクトにまとめられている。
605 ⟶ 642行目:
{{Main|Java Runtime Environment}}
Java実行環境 (''Java Runtime Environment'') は、Javaアプリケーションを実行するために必要なソフトウェアである。'''[[Java仮想マシン]]'''(''Java Virtual Machine'')と、<nowiki>''</nowiki>Java.exe<nowiki>''</nowiki>を始めとする様々な'''スターター'''
;Javaクラスライブラリ
615 ⟶ 650行目:
# 基礎ライブラリ - Java言語仕様の基礎を扱う。
# 入出力ライブラリ - ファイル入出力など。
# データコレクションライブラリ - 配列の操作と
# 数学ライブラリ - 各種計算。
# 国際化地域化ライブラリ - 暦、日付、時間、通貨、文字コードなどの[[国際化と地域化]]を扱う。
644 ⟶ 679行目:
{{main|Java Development Kit}}
Java開発キット (''Java Development Kit'') は、Javaプログラムを開発するための基本的なソフトウェアである。[[Javaコンパイラ|コンパイラ]]、デバッガ、アーカイバ、ソフトウェアモニター、ドキュメントジェネレーターなどの'''基本開発ツール'''と、様々な'''開発支援ツール'''と、'''Java API'''(''Java Application Programming Interface'')で構成されている。前述のエディションによって開発ツール内容とAPI構成に違いがある。Java開発キットの呼称はこれまでに何度か変更されている。
*J2SE 1.2.2_004 までは、JDK(''Java Development Kit'')と呼んでいた。
653 ⟶ 688行目:
;Java API
APIは、
# java.lang - Java言語仕様の基礎を扱う。
# java.io - ファイル入出力など。
# java.util - 配列の操作と
# java.math - 各種計算。
# java.text - 暦、日付、時間、通貨、文字コードなどの国際化と地域化を扱う。
688 ⟶ 723行目:
*'''[[Apache Ant]]''' - Javaアプリケーションのビルドツール。[[Apacheソフトウェア財団]]のプロジェクトによって開発された。コンパイル、[[バージョン管理システム]]との連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。[[make]] と同種のツールであり、[[Extensible Markup Language|XML]]ファイルにビルドの規則を記述する。Java 以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。
*'''[[Apache Maven]]''' - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。
*'''[[Gradle]]''' - [[Apache Ant]]や[[Apache Maven]]のコンセプトに基づくオープンソースビルド自動化システム。
*'''[[JUnit]]''' - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。[[xUnit]]の一種である。[[テスト駆動開発]]を支援する。
=== 様々なJava
<!--================================================================================
ここには、Java Community Process のもとで開発された拡張機能と関連技術のみを記述します。
=================================================================================-->
*[[Java Naming and Directory Interface|JNDI]] (Java Naming and Directory Interface) - ネーミングサービス
* JSML (Java Speech Markup Language) - [[音声合成]]システムにテキストの注釈を追加する
*[[JDBC]]<!--(Java Database Connectivity)--> - [[データベース]]接続の API
702 ⟶ 738行目:
*JAI (Java Advanced Imaging) - 画像を扱うための高水準なオブジェクト指向 API
*JAIN (Java API for Integrated Networks) - 統合された通信ネットワークの API
*JDMK (Java Dynamic Management Kit) - JMX仕様に基づいた
*Jini - 分散システムを構築するネットワークアーキテクチャ
*Jiro - 分散した記憶装置を管理する技術
*JavaSpaces - 分散環境でJavaオブジェクトの送受信・永続化などを支援する技術
*JML (Java Modeling Language) - [[契約による設計|契約による設計(DbC)]]
*JMI (Java Metadata Interface) - Javaのメタデータの作成・アクセス・検索・送受信に関する仕様
*[[Java Management Extensions|JMX]] (Java Management Extensions) - 分散オブジェクト環境における
*[[JavaServer Faces|JSF]] (JavaServer Faces) -
*[[Java Native Interface|JNI]] (Java Native Interface) -
*[[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]]
*[[OSGi]] - サービスの動的な管理と遠隔保守<!--
*Java Media APIs [http://java.sun.com/products/java-media/](リンク切れ?) - java.media - マルチメディア向けAPI--><!--
*Shared Data ToolkitSound-->
*[http://community.java.net/javadesktop/ JavaDesktop]
*[[JavaOne]]
*[[BD-J|Blu-ray Disc Java]]
*[[FindBugs]] - javaソースコードからコーディングレベルのバグを発見する開発支援ツール。
=== Javaテクノロジの標準化 ===
{{Main|Java Community Process}}
Javaプラットフォーム
*[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=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)
738 ⟶ 770行目:
*[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=244 JSR 244] ''Java EE 5 Specification'' (Java EE 5)
*[http://www.jcp.org/en/jsr/detail?id=901 JSR 901] ''Java Language Specification'' (J2SE 5.0)
772 ⟶ 800行目:
JSmoothなどは、Java実行環境が無い時はそれも自動インストールする機能を備えている。また、純粋なJava実行環境では不可能だったタスクアイコンを表示させる機能も備えている。
<!-- ただし、これらのツールには最新の[[JDK]]でコンパイルされた[[jar]]ファイルには対応していないなどの欠点もある上、{{いつ範囲|date=2019年2月|近年}}の [[Microsoft Windows|Windows]] にはほとんどにJavaがインストールされているため、あまり普及していない。 -->
== Java認定資格 ==
803 ⟶ 811行目:
! 資格名 !! レベル !! 対象バージョン
|-
| Java Foundations Certified Junior Associate || <span style="display:none">0</span>Junior Associate || {{
|-
| 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>。}} || <span style="display:none">0</span>Bronze || Java SE 7/8
830 ⟶ 838行目:
=== 注釈 ===
{{Reflist|group=注釈}}
=== 出典
{{reflist|2}}
847 ⟶ 855行目:
{{Commonscat|Java (programming language)}}
*[[Javaの文法]]
*[[キーワード (Java)|Javaのキーワード (予約語)]]
*[[Javaの性能]]
*[[
*[[C SharpとJavaの比較|C♯とJavaの比較]]
*[[Java仮想マシン]]
*[[Javaコンパイラ]]
*[[Java Community Process]] - Java技術の標準化プロセス
== 外部リンク ==
|