約 1,438,274 件
https://w.atwiki.jp/0x0b/pages/85.html
構成 Javaプラットフォームの構成を説明する。 #Java実行環境 (JRE)は、Javaプラットフォームに配置されたJavaアプリケーションを実行するために必要な、ソフトウェアである。標準クラスライブラリやJava仮想マシンなどから構成される。 #Java開発キット (JDK)は、Javaプログラムの開発を支援する基本的なソフトウェアである。 #JREとJDKの複数の実装で 、JREとJDKの開発と提供の状況について簡単に述べる。 #Javaのエディションで 、サン・マイクロシステムズとJCPが規定している3つのJavaのエディションについて簡単に述べる。 #拡張機能と関連技術で 、Javaの主な拡張機能と関連する技術を述べる。 Java実行環境 Java実行環境(JRE; Java Runtime Environment)は、Javaプラットフォームに配置されたJavaアプリケーションを実行するために必要な、ソフトウェアである。標準クラスライブラリやJava仮想マシンなどから構成される。 エンドユーザは普通、Javaソフトウェアパッケージやウェブブラウザプラグインの利用を通じて JRE を使う。サン・マイクロシステムズ/JCP をはじめ複数の団体や企業により、 さまざまなプラットフォーム向けに、多くの JRE の実装が開発・提供されている。 JRE の他、サン/JCPなどの団体・企業は、Java開発キット(JDK)と呼ばれる JRE のスーパーセットの実装を開発・提供している。JDK は、Javaプログラムの開発を支援する基本的なソフトウェアであり、多くの開発ツールが含まれている。 実行環境の構成 Java実行環境は、標準クラスライブラリとJava仮想マシン、およびいくつかのファイルとソフトウェアから構成される。 Javaクラスライブラリ群(標準クラスライブラリ) 実行環境に含まれるJavaクラスライブラリ群の実体は、JRE(Java実行環境)を実装した人々がJava標準クラスライブラリのソースコードからコンパイルしたバイトコードである。このライブラリ群はJavaアプリケーションを実行するために必要であり、またJavaアプリケーション開発者も標準クラスライブラリを使って開発する。この標準クラスライブラリには、以下のライブラリが含まれる。 コアライブラリ コレクションのライブラリ リストや連想配列(ハッシュテーブル)、木構造(ツリー)、集合(セット)などのデータ構造およびアルゴリズムを実装している。 リフレクション Javaでは実行時にもクラスやメソッドの情報をもっており、クラス名やメソッド名を動的に指定して呼び出すことができる。 XML文書を扱うライブラリ セキュリティ機能 国際化と地域化のライブラリ シリアライズ(serialization、オブジェクト直列化) オブジェクトの参照をたどって関連するオブジェクトをまとめてバイトストリームにすることができる。そのストリームをファイルに書き込めば、オブジェクトの状態をそのまま保存(永続化)できる。 統合ライブラリ(外部システムとの連携機能) JDBC データベース接続のAPI JNDI(Java Naming and Directory Interface) ネーミングサービス・ディレクトリサービスへのアクセス Java RMI(Remote Method Invocation、遠隔メソッド呼び出し)と CORBA 分散オブジェクト環境(分散処理環境) 分散システムなどで、別のJava仮想マシンにあるオブジェクトがお互いのメソッドを呼ぶことができる。ソケット等を直接利用する通信の低水準な実装をせずに、簡単に高水準な実装をすることができる。 グラフィカルユーザインタフェース(GUI)のライブラリ AWT(Abstract Window Toolkit、抽象ウィンドウツールキット) 重量コンポーネント(ネイティブコンポーネント)のライブラリ。重量コンポーネントを配置しイベント制御を行うことができる。 Swing 軽量コンポーネントのライブラリ。AWT を使って開発されたが、ネイティブではないウィジェット(GUIの部品要素)の実装を提供する。 Java 2D 2次元グラフィクスや画像(JPEGなど)を扱うライブラリ。 Java Sound など音声を扱うAPI群(録音、再生、その他の処理) Javaアプレット jar(Java Archive) Javaプログラムの標準圧縮ファイルの圧縮・展開機能。拡張子の関連付けをすれば、jarファイルをダブルクリックすることで実行できる。実際はZIPで圧縮している。 JNI(Java Native Interface) JavaからCなど他の言語で実装されたネイティブなプログラムやライブラリを呼び出すことができる。 Java仮想マシン(Java VM) 仮想マシンの一種であり、プラットフォームに依存して実装された、JavaライブラリとJavaアプリケーションのバイトコードを実行するソフトウェア プラグイン ウェブブラウザでJavaアプレットを実行するために必要なソフトウェア Java Web Start Javaアプリケーションをウェブを介して効率的にエンドユーザに配布する機構 ライセンス文書および各種の文書 Java開発キット ava開発キット(JDK; Java Development Kit)は、サン/JCP をはじめ複数の団体や企業により開発・提供されている、Javaプログラムの開発を支援する基本的なソフトウェアである。Javaが世に出て以来、広く使われてきたJavaの開発ツールである。Javaコンパイラ、javadoc、デバッガなどを含む多くの開発ツールが含まれている。また、完全なJava実行環境(JRE)を同梱している。 Javaプログラムを実行するだけであれば、Java実行環境が導入されていれば充分で、Java開発キットを導入する必要は無い。 Java開発キット(JDK)の呼称は、これまでに何度か変更されている。 J2SE 1.2.2_004 までは JDK と呼んでいた。 J2SE 1.4 までは Java 2 SDK と呼んでいた。 J2SE 5.0 では 再び JDK と呼んでいる。 JREとJDKの複数の実装 広く使われているプラットフォームなどに対しては、複数の団体や企業が独自に JRE や JDK の実装を開発・提供している。独自の最適化技術を適用したり、特定の用途に特化した最適化、あるいは異なるライセンスを採用するなど、それぞれ特徴がある。 Linux/IA-32プラットフォーム サン、Blackdown、IBM、Kaffe.org、GNU、BEAシステムズ などが JRE や JDK を実装・提供している。 Windows/IA-32プラットフォーム サン、IBM、BEA などが JRE や JDK を実装・提供している。 オープンソース/フリーソフトウェアの実装 サンおよびいくつかの団体が、オープンソースもしくはフリーソフトウェアのライセンスで利用できる、Java仮想マシンおよび JRE 、JDK の実装を開発している。 サン/JCPはJava発表時からJava仮想マシンおよび標準ライブラリの仕様を公開しており、Java標準クラスライブラリのソースコードも JDK の一部として提供していた。しかしソースコードの改変は下記のOpenJDKリリースまでライセンスで認めていなかった。そのため、サンの実装とは別に、オープンソースもしくはフリーソフトウェアでかつサンの実装と互換性のあるJava標準クラスライブラリとJava仮想マシンが開発されている。また、2006年にサンはライセンスの方針を変更し近い将来オープンソースにする意向を表明し、2007年5月8日にJava SE 6をOpenJDKとしてGNU General Public Licenseにてリリースした GNU Classpath は、2007年3月現在、J2SE 1.4 のライブラリの 99% 以上を実装しJ2SE 5.0 では 95% 以上を実装している また Apache Harmony には IBM が協力している。 GNU Compiler for Java (GCJ) GNUがGNUコンパイラコレクション (GCC) のJava版、GNU Compiler for Javaを出している。ahead-of-time コンパイラを搭載しており、Javaのソースコードやバイトコードをネイティブマシンコード(Windowsの場合はexeファイル)に変換できる。クラスライブラリはGNU Classpathを使っており、1.4のほとんどの部分が対応しており、5.0の部分も実装が進んでいる。 Windows環境では、GCJはMinGW (Minimalist GNU for Windows) もしくはCygwinを使って実行できる。Cygwinの場合は、対象がライセンスがGPLのソフトウェアに限られるが、MinGWの場合は商用含め、すべてのソフトウェアで利用できる。 Excelsior JET 米Excelsior社が Excelsior JET というahead-of-timeコンパイラを販売している[8]。Java SE 用に書かれたプログラムをWindowsのネイティブマシンコードであるexeファイル(実行ファイル)に変換できる。起動の高速化やアプリケーションの難読化を実現する。 Windows exeパッケージ化 Windowsにて、配布、実行しやすくするために、Javaのjarファイルをexeファイル(実行ファイル)でラッピングするツールがある。以下が、その一例である。 exewrap JSmooth Launch4j 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サービス)化する機能を持つ。 Sun が特定のOSに特化した機能を提供することを嫌がっているため、これらの機能が不足しており、それを補うために、exeパッケージ化が存在する。 Javaのエディション サン・マイクロシステムズとJCPは、さまざまな環境に対応するため、3つのJavaプラットフォームのエディションを規定している。Java の API の多くは分類され各エディションに割り当てられている。 エディションごとに実行環境と開発環境がある。Java実行環境(JRE)は、Java仮想マシンと標準ライブラリの実装から構成される。JDK 1.1 のバージョンまでは、Java SE に相当するエディションのみが提供されていた。3つのエディションが規定されたのは、JDK 1.1 の次のバージョンからである。サン/JCPが規定しているエディションを次に示す。 Java SE Java SE(Java Platform, Standard Edition)は、ワークステーション、パーソナルコンピュータやサーバなどの機器で、汎用的な用途に使われる。 Java EE Java EE(Java Platform, Enterprise Edition)は、Java SE に加え、多層クライアントサーバの大規模システムを開発するための、さまざまな API が追加されている。 Java ME Java ME(Java Platform, Micro Edition)は、コンピュータ資源が限られている、組み込みシステムなどを用途として想定したエディションである。機器の種類に応じた、ライブラリのいくつかの異なるセット(プロファイル)を規定している。Java SE のいくつかのAPIは実装していないが、このエディションで対象とする用途には十分な機能をもっている。完全な Java SE のライブラリを使うには、このエディションで対象とする用途では記憶装置の容量が足りない。 Java API に含まれるクラスは、パッケージと呼ばれるグループに分類される。各パッケージは、相互に関連するインタフェース、クラス、例外を含む。Javaの各エディションでどのような機能が使えるかについては、それぞれのエディションの項目(Java SE、Java EE、Java ME)を参照のこと。 JavaのAPIセットは、サン・マイクロシステムズと他の個人や企業・団体が共同で、JCP(Java Community Process)プログラムに沿って管理している。このプロセスに参加する人々が、Java API の設計と開発に関わっている。このプロセスのあり方については、議論の対象となっている。 2004年より、IBM と BEAシステムズ は、Java の公式のオープンソース実装を作る動きを、公的に支援している。2006年まで、サンはこうした動きに対しては拒否する立場をとってきたが、方針を変えて自社とJCPによるJavaの実装をオープンソースにする意向を表明し実行に移し始めている。 拡張機能と関連技術 Javaの標準機能に対する拡張機能は、多くの場合、javax.* パッケージに属する。こうした拡張機能は、Java SE の Java開発キット(JDK)や Java実行環境(JRE)には含まれない。Javaの拡張機能や関連技術は、プログラミング言語Javaと密接に連携する。主なJavaの拡張機能と関連技術を示す(いくつかの拡張機能は近年の Java SE 標準ライブラリに統合された)。 Java EE(従来のJ2EE)(Java Platform, Enterprise Edition) - 大規模で分散化された企業システムもしくはインターネットサーバ向けのJavaのエディション Java ME(従来のJ2ME)(Java Platform, Micro Edition) - 携帯機器など資源が限られている環境向けのJavaのエディション JMF(Java Media Framework) - 音声・動画などのマルチメディア向けのAPI JNDI(Java Naming and Directory Interface) - ネーミングサービス・ディレクトリサービスへのアクセス JSML(Java Speech Markup Language) - 音声合成システムにテキストの注釈を追加する JDBC - データベース接続のAPI 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 Card - スマートカードなどの機器で安全にJavaアプリケーションの実行を実現する技術 JavaSpaces - 分散環境でJavaオブジェクトの送受信・永続化などを支援する技術 JML(Java Modeling Language) - 契約による設計(Design by contract)に基づいた開発を支援する技術 JMI(Java Metadata Interface) - Javaのメタデータの作成・アクセス・検索・送受信に関する仕様 JMX(Java Management Extensions) - 分散環境における機器・アプリケーション・ネットワークサービスの管理/監視を行う技術 JSP(JavaServer Pages) - Java EE によるウェブアプリケーションで XHTML などのファイルにJavaのコードを埋め込み、動的に文書を生成する技術 JSF(JavaServer Faces) - Java EE によるウェブアプリケーションでユーザインタフェースの簡易な開発を支援する技術 JNI(Java Native Interface) - Javaから他の言語で実装されたネイティブなプログラムやライブラリを呼び出すための仕様 JXTA - Peer to Peer(P2P) の仮想ネットワークのためのオープンプロトコル Java 3D - 3次元グラフィクスプログラミングのための高水準なAPI Java 3D JOGL(Java OpenGL) - OpenGL を使う3Dグラフィクスプログラミングのための低水準なAPI LWJGL(Light Weight Java Game Library) - ゲームを開発するための低水準なAPIで、OpenGL、OpenAL および多様な入力機器の制御機能も提供する OSGi - サービスの動的な管理と遠隔保守 JavaDesktop Java技術の標準化 現在、Javaプラットフォームの将来のバージョンや機能は、JCP(Java Community Process)の標準化プロセスのもとで開発されている。JCP のメンバになることで、Java技術の将来のバージョンや機能の定義に関与することができる。JCP には、IBM、ボーランド、BEAシステムズ、富士通、Apacheソフトウェア財団、ヒューレット・パッカード など、さまざまな個人、団体、企業がメンバとして参加している。 JCP は、Javaプラットフォームに追加する仕様や技術を、JSRs(Java Specification Requests)という文書群に記述する。 プログラミング言語JavaとJavaコアAPIに関わるいくつかの JSRs を示す。 JSR 14 Add Generic Types To The Java Programming Language(J2SE 5.0) JSR 41 A Simple Assertion Facility(J2SE 1.4) JSR 47 Logging API Specification(J2SE 1.4) JSR 51 New I/O APIs for the Java Platform(J2SE 1.4) JSR 59 J2SE Merlin Release Contents(J2SE 1.4) JSR 121 Application Isolation API JSR 133 Java Memory Model and Thread Specification Revision(J2SE 5.0) JSR 166 Concurrency Utilities(J2SE 5.0) JSR 175 A Metadata Facility for the Java Programming Language(J2SE 5.0) JSR 176 J2SE 5.0(Tiger)Release Contents(J2SE 5.0) JSR 201 Extending the Java Programming Language with Enumerations, Autoboxing, Enhanced for loops and Static Import(J2SE 5.0) JSR 203 More New I/O APIs for the Java Platform("NIO.2")(Java SE 7) JSR 204 Unicode Supplementary Character Support(J2SE 5.0) - Unicode 3.1 のサポート JSR 244 Java EE 5 Specification(Java EE 5) JSR 270 Java SE 6("Mustang")Release Contents(Java SE 6) JSR 275 Physical Units/Quantities Support(Java SE) - JScience をもとにしたリファレンス実装 JSR 901 Java Language Specification(J2SE 5.0) 批判 Javaに対しては、優れた技術だと評価する人々がいる一方で、批判も少なくない。Javaは、ソフトウェアに関する複雑さを管理する問題に対して、革新的な方法を提供するという目標のもとで、開発された。多くの人々は、Java技術は、この期待に対して満足できる答えを提供したと評価している。しかしJavaにも欠点が無いわけではない。Javaは、どのようなプログラミング作法にも適応しているわけではない。また、どのような環境や要件にも普遍的に適応しているわけではない。 Javaに対する批判を大まかに記述する。 実行性能 avaの初期のバージョンでは、CやC++などのネイティブにコンパイルする言語と比べて、とても実行が遅くメモリの消費が激しいとして、批判されることが多かったが、近年のバージョンでは改善されてきている。近年のJava仮想マシンで採用しているジャストインタイムコンパイラや動的再コンパイルの実行性能は、従来の言語のネイティブコンパイラとほぼ同じ水準の実行性能かそれ以上を達成することがある。これは頻繁にメモリアクセスを行うプログラムにおいてJavaのガベージコレクションの技術が、Cのmallocやfreeよりも高い性能を発揮できることによる。こうした事情から、Javaの実行性能については、議論の対象となっている。 ルックアンドフィール ルックアンドフィールに関して、JavaのSwingのツールキットを使ったグラフィカルユーザインタフェース(GUI)を備えたアプリケーションの既定のルックアンドフィールが、従来のネイティブなアプリケーションとは大きく異なるため、エンドユーザの人々にとってJavaのGUIアプリケーションはなじみにくいと批判されることがある。Javaではプラグイン可能なルックアンドフィールの機構を備えており、サンはWindows、Mac OS XおよびMotifの各ルックアンドフィールのクローンを提供している。そのため、Swingの既定のルックアンドフィールではなく、プラットフォームネイティブと同様のルックアンドフィールでJavaのアプリケーションを動かすよう指定することができる。しかしエンドユーザにとってこの指定方法は簡単ではないと指摘されることがある。 言語仕様の設計 言語仕様の設計に対する批判をいくつかの側面から述べる。 Javaの設計者は、他のプログラミング言語では備えているいくつかの機能をJavaから排除した。こうした設計上の判断については賛否が分かれている。 多重継承 演算子のオーバーロード プロパティ - Delphi と C# において実装されている機能 Javaは、純粋なオブジェクト指向プログラミング言語ではないとして、批判されることがある。Javaの変数値には、スタック領域に割り当てられる基本型(primitive type)と、ヒープ領域に割り当てられる参照型(reference type; オブジェクトの型)がある。Javaの設計者は、実行性能上の理由から、意図的に基本型をJavaに導入した。ただし、J2SE 5.0 以降ではオートボクシングが導入され、プログラマは基本型の変数を参照型の変数(プリミティブラッパークラスのオブジェクト)であるかのようにプログラミングすることができるようになった。基本型の変数と参照型の変数との間の変換はコンパイラによって自動的に行われるようになり、ソースコードを読みやすくすることができるようになった。 Javaは、オブジェクト指向プログラミングという単一のパラダイムに基づいた言語であり、そのことが批判の対象となることがある。J2SE 5.0 では、メソッドとフィールドの static インポートを行えるようになり、手続き的なパラダイムをいくぶん良い形で取り込んだと言及されることがある。しかし static インポートを不用意に使うとソースコードを判読困難にする可能性がある。サン/JCPは static インポートを適切に使用する方法を説明している クラスパス 一般に、Javaプログラムを実行する際、-classpath オプションを使用するか、環境変数クラスパス(CLASSPATH)を必要に応じて適切に設定する必要がある。環境変数クラスパスを指定すると、既定のカレントディレクトリという設定が上書きされる。したがって、環境変数クラスパスを変更するソフトをインストールするなど設定を変えられた場合は、Java実行環境は正しくJavaプログラムを実行することができなくなることがある。このためJavaを使い始めた人々は、クラスパスについて戸惑うことがある。サンは -classpath オプションを指定する方法を推奨している。 移植性・互換性 Javaは高い移植性と互換性を実現するべく開発されており、ある程度の水準まで達成しているが、課題が残っている。Javaのバージョン間の下位互換性・上位互換性が完全ではないことが問題として議論の対象になっている。Javaでは高い移植性を保っているため、一部のプラットフォームにしかない独自の機能はJavaからは使えない。 開発ツール Javaアプリケーションを開発するための開発ツール(開発用ソフトウェア)をいくつか示す。次に示すツール以外にも、数多くのツールが開発・提供されている。 Java開発キット(Java Development Kit、JDK) - Javaアプリケーションの基本的な開発環境。 統合開発環境(IDE) - アプリケーションを開発できる多機能な開発環境。後述する。 Apache Ant - Javaアプリケーションのビルドツール。Apacheソフトウェア財団のプロジェクトによって開発された。コンパイル、バージョン管理システムとの連携、jar、javadoc生成、ファイルのコピー/移動/削除/変換などの一連の処理を自動化して効率的に実行する。makeと同種のツールであり、XMLファイルにビルドの規則を記述する。Java以外の言語によるアプリケーション開発や、アプリケーション開発以外の用途にも使うことができる。 Apache Maven - Javaアプリケーションのプロジェクト管理ツール。Apacheソフトウェア財団のプロジェクトによって開発された。 JUnit - Javaアプリケーションの単体テストフレームワーク。単体テストを自動化する。xUnitの一種である。テスト駆動開発を支援する。 統合開発環境 Javaプログラムを開発できるいくつかの統合開発環境(IDE)を示す。 Sun Java Studio Enterprise(2005年11月9日に無料化)。Sun Java Studio Creator(2005年11月9日に無料化)。Windows版、Linux版、Solaris版、Mac OS版。NetBeansにサン・マイクロシステムズがいくつかのモジュールを加えた環境。 Sun Java Studio Enterprise Sun Java Studio Creator NetBeans - Sun Java Studio Enterprise のオープンソース版ともいえる。サン・マイクロシステムズ。オープンソース。Windows版、Linux版。Solaris版、Mac OS版。 NetBeans.org NetBeans.jp WebSphere Studio - IBM。Eclipse SDK の上位版ともいえるもの。WebSphere Application Server と統合されている。Windows版、Linux版。Solaris版、Mac OS版。 WebSphere開発ツール Eclipse SDK - Eclipse財団。以前はIBMが管理していた。Web Sphere Studio のオープンソース版ともいえる。Windows版、Linux版、Solaris版、Mac OS版。 eclipse.org(英語) EclipseWiki(日本語) Borland JBuilder - ボーランド。Foundation版は無料で入手できる。Windows版、Linux版。Solaris版、Mac OS版。 JBuilder JDeveloper - オラクル。機能豊富。Oracle Application Server と統合されている。Windows版、Linux版。Solaris版。2005年6月28日に無料化した。 JDeveloper BEA WebLogic Workshop - BEAシステムズ。BEA WebLogic と統合されている。 BEA WebLogic Workshop BlueJ - Deakin University(オーストラリアヴィクトリア州) と University of Kent(イングランドケント州)、サン・マイクロシステムズが共同で開発したフリーソフトウェア、Javaの学習に適したインタラクティブな統合開発環境。 BlueJ IntelliJ IDEA - JetBrains が開発販売している商用の統合開発環境。 IntelliJ IDEA JCreator - Xinox Software が開発販売している商用の統合開発環境。無償版も利用可能。 JCreator Xcode - アップル。Mac OS Xに付属する統合開発環境。 Visual J++ - マイクロソフト。Windows版。マイクロソフト独自に仕様を拡張しているため、サンのJavaと互換性は低い。 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) 認定資格は年3回の受験制限がある。ただし何らかの理由で4回以上受験の際には、アメリカのサン・マイクロシステムズ本社に連絡する必要がある。
https://w.atwiki.jp/yo-kichi/pages/20.html
**何ができるか ***実装したい機能 ---- **感想 ---- コメント #pcomment(below2,noname,20,enablenamelink,enableurl)
https://w.atwiki.jp/ce00582/pages/1323.html
import javax.media.j3d.*; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.Box; import javax.vecmath.*; import java.awt.*; import javax.swing.*; public class ex82 { public static void main(String[] args) { ex82 test = new ex82(); } public ex82() { JFrame frame = new JFrame(); frame.setSize(500,500); frame.setTitle("ex82"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel cp = new JPanel(); cp.setLayout(null); frame.add(cp); GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas = new Canvas3D(g_config); canvas.setBounds(0,0,400,400); cp.add(canvas); SimpleUniverse universe = new SimpleUniverse(canvas); frame.setVisible(true); ViewingPlatform camera = universe.getViewingPlatform(); camera.setNominalViewingTransform(); Color3f light_color = new Color3f(1.0f,1.0f,1.0f); Vector3f light_direction = new Vector3f(0.2f,-0.2f,-0.6f); DirectionalLight light = new DirectionalLight(light_color,light_direction); BoundingSphere bounds = new BoundingSphere(); light.setInfluencingBounds(bounds); BranchGroup group2 = new BranchGroup(); group2.addChild(light); universe.addBranchGraph(group2); Appearance appearance = new Appearance(); Material material = new Material(); material.setDiffuseColor(0.9f,0.75f,0.75f); appearance.setMaterial(material); Box box = new Box(0.3f,0.3f,0.3f,appearance); BranchGroup group1 = new BranchGroup(); TransformGroup tgr = new TransformGroup(); tgr.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); tgr.addChild(box); group1.addChild(tgr); universe.addBranchGraph(group1); Transform3D tr = new Transform3D(); tr.rotY(Math.PI/4); tgr.setTransform(tr); } }
https://w.atwiki.jp/ce00582/pages/1328.html
import javax.media.j3d.*; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.Box; import javax.vecmath.*; import java.awt.*; import javax.swing.*; public class ex77 { public static void main(String[] args) { ex77 test = new ex77(); } public ex77() { JFrame frame = new JFrame(); frame.setSize(500,500); frame.setTitle("ex77"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel cp = new JPanel(); cp.setLayout(null); frame.add(cp); GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas = new Canvas3D(g_config); canvas.setBounds(0,0,400,400); cp.add(canvas); SimpleUniverse universe = new SimpleUniverse(canvas); frame.setVisible(true); ViewingPlatform camera = universe.getViewingPlatform(); camera.setNominalViewingTransform(); Color3f light_color = new Color3f(1.0f,1.0f,1.0f); Vector3f light_direction = new Vector3f(0.2f,-0.2f,-0.6f); DirectionalLight light = new DirectionalLight(light_color,light_direction); BoundingSphere bounds = new BoundingSphere(); light.setInfluencingBounds(bounds); BranchGroup group2 = new BranchGroup(); group2.addChild(light); universe.addBranchGraph(group2); Appearance appearance = new Appearance(); Material material = new Material(); material.setDiffuseColor(0.9f,0.75f,0.75f); appearance.setMaterial(material); Box box = new Box(0.3f,0.3f,0.3f,appearance); BranchGroup group1 = new BranchGroup(); TransformGroup transform_group = new TransformGroup(); transform_group.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); transform_group.addChild(box); group1.addChild(transform_group); universe.addBranchGraph(group1); Transform3D transform1 = new Transform3D(); transform1.rotY(Math.PI/10); transform_group.setTransform(transform1); } }
https://w.atwiki.jp/ce00582/pages/1329.html
import javax.media.j3d.*; import com.sun.j3d.utils.universe.*; import com.sun.j3d.utils.geometry.Box; import javax.vecmath.*; import java.awt.*; import javax.swing.*; public class ex78 { public static void main(String[] args) { ex78 test = new ex78(); } public ex78() { JFrame frame = new JFrame(); frame.setSize(500,500); frame.setTitle("ex78"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel cp = new JPanel(); cp.setLayout(null); frame.add(cp); GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas = new Canvas3D(g_config); canvas.setBounds(0,0,250,250); cp.add(canvas); SimpleUniverse universe = new SimpleUniverse(canvas); frame.setVisible(true); ViewingPlatform camera = universe.getViewingPlatform(); camera.setNominalViewingTransform(); Color3f light_color = new Color3f(1.0f,1.0f,1.0f); Vector3f light_direction = new Vector3f(0.2f,-0.2f,-0.6f); DirectionalLight light = new DirectionalLight(light_color,light_direction); BoundingSphere bounds = new BoundingSphere(); light.setInfluencingBounds(bounds); BranchGroup group2 = new BranchGroup(); group2.addChild(light); universe.addBranchGraph(group2); Appearance appearance = new Appearance(); Material material = new Material(); material.setDiffuseColor(0.9f,0.75f,0.75f); appearance.setMaterial(material); Box box = new Box(0.3f,0.3f,0.3f,appearance); BranchGroup group1 = new BranchGroup(); TransformGroup transform_group = new TransformGroup(); transform_group.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); transform_group.addChild(box); group1.addChild(transform_group); universe.addBranchGraph(group1); Transform3D transform1 = new Transform3D(); transform1.setScale(0.2f); transform_group.setTransform(transform1); } }
https://w.atwiki.jp/satoschi/pages/5083.html
Javanese【jav】 ジャワ語 00 Austronesian 01 Malayo-Polynesian 02 Javanese Arabic script【Arab】 Javanese script【Java】 Latin script【Latn】 Pegon script【Zzzz】 《現》living language アメリカ合衆国【US】 インドネシア【ID】 オランダ【NL】 シンガポール【SG】 マレーシア【MY】 言語名別称 alternate names Banyumasan バニュマス語 Djawa Jawa Kawi 方言名 dialect names Banten バンテン方言 Banyumas Cirebon (Cheribon, Tjirebon) チレボン方言 Indramayu インドラマユ方言 Jawa Halus Malang-Pasuruan Manuk Pasisir Surabaya Surakarta (Sawlaw, Solo) Tegal Tembung 表記法 writing Arabic script【Arab?】Pegon script【Zzzz?】 Javanese script【Java?】 Latin script【Latn】 参考文献 references WEB ISO 639-3 Registration Authority - SIL International LINGUIST List Ethnologue Wikipedia ウィキペディア
https://w.atwiki.jp/ce00582/pages/1291.html
import javax.media.j3d.*; import com.sun.j3d.utils.universe.*; import java.awt.*; import javax.swing.*; public class ex51 { public static void main(String[] args) { ex51 test = new ex51(); } public ex51() { JFrame frame = new JFrame(); frame.setSize(500,500); frame.setTitle("ex51"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel cp = new JPanel(); cp.setLayout(null); frame.add(cp); GraphicsConfiguration g_config = SimpleUniverse.getPreferredConfiguration(); Canvas3D canvas = new Canvas3D(g_config); canvas.setBounds(100,100,200,200); cp.add(canvas); SimpleUniverse universe = new SimpleUniverse(canvas); frame.setVisible(true); } }
https://w.atwiki.jp/hiro771009/pages/40.html
JAVA関連 JAVA関連情報 ●JAVA開発時の基本的なルールについて ⇒JAVA開発ルール ●データ型,演算子,キャスト,ラッパークラス,String / StringBuffer / Integerクラス ⇒JAVA基本情報 ●Java言語の基本文法(if,for,switchなどなど) ⇒JAVA基本文法(コピペ利用可能) ●複数の要素(オブジェクト)を表したり、操作するための統一された枠組み 代表的なもの(List、Set、Map) ⇒コレクションフレームワーク ・・・基本説明からMap(Hash,Tree)・List(Array,Linked)の比較など ⇒Listの活用法 ・・・ ArrayListとLinkedListクラスについて ⇒Mapの活用法 ・・・ オブジェクトに名前(キー)をつけて管理するMap(HashMap,TreeMap) ⇒Setの活用法 ・・・ HashSetと他のフレームワークとの組み合わせる場合の用途 ●Java言語のメソッド基本 基本的なメソッドやクラス、継承について ⇒JAVA基本クラス・メソッド(コピペ利用可能) インターフェース、抽象クラス、パッケージについて ⇒JAVAインターフェース、パッケージ ●JavaTips ⇒JAVA TIPS ●お役立ちサイト http //www.alles.or.jp/~torutk/oojava/codingStandard/writingrobustjavacode.html http //www.objectclub.jp/community/codingstandard
https://w.atwiki.jp/playaholic/pages/10.html
Mojavi PHP用のフレームワークの1つ。 Mojavi Controllerクラス Mojavi Requestクラス Mojavi Validate機能 参考URL(外部リンク) Mojavi@TryAangle MVCフレームワークMojaviを使ってみよう MojaviJapan
https://w.atwiki.jp/0x0b/pages/86.html
特徴 思想 Javaを開発する上では、5つの目標があった。 オブジェクト指向プログラミングの方法論を採用する 異なるオペレーティングシステム上で同一のプログラムが動くようにする コンピュータネットワークを扱う機能を標準で備える 遠隔のコンピュータ上にある実行コードを安全に実行できるよう設計する 開発をしやすくするために、従来の C++ などのオブジェクト指向プログラミング言語から良い部分を引き継ぐ ネットワーク機能および遠隔コンピュータの実行コードの実行を実現するために、場合によっては、Javaプログラマは、CORBA や Internet Communications Engine、OSGi のような拡張機能を使う。 オブジェクト指向プログラミング Javaはクラスベースのオブジェクト指向プログラミング言語である。Javaのプログラムは複数のクラスから構成され、プログラムの実行は、各クラスが実体化したオブジェクト群が相互にメッセージをやりとりしながら行われる。Javaでは、実装の単一継承を採用し、一つのクラスが複数のインタフェースをもつことができる。クラスとは、オブジェクト指向においてオブジェクトの設計図にあたるものである。オブジェクトについては後述する。継承とは、既存のクラスを基にして、そのクラスの機能を引き継いだ新しいクラスを定義できることをいう。Javaでは実装の多重継承は採用していない。Javaでは一つのクラスが複数のインタフェースをもてるため、一つのクラスに複数の役割をもたせることができる。 Javaで扱うデータ/オブジェクトの型(データ型)は、強い静的型付けを採用している。静的型付けにより、Javaのコンパイラおよび実行環境が、型同士の整合性を検査することによって、プログラムが正しく記述されていることや、安全に動作することの検証が可能である。 Javaのデータ型には、参照型(reference type)と基本型(プリミティブ型、primitive type)の2種類がある。Javaのオブジェクトはすべて参照型である。Javaの基本型は、単純な構造のデータ(数値、論理値、文字 など)のための型である。Javaの標準ライブラリは、基本型の値をオブジェクトとして扱えるようにするためのラッパクラスを提供している。近年のJava(J2SE 5.0)からは型の扱いに改良が加えられている。 Javaのコンパイラが自動的に基本型のデータとそれに対応する参照型のラッパオブジェクトとの間の変換を行う(オートボクシング/アンボクシング)。これにより、Javaで参照型と基本型の2種類のデータが存在することによる複雑さは、軽減されている。 総称型を使えるようになった。プログラムにおける型変換を減らすことができ、安全性が向上した。総称型は従来の C++ などの言語で実現されていた技術である。 Javaの特徴の一つであるオブジェクト指向プログラミングは、プログラミングおよびプログラミング言語設計の手法をいう。Javaはオブジェクト指向プログラミング言語である。オブジェクト指向の概念に対しては、多くの解釈がなされてきた。一般には、オブジェクト指向を特徴づける重要な考え方は、ソフトウェアで扱うさまざまな種類のデータについて、データとそのデータに関連する手続きを一体化するように、ソフトウェアを設計することである。こうして、データとコードは、オブジェクトと呼ばれる実体に一体化される。オブジェクトとは、状態(データ)と振る舞い(コード)がひとかたまりとなったものと考えることができる。 Java では、オブジェクトの設計図であるクラスに定義する振る舞いを「メソッド」と、状態を「フィールド」(インスタンス変数)と呼ぶ。 オブジェクト指向以前の技術での本質的な問題点は、プログラムにおいて、状態と振る舞いが分離されていたことである。 あるデータ構造を変更する場合、関連してそのデータを処理するコードを変更を行う必要があるという、面倒なことになる。 逆にコードを変更する場合に、関連してそのコードで扱うデータ構造を変更しなければならない場合もあった。 オブジェクト指向に基づいて、これまで分離されていた状態と振る舞いを、オブジェクトに一体化することは、ソフトウェアシステムの設計において堅牢な基盤となる。オブジェクト指向を有効に活用することにより、大規模なソフトウェア開発プロジェクトを管理することの困難さが軽減され、ソフトウェアの品質が向上し、失敗するプロジェクトの数を減らすことができる。 オブジェクト指向のもう一つの目標は、汎用的なオブジェクトを開発することで、プロジェクトをまたがってソフトウェアをより再利用可能にしていくというものである。たとえば、汎用的な「顧客」オブジェクトは、別のプロジェクトにおいても、理論的にはほぼ同一の手続き群を備えるであろう。大きな組織において、その組織の複数のプロジェクトが機能的に共通する基盤層をもつ場合は、なおさらソフトウェアの再利用が重要となる。こうしたことから、ソフトウェアオブジェクトは、さまざまなシステムに組み込み可能であるように、汎用性を備えていることが望ましい。こうすることで、ソフトウェア業界は、既存のしっかりテストされたオブジェクトコンポーネントを活用してプロジェクトを進めることができ、開発期間を大幅に短縮することができる。 一方で、ソフトウェアの再利用性を高めるということには、実践においては、2つの大きな困難を伴う。 真に汎用的なオブジェクトを設計する技法は簡単なことではないため、開発者にはあまり理解されていない プロジェクトでどのような再利用可能なオブジェクトが使えるようになっているかについて、多くの開発者に伝えることができる環境を整える必要がある いくつかのオープンソースコミュニティでは、再利用に伴う問題を軽減するために、オブジェクトやクラスライブラリの開発者に、自分たちが開発した汎用的で再利用可能な開発物についての情報を広報する手段を提供している。 プラットフォーム非依存 Javaのもう一つの特徴はプラットフォームに依存していないことであり、これは、Javaのプログラムがさまざまなハードウェアやオペレーティングシステム上で必ず同じように動く、ということを意味する。一度Javaのプログラムを作成すれば、そのプログラムはどのプラットフォーム上でも動くのである。近年では、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)や Groovy 、Jabaco 、Python(Jython)などのプログラミング言語でプログラムを書くこともできる。 サン・マイクロシステムズのJavaのライセンスは、すべてのJava実行環境の実装は「互換性」を備えるべきであることを要求する。このことに関連して、サン・マイクロシステムズ社とマイクロソフト社との間で法的な争いが起こったことがあった。この法的な争いは、サンが、マイクロソフトのJava実行環境の実装について次のように主張したことによる。 RMI と JNI の機能が無い。 マイクロソフトのプラットフォーム(Windows)に特有の機能を備えている。 サンは訴訟を起こして勝訴し、約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仮想マシンにジャストインタイムコンパイル方式(JITコンパイル方式)を導入する。ジャストインタイムコンパイラは、Javaプログラム(バイトコード)の実行時に、バイトコードをネイティブコードに変換する。 さらに洗練されたJava仮想マシンでは「動的再コンパイル」(dynamic recompilation) を行う。こうした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では世代別ガベージコレクションというより効率的な技術を導入している。 ガベージコレクションを備えていないC++やその他の言語の場合、プログラマが適切にメモリの管理をしなければならない。オブジェクト指向プログラミングをするプログラマは一般に、Javaと同様メモリ内のヒープにオブジェクトを格納する領域を割り当てる。そしてオブジェクトがもはや必要なくなった場合に、必ず明示的にオブジェクトを削除する指示を記述して、そのオブジェクトが使っていたメモリ領域を解放しなければならない。メモリ管理が不十分なプログラムでは、メモリリークが発生する可能性がある。メモリリークとは、不適切な指示などで、解放されなかったメモリ領域が累積していき、利用できるメモリの量が減っていくことで、気づかないうちに大量のメモリを消費してしまう問題が起こり得る。他にも、メモリ領域を解放する際に、解放の指示を重複して行ってしまい、プログラムの実行を不安定にするなどのケースがあり、悪くすると異常終了してしまうこともある。 ガベージコレクション機能は、このような潜在的な問題の多くを未然に防ぐことができる。プログラマは任意の時点でオブジェクトを生成することができ、Java実行環境は生成されたオブジェクトのライフサイクルを管理する責任をもつ。 プログラム(オブジェクト)は、他のオブジェクトへの参照をもち、そのオブジェクトのメソッドを呼び出すことができる。他のオブジェクトへの参照とは、低水準の視点で述べると、メモリ内のヒープという領域上に確保されたそのオブジェクトを指すアドレスのことである。 オブジェクトがどこからも参照されなくなった場合、Javaのガベージコレクション機能が自動的にその「到達不可能なオブジェクト」を削除し、そのメモリ領域を解放することで、解放し忘れた未解放メモリが累積していき利用できるメモリの量が減ってゆくメモリリークを防ぐ。 ただしJavaのガベージコレクション機能は、メモリリークの問題を完全に解消するわけではない。プログラマが、自分のプログラムでもはや必要のないオブジェクトへの参照を保持し続けた場合は、やはりメモリリークが発生する可能性がある。 別の表現で述べると、Javaでは、メモリリークは概念的に高い水準においては、発生する可能性が残っているということである。概念的に低い水準においては、ガベージコレクションが正しく実装されたJava仮想マシンを使えば、メモリリークが発生する可能性は無くなった。全体として、Javaのガベージコレクション機能により、C++の場合と比べると、オブジェクトの生成と削除は、より簡潔になり、潜在的に安全になり、また多くの場合は高速になっている。 C++においても、Javaと同等のメモリ管理の高速性と効率性を実現することは可能ではあるが、先に述べたとおり、複雑な作業で間違いやすく、完璧に行おうとすれば開発期間が非常に長くなり、開発したソフトウェアはかなり複雑で難解になる。たとえば、C++で特定のクラスを対象として、高速実行およびメモリ利用の断片化の最小化を、高水準で達成できるメモリ管理モデルで設計開発する技法があるが、こうした技法は複雑である。 ガベージコレクションの機構は、Java仮想マシンに組み込まれており、開発者からは、事実上隠蔽されている。開発者は、場合にもよるが、ガベージコレクションがいつ起こるか意識しなくて良い。というのも多くの場合、ガベージコレクションの実行は、プログラマが自分で書いたコードによって明示的に起こる何らかの挙動と、必ずしも関連しているわけではないからである。 ネットワーク機能 Javaでは充実したライブラリにより、コンピュータネットワークを使うソフトウェアを、効率良く開発することができる。Javaの初期のバージョンから、TCP/IP(IPv4)のライブラリを備えており、ネットワークでソケット通信を行うソフトウェアを簡単に実装することができた。分散オブジェクト環境のソフトウェアの開発も早い時期からできるようになった。Java RMI もしくは CORBA の分散オブジェクト技術を標準で使うことができる。近年では、標準、拡張その他のライブラリにより、さまざまなネットワークプロトコルを高水準で扱えるようになっている。 FTP(ファイル送受信) HTTP(ウェブによるデータ送受信) SMTP/POP/IMAP、NNTP(電子メール送受信、ネットニュース) SSH、TLS/SSL(セキュアな通信により盗聴やなりすましを防ぐ) SMB(ファイルサーバへのアクセス) ほか 現在では IPv6 も扱えるようになりつつある。 XML 文書を扱う技術とネットワーク機能を有効に組み合わせることにより、高度なシステムやサービスを構築できるようになっている。 セキュリティ Javaでは初期のバージョンから遠隔のコンピュータ上にある実行コード(Javaアプレット)を安全に実行できるよう設計されていた。 Java仮想マシンのバイトコード検証機能により、Javaの実行コードであるバイトコードの文法などが正しいかどうかを検査する。 Java実行環境のクラスローダ機能により、クラス(バイトコード)をロードする際にそのクラスの情報を調べて、安全性を検査する。 Java実行環境のセキュリティマネージャ機能(サンドボックス)により、Javaアプレットが、ユーザによって許可された資源以外の資源に不正にアクセスすることを防ぐ。Java実行環境の既定の設定では、遠隔のコンピュータ上にある実行コード(Javaアプレット)に対して、ローカルにあるファイル等へのアクセスや、アプレットのダウンロード元以外の遠隔コンピュータとの通信を禁止している。 名前空間 avaは、パッケージという名前空間の機構をもつ言語であり、ライブラリおよびアプリケーションソフトウェアに含まれる多数のJavaのプログラム(クラスとインタフェース)を、パッケージの階層構造に分類・整理することができる。名前空間の機構をもたない言語と比べて、多数のクラスとインタフェースの管理が容易となり、クラスとインタフェースの命名についても、既存のクラス/インタフェースとの名前の衝突回避を考慮する労力が、大きく軽減される。 実行形態 avaのバイトコードには複数の実行形態があると考えることができる。ただしいずれのバイトコードも、Java実行環境(JRE)のもとで実行されるという点では、同じと考えることもできる。 Javaアプリケーション ローカルのコンピュータで実行されるJavaプログラム。 Javaアプレット ネットワーク上に置かれウェブブラウザ上で実行できるJavaプログラム。ワンクリックで実行できるため、その動作にはサンドボックス機構のもとで厳しい制限が加えられている。 Javaサーブレット ウェブページを動的に作るJavaプログラム。PerlなどによるCGIに比べ、サーバ側の負荷が低いなどのメリットがある。 JavaServer Pages(JSP) XHTML(HTML)内に記述するJavaプログラム。サーバ側で解釈して動的にウェブページを作り出す。コードの見た目は似ているが、ECMAScript(JavaScript)のようにブラウザ側で実行するスクリプトではない。サーブレットの機能を補完するもの。類似の技術に Active Server Pages(ASP)、ASP.NET、PHP などがある。 Java Web Start Javaアプリケーションを簡単に配備し実行する仕組み。拡張子がjnlpとなっているファイルをウェブブラウザなどでワンクリックしただけで自動ダウンロード、自動インストールを行い、また最新バージョンがあるかをネット上で自動チェックしあれば自動アップデートしてから実行する。Javaアプレットのように実行時にウェブブラウザを必要とすることはない。類似技術としてマイクロソフトのノータッチデプロイメント、ClickOnce がある。 文法 プログラミング言語Javaの文法は、C および C++ から多くを引き継いでいる。このためJavaの文法は、多くのプログラマにとって習得しやすくなっている。 Javaが世に現れる以前は、Cのプログラマが多く、またオブジェクト指向プログラミング言語の中では、C++は広く使われてきた言語の一つだった。しかし Java では、C++ とは違って、言語の基礎的な部分から全体にわたって、オブジェクト指向プログラミングの思想が貫かれている。C++ の文法は、構造化プログラミング、総称的プログラミング(generic programming)、およびオブジェクト指向プログラミングの構文が集まってハイブリッドに構成されている。Javaでは、若干の例外を除き、すべてがオブジェクトであり、すべてはクラス内に記述する。 Hello world 次の節以降では、Hello world プログラムで、Javaプログラムの例を示して説明する。 Hello world プログラムとは、"Hello, world" という文字列をディスプレイなどの出力装置に出力する簡単なソフトウェアプログラムである。プログラミング言語の初学者向けのプログラム例としてよく使われる。 なお先に述べたとおり、Javaには複数の実行形態があると考えることができるので、以降では、それぞれの実行形態における Hello world プログラムを例示する。 例 スタンドアロン(コマンドライン) コマンドライン環境で動くスタンドアロンのJavaアプリケーションの例を示す。Javaでは、他のプログラミング言語と同様に、コマンドライン環境で動くプログラムを簡単に開発できる。 // Hello.java public class Hello { public static void main(String[] args) { System.out.println("Hello, world!"); } } このプログラムについて説明する。 Java のプログラムではすべてを class 内に記述する。コマンドラインのスタンドアロンアプリケーションの場合も同じである。 ソースコードのファイル名は、そのファイルで記述しているクラスの名前に ".java" というサフィクス(接尾辞、拡張子)をつけるという規則で命名する。 このプログラム例では、クラス名は Hello であるため、"Hello.java" というソースファイル名にする必要がある。 コンパイラは、ソースファイルで定義されている各クラスのクラスファイル(バイトコード)を生成する。クラスファイルの名称は、そのクラスの名前に ".class" のサフィクスをつけた名前になる。クラスファイルの生成において、内部クラスの一種である無名クラス(anonymous class)の場合は、クラスファイルの名称は、その無名クラスを含むクラスの名称と整数(0から始まり、無名クラスが複数ある場合は、さらに1、2...と順に付番される)を "$" で連結した文字列に、通常のクラスと同じく ".class" のサフィクスをつけた名前になる。 この例のように、スタンドアロンで実行するプログラム(クラス)では main() メソッドを定義する必要がある。メソッド定義には振る舞いを記述する。この main メソッドのシグニチャ(戻り値、引数)は次のようにしなければならない。戻り値の指定には void キーワードを使う。void は、そのメソッドが何も戻り値を返さないことを示す。 main メソッドは、パラメタ(引数)として1つのStringの配列を受け取らなくてはならない。このString配列の引数の名称は args とすることが慣習となっている。ただし引数として可能な名称であれば他の名称でも構わない。 main メソッドには static キーワードをつけなければならない。static は、そのメソッドがクラスメソッドであることを示す。クラスメソッドは、クラスと関連するメソッドであり、オブジェクトインスタンスに関連するメソッド(インスタンスメソッド)ではない。 main メソッドは public キーワードをつけて宣言する。public は、そのメソッドが他のクラスのコードから呼び出せること、およびそのクラスが他のクラスから呼び出される可能性があることを、示す。ここでの「他のクラス」とは、そのクラスの継承階層に関係なく、他のすべてのクラスを意味する。 印字出力機能は、Javaの標準ライブラリに含まれている。System クラスは public static のフィールド out をもつ。out オブジェクトは、PrintStream クラスのインスタンスであり、標準出力ストリームを表す。PrintStreamクラスのインスタンスである out オブジェクトは、println(String) メソッドをもつ。このメソッドはデータをストリームに出力する。ストリームとは入出力を抽象化した概念である。この場合は、データを画面(out 、標準出力)に出力する。 スタンドアロンプログラムを実行するには、Java実行環境に呼び出す対象となる main メソッドをもつクラスの名前を渡すことによって、Java実行環境に実行を指示する。 UNIXやWindowsの環境の場合は、カレントディレクトリから java -cp . Hello をコマンドラインで入力することで、この例のプログラム(Hello.class にコンパイルされたクラス)を実行することができる。実行する main メソッドをもつクラス名の指定については、Javaアーカイブ(Jar)ファイルの MANIFEST に記述する方法もある。 例 スタンドアロン(Swing) グラフィカルユーザインタフェース(GUI)環境で動く Swing を使ったスタンドアロンのJavaアプリケーションの例を示す。Swing は、Java SE の高度な GUI のウィジェット・ツールキットのライブラリである。 // Hello.java import javax.swing.*; public class Hello extends JFrame { Hello() { setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); add(new JLabel("Hello, world!")); pack(); } public static void main(String[] args) { new Hello().setVisible(true); } } import 文は、コンパイル時にJavaコンパイラに対し、このソースコード内では javax.swing パッケージ内のすべての public なクラスとインタフェースを、パッケージ名をつけないでクラス名/インタフェース名だけで使うことを、伝える。import 文を記述しなくても、javax.swing.JFrame のようにパッケージ名をつけて完全修飾クラス名(FQCN; Fully Qualified Class Name)で使うこともできるが、この例のように import 文を使うことで、単に JFrame のようにクラス名だけで使うことができるようになる。 Hello class extends JFrame の部分では、JFrame クラスを継承して Hello クラスを定義すること(JFrame のサブクラスとすること)を記述している。JFrame クラスは、ウィンドウ終了ボタンをもつタイトルバーの付いたウィンドウ(フレーム)を実装している。 Hello() コンストラクタでは、フレームを初期化している。コンストラクタとは、特殊なメソッドであり、オブジェクトの状態を初期化する処理を記述する。オブジェクトが生成される際に自動的に呼び出される。この例では、main メソッドで Hello オブジェクト(フレーム)を生成する時に呼び出され、Hello オブジェクト(フレーム)の状態を初期化する役割を担っている。なお Java のコンストラクタには、クラス名と同じ名称をつける。オブジェクトの初期化処理が必要無い場合などには、コンストラクタの明示的な定義を省略して良い。 このコンストラクタではまず、JFrame から継承された setDefaultCloseOperation(int) メソッドを呼び出し、タイトルバーのウィンドウ終了ボタンが押された際の既定の挙動を WindowConstants.DISPOSE_ON_CLOSE に設定する。これにより、ウィンドウ終了ボタンが押された際に、フレームが単に不可視になるだけでなく破棄されることになり、Java仮想マシンが終了しプログラムが終了するようになる。 次に、new JLabel で "Hello, world!" の文字列表示のためにラベルオブジェクトを生成して、フレーム(JFrame)の継承元クラス Container から継承された add(Component) メソッドを、このラベルを引数として呼び出して、ラベルをフレーム上に追加配置する。 継承元クラス Window から継承された pack() メソッドを呼び出して、フレームの大きさを調整し、フレーム内のコンポーネント(ラベル)の配置を調整する。 このプログラムが起動される時に、Java仮想マシンは main() メソッドを呼び出す。main メソッドは new Hello() の部分でフレームのオブジェクトを生成する。このオブジェクト生成の際に、先に述べた Hello() コンストラクタの一連の処理が実行される。 次に生成したオブジェクトに対して、その継承元クラス Component から継承された setVisible(boolean) メソッドを、boolean型のパラメタ true を引数として呼び出して、フレームを可視化する。 注意 フレームが一度表示されたら、main メソッドが終了してもプログラムは終了しない。その理由は、AWT のイベントディスパッチングスレッドが終了するのは、すべてのトップレベルの Swing ウィンドウが破棄された後であるためである。 例 アプレット 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); } } !-- Hello.[[html]] -- html head title Hello World Applet /title /head body div applet code="Hello" width="200" height="200" /applet /div /body /html import 文は、コンパイル時にJavaコンパイラに対し、このソースコード内では java.applet.Applet クラスと java.awt.Graphics クラスを、パッケージ名をつけないでクラス名だけで使うことを、伝える。 Hello class extends Applet の部分は、Hello クラス が Applet クラスを継承すること(Hello クラスが Applet クラスのサブクラスであること)を記述している。 Applet クラスは、ホストアプリケーション(アプレットを実行するアプリケーション)上で、アプレットによるグラフィクスの表示やアプレットのライフサイクル制御を支援するフレームワークを提供する。Applet は抽象ウィンドウツールキット(AWT; Abstract Window Toolkit)の Component である。Componentを継承したクラスであるため、Applet は、グラフィカルユーザインタフェース(GUI)を備えており、開発者はイベント駆動プログラミングの作法でアプレットを開発することができる。 Hello クラスは Container スーパークラスから継承された paint(Graphics) メソッドをオーバーライドしている。 オーバーライドとは、スーパークラスで定義された、既定の振る舞いを実装したメソッドや抽象メソッドを、サブクラス側で実装し直すことをいう。 この paint(Graphics) メソッドのオーバーライドにより、Hello アプレットを表示する処理を実装することができる。paint(Graphics) メソッドは、アプレットに Graphics オブジェクトを渡す。アプレットは Graphics オブジェクトを受け取る。Graphics オブジェクトは、アプレットを表示するために使われるグラフィクスコンテクストを表している。 この例では、Graphics オブジェクト(グラフィクスコンテクスト)の drawString(String, int, int) メソッドを呼び出して、アプレット表示域の(65, 95)ピクセル座標(オフセット)で "Hello, world!" 文字列を表示する。 この例では、アプレットは XHTML(HTML)文書内の、applet 要素( applet タグ)が使われている位置に表示される。applet 要素は、3つの属性をもつ。 code="Hello" は、Applet クラスの名前を示す。 width="200" height="200" は、アプレット領域の幅と高さを設定する。 アプレットは、applet 要素の代わりに、object 要素あるいは embed 要素を使っても XHTML 文書に埋め込むことができる。ただし現時点では、ウェブブラウザによるこの2つの要素の扱いは、ブラウザごとに異なることがある[4][5]。 XHTML 1.1 仕様においては applet 要素は廃止され、アプレットを使う場合は object 要素を使うことになる。 例 サーブレット Javaサーブレットは、サーバ側の Java EE の構成要素であり、クライアントから受けた要求(request)に対する応答(response)を生成する。現在、多くの場合はウェブブラウザから要求を受け、応答としてXHTML/HTMLのウェブページを動的に生成する。 // 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!"); } } import 文は、コンパイル時にJavaコンパイラに対し、このソースコード内では java.io パッケージおよび javax.servlet パッケージ内のすべての public なクラスとインタフェースを、パッケージ名をつけないでクラス名/インタフェース名だけで使うことを、伝える。 Hello class extends GenericServlet の部分は、Hello クラス が GenericServlet クラスを継承すること(GenericServlet のサブクラスであること)を記述している。 GenericServlet クラスは、サーブレットの一般的なフレームワークを提供する。サーバ上で、クライアントから送られてきた要求をサーブレットに渡し、サーブレットのライフサイクルを制御する。 Hello クラスは Servlet で宣言された service(ServletRequest, ServletResponse) メソッドをオーバーライドしている。このメソッドは、クライアントからの要求を扱うコードを開発者が記述する場所として、サーブレットフレームワークが開発者に提供しているメソッドである。service(ServletRequest, ServletResponse) メソッドは、 ServletRequest オブジェクトと ServletResponse オブジェクトを Hello に渡す。Hello は ServletRequest と ServletResponse を受け取る。ServletRequest オブジェクトは、クライアントから送られてきた要求を表すオブジェクトである。 ServletResponse オブジェクトは、クライアントに送り返す応答を表すオブジェクトである。 service(ServletRequest, ServletResponse) メソッドの throws ServletException, IOException の部分では、このメソッドが ServletException もしくは IOException の例外を投げる可能性があることを宣言している。これらの例外は、Hello サーブレットの実行中に何らかの問題が起こり、クライアントからの要求に正常な応答を返すことができなくなった場合に投げられる。 setContentType(String) メソッドを呼び出して、クライアントに返すデータの MIME Content-Type を "text/html" に設定する。 getWriter() メソッドを呼び出して PrintWriter オブジェクトを取得する。このオブジェクトを使ってクライアントに返すデータを書き出すことができる。 println(String) メソッドを呼び出して、"Hello, world!" 文字列を応答データとして書き出す。 そして応答データはソケットストリームに書き出され、クライアントに返される。