読み込み中...Java(ジャバ)は、狭義ではオブジェクト指向プログラミング言語Javaであり、広義ではプログラミング言語Javaのプログラムの実行環境および開発環境をいう。このJavaプログラムの実行環境と開発環境(広義のJava)は、Javaプラットフォームとも呼ばれる。
組み込みシステムや携帯機器(携帯電話・PHSやPDA・スマートフォン等)のシステムから、企業の情報システムを担う大規模なサーバやスーパーコンピュータまで、非常に多くの分野で活用されている。
プログラミング言語JavaおよびJavaプラットフォームは、1990年代前半にサン・マイクロシステムズ社でジェームズ・ゴスリンなどの人々によって開発された。現在はJava技術の標準化作業は、Java Community Process(JCP)というプロセスを経て行われている。
Javaに関わる呼称とその意味内容は、文脈に応じていくつか使い分けられている。サン・マイクロシステムズは、「Javaテクノロジ」(Java技術、Java technology) という呼称を使い、一方でJavaのさまざまな技術の形容詞として「Java」の呼称を使ってきた。多くのプログラマは、プログラミング言語の意味で「Java」の呼称を使っている。Javaの実行環境は、Java実行環境(Java Runtime Environment; JRE)と呼ばれる。Javaの基本的な開発環境は、Java開発キット(Java Development Kit; JDK)と呼ばれる。
Javaはクラスベースのオブジェクト指向プログラミング言語である (#オブジェクト指向プログラミング)。Javaのプログラムは複数のクラスから構成され、プログラムの実行は、各クラスが実体化したオブジェクト群が相互にメッセージをやりとりしながら行われる。Javaでは、継承については実装の単一継承を採用している。ただし一つのクラス(オブジェクト)は複数のインタフェースを実装できる。Javaで扱うデータ/オブジェクトの型(データ型)は、強い静的型付けを採用している。Javaのコンパイラおよび実行環境が、型同士の整合性を検査することによって、プログラムが正しく記述されていることや、安全に動作することの検証が、可能である。
Javaは例外処理機構を備えており、プログラム実行中に生じた異常(例外)の扱いを、比較的安全な方法で行い、プログラムを読みやすく記述することができる。
Javaでは簡潔なメモリモデルを採用しており、プログラマがメモリ (主記憶装置) を管理する負担を軽減する。あらゆるオブジェクトはメモリ内のヒープという領域に割り当てられる。メモリ管理は、Java仮想マシンに統合された自動ガーベジコレクションの機能によって行われる。従来のオブジェクト指向プログラミング言語である C++ では、ヒープ領域に生成したオブジェクトについて、もはや必要が無くなった時に破棄する指示を、プログラマが自分で責任をもって行わなければならなかった。これは、C++ プログラマにとっては負担が大きく複雑で間違えやすい作業であり、ソフトウェアの安全性・開発効率・保守性を損なう要因だった。Javaでは自動ガーベジコレクションの機能があるため、このようなことは無く、プログラマの負担は大きく軽減される。
Javaの文法は、CおよびC++から多くを引き継いでいる。また、C/C++には存在する低水準領域を操作できるポインタという機構は排除されていると言われているが、Javaの開発者も言っているように、C/C++のポインタモデルとは異なるがJavaにもポインタモデルが存在する。例えば、クラスインスタンスと配列はポインタを使用している。これは、"ClassName a = new ClassName();"と"ClassName b;"を定義し"b = a"とすることにより、bはaのフィールドを操作できる。すなわち、a,bにはアドレスが設定されている。同様にして、配列名に格納されるのもアドレスである。このように、インスタンス名(上記のaやb)には、バージョン1.2以前はオブジェクトハンドル(ポインタのポインタ)、バージョン1.3以降はポインタが設定されている。よって、Javaは当初から現在までポインタとは切っても切れない関係にある。これについては、JavaのホワイトペーパーTheに「C/C++とJavaの最大の違いは、Javaには、メモリへの上書きおよびデータ喪失の可能性を排除するポインタモデルがあることである。そこでは、ポインタ演算の替りに真の配列が用意されており、添字チェックを可能としている。なお、任意の整数をポインタに型変換することは、不可能である。」と解説されている。
Javaではプラットフォーム非依存を目標の一つとし、またバージョン間の互換性に注意して開発が進められている。Java技術を使うことで、プラットフォームに依存しないアプリケーションソフトウェアの開発と配備を行うことができる。従来のプログラミング言語の多くはプラットフォーム(CPU)に依存したネイティブなコードにコンパイルすることを前提として設計されていたが、Javaはこうした言語と異なり、中間言語(バイトコード)にコンパイルされ、Java仮想マシンで実行されるよう設計された。多くの場合、ジャストインタイムコンパイル方式が使われる。
プラットフォーム非依存とバージョン間の互換性の目標は、完全に達成できたわけではなく課題が残っている。
Javaではスレッドを言語仕様で規定しており、マルチスレッドによる並列処理を、従来の言語と比べて簡単に実装することができる。なお並列処理は、複数の処理を同時に実行する処理形態である。またスレッドは、プロセスより小さく軽量な処理の単位である。
Javaでは充実したライブラリにより、コンピュータネットワークを活用するソフトウェアを、効率良く開発することができる。Javaはその初期のバージョンから、TCP/IPのライブラリを備えていた。分散オブジェクト環境(Java RMI、CORBA)のソフトウェアの開発も早い時期からできるようになっていた。近年では、さまざまなネットワークプロトコルの高水準なライブラリが使えるようになっている。充実したネットワーク機能と次に述べるXML文書を扱う機能を有効に組み合わせることにより、これまでにない高度なシステムの構築ができる言語の一つである。
XML文書を扱う機能も早期に実用化された。XMLは、広く普及している構造化文書の技術である。近年では、XMLプロセサとXSLTプロセサがJava標準ライブラリに統合され提供されている。
Javaはセキュリティを考慮して設計されており、サンドボックスモデルに基づいたセキュリティ機構を備えている。セキュリティ機構を正しく実装したJava実行環境を適切に使うことで、遠隔のコンピュータ上にある実行コードを安全に実行することができる(Javaアプレット)。
また、名前空間の機構をもつ言語であり、ライブラリおよびアプリケーションに含まれる多数のJavaのプログラム(クラスとインタフェース)は、パッケージという階層構造で管理することができる。
現在、Javaの技術は、情報技術のさまざまな領域、ローエンドからハイエンドまで、幅広く使われている。携帯機器やウェブサーバ、企業の基幹となる情報システムにおいて、非常に普及している。パーソナルコンピュータ(PC)でも使われている。C++などの言語とともに、現在最も広く使われているオブジェクト指向プログラミング言語の一つである。
Javaに対しては批判も少なくない。いくつかの批判に対しては、サンやJCPに参加する人々の努力により、Javaの改良が行われている。一方で現在、多くのソフトウェア開発者は、Javaについて、広く使われている言語としては優れた技術の一つと評価している。
JavaScript(ECMAScript)は、Javaとは直接の関係は無いが、Javaと似た言語名称と構文を持っている。
表記はJのみが大文字の「Java」が正しい。「JAVA」や「java」は正式な表記ではない。
呼称変更の理由は、Oak は既に別の会社が商標として使っていたからである。
1990年頃、サンの技術者パトリック・ノートンは、自社のプログラミング言語 C++ と C の API(アプリケーションプログラミングインタフェース)と開発ツールに不満を募らせていた。 その頃、情報技術の世界でNeXT社が開発した技術が注目を浴びていたことがきっかけとなって、ノートンはサンで新技術の仕事をすることになった。こうした経緯のなかで「ステルスプロジェクト」が始まった。
ステルスプロジェクトには、始まってすぐにジェームズ・ゴスリンとマイク・シェルダンが参加し、プロジェクトの名称は「グリーンプロジェクト」に変更された。 プロジェクトには他の技術者たちも参加し、彼らはアメリカ合衆国カリフォルニア州メンロパーク市サンドヒルロードの道沿いにある小さなオフィスで作業を始めた。 プロジェクトの目的は、次世代の家電製品のための新しいプログラミング技術を開発することだった。サンはこの分野が重要な市場になると予測していた。
プロジェクトチームでは当初はプログラミング言語としてオブジェクト指向プログラミング言語である C++ を採用することを検討していたが、いくつかの理由から C++ は却下された。 彼らの目的は、家電製品すなわち組み込みシステムの技術を開発することだった。 組み込みシステムでは、利用できるコンピュータ資源が少ないという制約がある。 彼らは C++ ではコンピュータ資源を食いすぎると判断した。 また C++ は複雑なプログラミング言語であり、C++ を使うプログラマは注意していても間違いを犯しがちである。このような事情で、彼らはあらゆる機器に容易に移植できるプラットフォームが必要であると認識するようになった。
一方で、サンの技術者ビル・ジョイは、ゼロックス社のパロアルト研究所でAltoというワークステーション試作機のために開発されたプログラミング言語・Mesaと C の良いとこどりをした新しいプログラミング言語を構想していた。 ジョイは Further という名前で呼ばれる論文を書き、自社で C++ に基づいたオブジェクト指向環境を開発するべきであることを進言した。 まずジェームズ・ゴスリンが C++ を改変し拡張することを試みた。 ゴスリンはこの拡張版C++を、"C++ ++ --" と名付けた。 しかしゴスリンは、すぐにこの拡張版C++の開発を中止して、全く新しいプログラミング言語を開発する方針を採ることにした。 ゴスリンはこの新しい言語に Oak という名前をつけた。この名前の由来は、ゴスリンのオフィスのすぐそばにオークの木が立っていたことによる。
プロジェクトチームは残業までして作業を続け、1992年の夏までに新しいプラットフォームを、Greenオペレーティングシステム、Oak言語、ライブラリ、ハードウェアによって部分的なデモンストレーションができるようになった。1992年9月3日の最初のデモンストレーションでは、チームは Star7という携帯情報端末機器を開発することに力点をおいていた。この機器の名称の由来は、電話機能が *7 とボタンを押すことで有効になることによる。
この機器は、グラフィカルなインタフェースを備え、"Duke" という名前の知的な仮想代理人が利用者を支援した。 同年11月、サンはグリーンプロジェクトを分離して完全子会社の FirstPerson, Inc を設立した。 それにともないチームはパロアルトに引っ越した。 FirstPersonチームは、高度にインタラクティブな機器に関心を持っていた。 そのおりタイム・ワーナー社がケーブルテレビのセットトップボックスの RFP(Request For Proposal)を公表していた。 そこでFirstPersonチームは自分たちの目標を変更し、タイム・ワーナーの RFP に応じてセットトップボックスの提案を提出した。 しかし、 FirstPersonは入札でシリコングラフィックス社(SGI)に負けた。 その後に3DO社のセットトップボックスの案件もあったが、契約には至らなかった。FirstPersonはテレビ業界では利益を出すことができず、サンはFirstPersonを解散してチームを自社に戻した。
ウェブページにJavaアプレットという小さなJavaプログラムを埋め込んでおいて、ウェブブラウザ HotJava でそのページにアクセスすると、HotJava 上でアニメーションの表示やマウスによるインタラクティブな操作ができた。
同年、チームは Oak の名称を Java に変更した。 変更の理由は、商標を調べて、"Oak" という名前がすでにビデオカードアダプタの製造会社(Oak Technology社)によって使われていたことが判明したからである。 Java という名称は、一部のチームメンバーがよく出入りしていた近くのコーヒーショップで命名された。 この名称が、何かの頭字語であるかどうかについては、よくわかっていない。その2週間後に、最初の正式バージョンである Java 1.0 がリリースされた。
Java の最初のバージョンが公開されてから現在までの動向を、いくつかの側面から述べる。
近年では、Yahoo! Games やビデオプレイヤーなどのアプリケーションで、Javaアプレットを採用する事例が多い。
かつては、Javaアプレットを使用したサイトを表示すると、数十秒〜数分間操作を受け付けないブラウザが存在した。近年は、JavaおよびJavaアプレットの技術の向上により、環境によって動作が異なったり、実行速度、特に画面の描画が遅いという問題が解消されつつある。
簡単でインタラクティブなアニメーション用には、Javaアプレットよりも GIF89a や 有償の Macromedia Flash を採用する事例が多い。この分野においては、最近では Ajax も普及しつつある。
Javaサーブレットは2000年前後から急速に広く使われるようになり、現在では多くのウェブアプリケーション(動的なウェブページ)がサーブレットとして稼動するようになっている。
サン・マイクロシステムズが開発したJavaサーブレット技術を簡単に説明する。必ずしも厳密な説明ではない。 # Java の実行環境のプロセス(サーブレットコンテナ)を起動してウェブサーバのマシンに常駐させる。 # ウェブサーバが、ウェブブラウザからアクセスされる(リクエストを受ける)。 # ウェブサーバは、そのリクエストをサーブレットコンテナに渡す。 # サーブレットコンテナで動くJavaプログラム(Javaサーブレット)は、受け取ったリクエストに基づき、ウェブページを動的に生成する。 # サーブレットコンテナは、サーブレットが生成したウェブページをウェブサーバに渡す。# ウェブサーバは、サーブレットコンテナから受け取ったウェブページを、ウェブブラウザに返す。
サンがJavaサーブレット技術を開発した1990年代末当時、ウェブアプリケーションの開発には、次に述べるようないくつかの問題があった。Javaサーブレットはこれらの問題をある程度解決することができる技術だった。
多くの Java の Swing や SWT のウィジェット・ツールキットを使ったアプリケーションが、現在も開発されている。
このように、近年はデスクトップ上でJavaアプリケーションを使う事例が増えつつあるものの、従来は次に述べるいくつかの理由のためにあまり使われてこなかったhttp://weblogs.java.net/blog/joshy/archive/2005/03/why_dont_you_sh.html。一部のソフトウェア開発者は、情報技術はウェブを基盤としたモデルが主流となっており、スタンドアロンアプリケーションは流行遅れであり、新しいプログラミング技術は優れたウェブアプリケーションを開発することに充てられている、と思っていた。この見解については、ソフトウェア技術者の間で賛否が分かれている。
現在では、リッチクライアントやWeb 2.0の登場により新たなパラダイムが生まれようとしている。すなわちウェブを基盤としたウェブアプリケーションとスタンドアロンアプリケーションの融合である。ウェブアプリケーションをAjaxや Java Web Start、Adobe Flash などと組み合わせることにより、Web2.0時代に見合ったより洗練されたアプリケーションを開発することができる。
そのため、マイクロソフト社が2001年頃以降にJava実行環境をWindowsに同梱していないことの影響は小さい。
Javaアプリケーションが想定どおりに機能するよう、Java実行環境のバージョンの違いによる非互換性に基づく不具合を避けるために、PCに同梱されているJava実行環境を使わないという判断である。
現在では、Javaアプレットは動作対象のJava実行環境のバージョンを認識することができる。 また、バージョン間の互換性もそこそこ高い水準にあり、上位互換性については java SE 1.3 以降は大きな問題はほぼおきにくくなっている。さらに Java Web Start ではデスクトップにインストールされているJavaのバージョンを確認してアップデートできるならアップデートし、それだけでなく Java Web Start 対応アプリケーションをもアップデートしようとする。そのため古いバージョンのJava実行環境を使っているマシンがあったとしても、自動アップデートされるためにそう難しい問題は起きない。
組み込みシステム向けの Java(Java ME)も広く使われている。
携帯機器(携帯電話・PHSやPDA・スマートフォン等)にJavaの実行環境が実装されるケースが多い。Java環境はこれら携帯機器全般に広く普及している。一方、 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 の競合技術について簡単に述べる。また、2001年にはソニー社のコンシューマゲーム機 PlayStation2 にJava 仮想マシンが搭載される予定と発表され話題になった。
プログラミング言語JavaおよびJavaプラットフォームは、高い水準でバージョン間の互換性を保ちつつ発展してきている。
J2SE 1.4 から、Javaの開発は JCP(Java Community Process)という標準化プロセスで行うようになっている。JCP では、JSRs(Java Specification Requests)という文書群により、Javaに対する追加機能やJavaプラットフォームに対する変更の提案と規定を行う。
また、J2SE1.3以降では開発コードネームとして、メジャーバージョンには動物の名前が、マイナーバージョンには昆虫の名前が付けられる傾向がある。
言語仕様は JLS(Java Language Specification; Java言語仕様)により規定する。JLS は JSR の管理下にある。
バージョンアップの過程で、言語仕様の変更だけでなく、標準クラスライブラリにおいても大きな変更が加えられている。 JDK 1.0 では標準ライブラリは約200クラス/インタフェースだったが、Java SE 6 では4000以上のクラス/インタフェースとなっている。 Swing や Java 2D のような全く新しいAPIが追加された。その一方で、もともと JDK 1.0 から存在していたクラスのメソッドの多くが、J2SE 5.0 での使用は推奨されないようになっている。
strictfp キーワード : IEEE 754 に基づいた厳密な浮動小数点数の演算を行う
assert キーワード : ある程度、「契約による設計」に基づいたプログラミングが可能となる。JSR で規定された。
int型のような基本型(primitive type)とクラスのようなラッパクラスの間の変換が自動的に行われるようになった。JSRで規定。
enumキーワードにより、Javaで安全な列挙型を実現するデザインパターンであるタイプセーフenumパターンが言語レベルでサポートされ、列挙型(順序つきリストの値、多くの場合は定数)を安全に定義することができる。このタイプセーフenumパターンの詳細は、ジョシュア・ブロックほか(2001)pp.97-106 「第5章 項目21 enum構文をクラスで置き換える」を参照。以前のバージョンまではこのような場合、タイプセーフではない整数の定数値で定義するか、プログラマが自分でタイプセーフenumパターンで実装するかの、どちらかの方法しか無かった。JSRで規定。
void drawText(String... lines))。メソッド呼び出しにおいて、最後の引数に関してはその型の任意の個数のパラメタを渡すことができる。その際、実際には内部的に最後の引数は配列としてメソッドに渡される。
forループ(for-each文): for文によるループの構文が拡張された。配列やコレクションオブジェクト(やなど)の各要素オブジェクトに対して、反復(繰り返し)処理をする専用の構文を使うことで、コーディングを簡略化しミスを減らすことができるようになった。この構文を使う場合コレクションは、配列か、インタフェースを実装したコレクションオブジェクトである必要がある。この構文を使ったコーディング例を示す。
この例では、widgets という変数名のコレクションオブジェクト内の、各Widgetオブジェクトを反復して繰り返し処理する。各Widgetオブジェクトにはループサイクルごとに w という変数名をつける。各ループサイクルで、w に対してWidget型で定義されているdisplay()メソッドを呼び出す。拡張forループはJSRで規定された。
Java Kernelを搭載した、Java SE 6 Update 10 が2008年中にリリース予定である。
コードネーム Dolphin。2006年の時点では、このバージョンの開発は計画の初期段階である。2006年から開発開始された。元々は2008年春にリリースされる見通しであったがhttp://weblogs.java.net/blog/editors/archives/2004/09/evolving_a_lang.html、2007年8月の時点では2009年1月をリリース目標としているhttp://today.java.net/pub/a/today/2007/08/09/looking-ahead-to-java-7.html。
5年ぶりに言語仕様を改変予定である。 以下の項目が検討されているhttp://today.java.net/pub/a/today/2007/08/09/looking-ahead-to-java-7.htmlhttp://tech.puredanger.com/java7/。多くは、ScalaやGroovyなどJavaプラットフォーム上のプログラミング言語ですでに実現している物である。Javaの主な特徴を述べる。
Javaを開発する上では、5つの目標があった。
ネットワーク機能および遠隔コンピュータの実行コードの実行を実現するために、場合によっては、Javaプログラマは、CORBA や Internet Communications Engine、OSGi のような拡張機能を使う。
Javaでは一つのクラスが複数のインタフェースをもてるため、一つのクラスに複数の役割をもたせることができる。
Javaで扱うデータ/オブジェクトの型(データ型)は、強い静的型付けを採用している。静的型付けにより、Javaのコンパイラおよび実行環境が、型同士の整合性を検査することによって、プログラムが正しく記述されていることや、安全に動作することの検証が可能である。
Javaのデータ型には、参照型(reference type)と基本型(プリミティブ型、primitive type)の2種類がある。 Javaのオブジェクトは全て参照型である。 Javaの基本型は、単純な構造のデータ(数値、論理値、文字 など)のための型である。 Javaの標準ライブラリは、基本型の値をオブジェクトとして扱えるようにするためのラッパクラスを提供している。 近年のJava(J2SE 5.0)からは型の扱いに改良が加えられている。オブジェクトとは、状態(データ)と振る舞い(コード)がひとかたまりとなったものと考えることができる。
Java では、オブジェクトの設計図であるクラスに定義する振る舞いを「メソッド」と、状態を「フィールド」(インスタンス変数)と呼ぶ。
オブジェクト指向以前の技術での本質的な問題点は、プログラムにおいて、状態と振る舞いが分離されていたことである。オブジェクト指向を有効に活用することにより、大規模なソフトウェア開発プロジェクトを管理することの困難さが軽減され、ソフトウェアの品質が向上し、失敗するプロジェクトの数を減らすことができる。
オブジェクト指向のもう一つの目標は、汎用的なオブジェクトを開発することで、プロジェクトをまたがってソフトウェアをより再利用可能にしてゆくというものである。 例えば、汎用的な「顧客」オブジェクトは、別のプロジェクトにおいても、理論的にはほぼ同一の手続き群を備えるであろう。 大きな組織において、その組織の複数のプロジェクトが機能的に共通する基盤層をもつ場合は、なおさらソフトウェアの再利用が重要となる。 こうしたことから、ソフトウェアオブジェクトは、さまざまなシステムに組み込み可能であるように、汎用性を備えていることが望ましい。こうすることで、ソフトウェア業界は、既存のしっかりテストされたオブジェクトコンポーネントを活用してプロジェクトを進めることができ、開発期間を大幅に短縮することができる。
一方で、ソフトウェアの再利用性を高めるということには、実践においては、2つの大きな困難を伴う。いくつかのオープンソースコミュニティでは、再利用に伴う問題を軽減するために、オブジェクトやクラスライブラリの開発者に、自分たちが開発した汎用的で再利用可能な開発物についての情報を広報する手段を提供している。
近年では、Java実行環境を構成するJava仮想マシンに高速化の技術が導入され、プラットフォームに依存したプログラムと同水準の実行性能を実現している。
Javaのプラットフォーム非依存は、次のようにして実現されている。しかしこの方法で生成されるJavaの実行コードは、コンパイル時に指定したプラットフォームでしか動かない。
Javaの実行コード(バイトコード)を生成する手段としては、プログラミング言語Javaでプログラムを書くことが標準的なやり方である。 Javaのバイトコードの実行は、Java仮想マシンという仮想マシンの環境上で行われる。 Java仮想マシンは実行時にバイトコードをネイティブコードに変換する。なお、Javaのバイトコードを生成する他の方法としては、現在ではRuby(JRuby)や Groovy 、Python(Jython)などのプログラミング言語でプログラムを書くこともできる。
サン・マイクロシステムズのJavaのライセンスは、全てのJava実行環境の実装は「互換性」を備えるべきであることを要求する。このことに関連して、サン・マイクロシステムズ社とマイクロソフト社との間で法的な争いが起こったことがあった。 この法的な争いは、サンが、マイクロソフトのJava実行環境の実装について次のように主張したことによる。 サンは訴訟を起こして勝訴し、約2000万ドルの違約金の支払いを受けた。 また裁判所は、マイクロソフトに対してサンのライセンス条件に従うことを命じた。 この決定を受けて、マイクロソフトは自社のオペレーティングシステムであるWindowsにJava実行環境を同梱しない方針を採った。 また近年のバージョンのWindowsでは自社のウェブブラウザである Internet Explorer でJavaをサポートしないようにした。 その結果、Internet Explorer でJavaアプレットを動かすためには、別途にプラグインが必要となった。 しかし、サンなどの企業は、近年のバージョンのWindowsのユーザが、無償でJava実行環境を利用できるようにした。そのため、ほとんどの Windows PC のユーザは、何ら問題なくウェブおよびデスクトップ上でJavaアプリケーションを実行できる。
最初期のJava実行環境の実装では、Javaプログラムの実行速度が遅かったが、近年では大きく改善されて、高速に実行できるようになった。 最初期のJava実行環境のJava仮想マシンの実装は、移植性を実現するためにインタプリタとして動作する仮想マシンを採用した。 こうした初期のJava実行環境の実装では、Javaプログラムの実行速度が C や C++ のプログラムと比べて遅かった。 そのため、Javaプログラムの実行速度は遅いという評判が広まった。近年のJava実行環境の実装では、いくつかの技術を導入することにより、以前と比べて、Javaプログラムをかなり高速に実行できるようになった。
Javaプログラムを高速に実行するために使われる技術を説明する。Java仮想マシンにジャストインタイムコンパイルと動的再コンパイル、世代別ガーベジコレクションの技術を導入することにより、Javaプログラムは、移植性を保ちつつ、ネイティブコードと同水準で高速に実行することができるようになった。
Javaの移植性(プラットフォーム非依存)がどの程度実現できているかについては、議論の対象となっている。 技術的には移植性とは実現が難しい目標である。 多くのプラットフォームにおいて同一に動作するJavaプログラムを作成することは、可能である。 しかし実際には、Javaを利用できるプラットフォームによってはちょっとしたエラーが発生したり、微妙に異なる動作をする事例が多い。こうしたことから一部の人々は、サン・マイクロシステムズのJavaの売り文句である "Write once, run anywhere"(一度コードを書けば、どの環境でも動く)をもじって "Write once, debug everywhere"(一度コードを書けば、どの環境でもデバッグが必要)と皮肉をいわれることがある。
しかし、Javaのプラットフォーム非依存は、サーバ側や組み込みシステムのアプリケーションに関しては、非常に成功している。 サーバ側(Java EE)では、Javaのサーブレット、Webサービス、EJB(Enterprise JavaBeans)などの技術が広く使われている。組み込みシステムの分野においても、組み込みシステム向けのJava環境(Java ME)を使った OSGi を基にした開発が広く行われている。
Javaでは、自動ガーベジコレクションを備えており、この機能を備えていない従来の多くの言語と比べて、プログラムの開発生産性と安定性が高い。Javaの自動ガーベジコレクションにより、プログラマの負担は、完全に解消されるわけではないものの、大きく軽減される。近年のJavaの自動ガーベジコレクションでは世代別ガベージコレクションという効率的な技術を導入している。自動ガーベジコレクションを備えていない言語である C++の場合は、プログラマは自分自身でメモリの管理をしなければならないという負担に苦しめられる。C++では、オブジェクト指向プログラミングをするプログラマは一般にはJavaと同様にメモリ内のヒープという領域に生成するオブジェクトを格納する領域を割り当てる。そしてオブジェクトがもはや必要なくなった場合には、必ず明示的にオブジェクトを削除する指示を適切に記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならない。プログラマが、メモリ領域の解放が必要な時に、領域の解放を忘れたり、メモリ領域解放の指示が不適切だった場合には、メモリリークが発生する可能性がある。メモリリークとは、解放し忘れた未解放メモリが累積していく現象であり、利用できるメモリの量が減ってゆく。メモリ管理が不十分なプログラムでは、その実行時にメモリリークによって、気づかないうちに勝手に大量のメモリを消費してしまう問題が起こり得る。また、あるメモリ領域を解放する際に、解放の指示を2度行うと、プログラムの実行が不安定になる可能性があり、悪くすると異常終了してしまうこともある。
Javaでは、自動ガーベジコレクションを備えていない言語における潜在的な問題は、自動ガーベジコレクション機能によって、その多くを未然に防ぐことができる。プログラマは任意の時点でオブジェクトを生成することができ、Java実行環境は生成されたオブジェクトのライフサイクルを管理する責任をもつ。
プログラム(オブジェクト)は、他のオブジェクトへの参照をもち、そのオブジェクトのメソッドを呼び出すことができる。他のオブジェクトへの参照とは、低水準の視点で述べると、メモリ内のヒープという領域上に確保されたそのオブジェクトを指すアドレスのことである。
オブジェクトがどこからも参照されなくなった場合、Javaのガーベジコレクション機能が自動的にその「到達不可能なオブジェクト」を削除し、そのメモリ領域を解放することで、解放し忘れた未解放メモリが累積していき利用できるメモリの量が減ってゆくメモリリークを防ぐ。
ただしJavaの自動ガーベジコレクション機能は、メモリリークの問題を完全に解消するわけではない。プログラマが、自分のプログラムでもはや必要のないオブジェクトへの参照を保持し続けた場合は、やはりメモリリークが発生する可能性がある。
別の表現で述べると、Javaでは、メモリリークは概念的に高い水準においては、発生する可能性が残っているということである。 概念的に低い水準においては、自動ガーベジコレクションが正しく実装されたJava仮想マシンを使えば、メモリリークが発生する可能性は無くなった。全体として、Javaの自動ガーベジコレクション機能により、C++の場合と比べると、オブジェクトの生成と削除は、より簡潔になり、潜在的に安全になり、また多くの場合は高速になっている。
C++においても、しようと思えば、Javaと同等のメモリ管理の高速性と効率性を実現することはできるが、先に述べたとおり、複雑な作業で間違えやすく、完璧に行おうとすれば開発期間が非常に長くなり、開発したソフトウェアはかなり複雑で難解になる。例えば、C++で特定のクラスを対象として、高速実行およびメモリ利用の断片化の最小化を、高水準で達成できるメモリ管理モデルで設計開発する技法があるが、こうした技法は複雑である。
自動ガーベジコレクションの機構は、Java仮想マシンに組み込まれており、開発者からは、事実上隠蔽されている。 開発者は、場合にもよるが、ガーベジコレクションがいつ起こるか意識しなくて良い。というのも多くの場合、ガーベジコレクションの実行は、プログラマが自分で書いたコードによって明示的に起こる何らかの挙動と、必ずしも関連しているわけではないからである。
現在では IPv6 も扱えるようになりつつある。
XML 文書を扱う技術とネットワーク機能を有効に組み合わせることにより、高度なシステムやサービスを構築できるようになっている。
名前空間の機構をもたない言語と比べて、多数のクラスとインタフェースの管理が容易となり、クラスとインタフェースの命名についても、既存のクラス/インタフェースとの名前の衝突回避を考慮する労力が、大きく軽減される。
ただしいずれのバイトコードも、Java実行環境(JRE)のもとで実行されるという点では、同じと考えることもできる。
Javaでは、若干の例外を除き、全てがオブジェクトであり、全てはクラス内に記述する。
なお先に述べたとおり、Javaには複数の実行形態があると考えることができるので、以降では、それぞれの実行形態における Hello world プログラムを例示する。
Javaでは、他のプログラミング言語と同様に、コマンドライン環境で動くプログラムを簡単に開発できる。
class 内に記述する。コマンドラインのスタンドアロンアプリケーションの場合も同じである。
Hello であるため、"Hello.java" というソースファイル名にする必要がある。
main() メソッドを定義する必要がある。メソッド定義には振る舞いを記述する。この main メソッドのシグニチャ(戻り値、引数)は次のようにしなければならない。
void キーワードを使う。void は、そのメソッドが何も戻り値を返さないことを示す。
String配列の引数の名称は args とすることが慣習となっている。ただし引数として可能な名称であれば他の名称でも構わない。
static キーワードをつけなければならない。static は、そのメソッドがクラスメソッドであることを示す。クラスメソッドは、クラスと関連するメソッドであり、オブジェクトインスタンスに関連するメソッド(インスタンスメソッド)ではない。
public キーワードをつけて宣言する。public は、そのメソッドが他のクラスのコードから呼び出せること、およびそのクラスが他のクラスから呼び出される可能性があることを、示す。ここでの「他のクラス」とは、そのクラスの継承階層に関係なく、他の全てのクラスを意味する。
out オブジェクトは、 クラスのインスタンスであり、標準出力ストリームを表す。PrintStreamクラスのインスタンスである out オブジェクトは、 メソッドをもつ。このメソッドはデータをストリームに出力する。ストリームとは入出力を抽象化した概念である。この場合は、データを画面(out 、標準出力)に出力する。
java -cp . Hello をコマンドラインで入力することで、この例のプログラム(Hello.class にコンパイルされたクラス)を実行することができる。