削除された内容 追加された内容
sty
編集の要約なし
(同じ利用者による、間の3版が非表示)
22行目:
}}
{{プログラミング言語}}
'''Java'''(ジャバ)は、狭義では[[プログラミング言語]]としてのJavaを指し、広義ではJava言語を中心よるした[[プラットフォーム (コンピューティング)|コンピューティング・プラットフォームも含む]]を意味する<ref>[https://www.java.com/en/download/faq/whatis_java.xml What is Java and why do I need it?]</ref>。後者はJavaプラットフォームと呼ば、その関連技術Javaテクノロジー」と総称されている<ref>[https://docs.oracle.com/cd/E26537_01/tutorial/getStarted/intro/definition.html About the Java Technology (The Java? Tutorials &gt; Getting Started &gt; The Java Technology Phenomenon)]</ref>。Javaの構文は[[Javaプラットフォーム]]はJavaC言語仕様だけでなく、[[Javaクラスライブラリ]]や[[Java仮想マシン]]、[[Java SE]]や[[Java EE]]といった[[Application Programming Interface|API]]セット、さらは開発環境である[[Java Development Kit|JDK]]や実行環境である[[Java Runtime Environment|JRE]]などを含む<ref>[https://docs.oracle.com/javase/jp/7/technotes/guides/index.html Java™ プラットフォームの概要]</ref>。言語機能と類似しており[[C++]]<!-- C言語ではない。また、構文やキーワードはC++の影響を受けているが、言語仕様はほとんど別物。 -->の構文をベースにした[[オブジェクト指向]]の[[プログラミングパラダイム]]や、[[並行計算|並行コンピューティング]]が主な[[プログラミングパラダイム、[[ガベージコレクション|パラダイム]]による自動メモリ管理などをとして導入されている<!-- GCは機能でありプログラミングパラダイムではない。 -->。Javaテクノロジ主な目標のひとつは、従来のソフトウェアが抱えていた[[移植性]]問題の解決であった。''"[[Write once, run anywhere]]"''(一度書けばどこでも動く)を[[キャッチコピー]]とし、ハードウェア特定の環境に依存せず、あらゆるしない理想的な[[クロスプラットフォーム (コンピューティン]]・プロ)|プットフォー]]の実現を目指して公開された<!-- 吸収層サン社対象目標ハードウェアだけでなく、オペレーティン一度書いたプロシステどのプラットフォームも含まれる。 -->電子機器上でも共通かせ作す[[クロスプラットフォーム]]なプログラムの開発・事であり、実行環境の実現を目指して開発された環境は関係ないです -->
 
Javaプログラムは[[Javaバイトコード|特殊なバイトコード]]と呼ばれる中間言語([[中間表現]])に[[コンパイラ|コンパイル]]されて、[[Java仮想マシン]]と呼ばれるソフトウェア上で実行される。各プラットフォコンピュタ環境に対応したJava仮想マシンがハードウェア間の差異を吸収し、特定の環境に依存しないプログラム動作を実現する仕組みとなっている。Java登場初期の対象であった家電機器の[[組み込みシステム]]を始め、[[パーソナルコンピュータ]]、[[モバイル端末]]、[[サーバー (コンピューター)|サーバーマシン]]、[[スーパーコンピュータ]]まで、さまざまといった様々な環境にJavaソフトウェアは普及している<!-- パソコンやスパコンは略語・俗語であり、特に導入部で安易に使うべきではない。 -->。
 
Javaの開発元であったは、1995年に[[サン・マイクロシステムズ]]は、社によって公開された。2010年にサン社は[[オラクル (企業)|オラクル]]に吸収合併され、Javaの各種権利(特許、著作権、ライセンス)オラクルそちらに移行した<!-- Java。おおよそ数年おきに言語仕様開発者は改訂が重ねられており、2019年3月現在の最新メムズ・ゴスリバージョ一人だけでない。また初期リリースは19952018だが、9月25日に公発着手はもっされた第11版前。導入部には長々と書くべきではって。[[Wikipedia:スタイルマニュアル (導入部)]] -->
 
== 特徴 ==
407行目:
== Java言語の構文 ==
{{main|Javaの文法}}
Javaの構文は、[[C言語]]または[[C++]]と類似している。Javaプログラムは目的環境に従い、コマンドライン、GUI、アプレット、サーブレットといったアプリケーション形態に派生する。初心者向けの代表的なサンプルコードである「[[Hello world]][[プログラム (コンピュータ)|表示プログラム]]」によって各形態のコーディング実例を以下に示す。
構文は、[[C言語|C]]および[[C++]]から多くを引き継いでいる。このため、設計当時には割合として多かった、CやC++しか書けない[[プログラマ]]にも習得しやすいと、{{要出典範囲|date=2017年10月|メーカーや信者は宣伝した}}。Javaが設計された1990年代中旬以前は、Cのプログラマが多く、また[[オブジェクト指向プログラミング言語]]の中では、[[C++]]は広く使われてきた言語の一つだった。
 
なお、JavaではC++と違って名前空間レベルの関数(メソッド)および変数(フィールド)の宣言および定義を許可しておらず、必ず何らかのクラス定義の中に記述することが特徴である。この特徴は後発の[[C Sharp|C#]]も踏襲している。
 
=== Hello world ===
次の節以降では、[[Hello world]][[プログラム (コンピュータ)|プログラム]]で、Javaプログラムの例を示して説明する。
 
Hello worldプログラムとは、"Hello, world" という文字列をディスプレイなどの出力装置に出力する簡単なソフトウェアプログラムである。プログラミング言語の初学者向けのプログラム例としてよく使われる。
 
なお先に述べた通り、Javaには複数の実行形態があると考えることができるので、以降では、それぞれの実行形態におけるHello worldプログラムを例示する。
 
=== 例: スタンドアロン(コマンドライン) ===
[[キャラクターユーザインタフェース|コマンドライン]]環境で動く[[スタンドアローン|スタンドアロン]]の[[Javaアプリケーション]]の例を示す。Javaでは、他のプログラミング言語と同様に、コマンドライン環境で動く[[プログラム (コンピュータ)|プログラム]]を簡単に開発できる。
 
=== 例: スタンドアロン(コマンドライン) ===
<source lang="java">
// Hello.java
430 ⟶ 419行目:
</source>
 
*全てのコードはclass内またはinterface内に記述される。
このプログラムについて説明する。
*ソースコードのファイル拡張子はjavaとなる。ここではクラス名がHelloなのでソースファイル名はHello.javaとする。
*Javaのプログラムではすべてを<code>'''class'''</code>内に記述する。コマンドラインのスタンドアロンアプリケーションの場合も同じである。
*コンパイルされたソースファイルは、バイトコードファイルに変換される。その拡張子はclassとなる。ここでのバイトコードファイル名はHello.classとなる。
*[[ソースコード]]の[[ファイル (コンピュータ)|ファイル]]名は、そのファイルで記述している[[クラス (コンピュータ)|クラス]]の名前に ".java" というサフィクス(接尾辞、[[拡張子]])を付けるという規則で命名する。
*プログラムはmainメソッドから実行される。mainメソッドは任意のクラス内に一つだけ定義する。他のクラスにも定義されているとコンパイルエラーとなる。
*:このプログラム例では、クラス名は<code>'''Hello'''</code>であるため、"Hello.java" というソースファイル名にする必要がある。
*mainメソッドにはString配列の引数が渡される。Stringは文字列オブジェクトである。OS側はプログラム実行時のパラメーターのそれぞれをStringオブジェクトにして配列に格納しmainメソッドの引数とする。引数名はargsとするのが標準である。プログラマは引数として渡されたString配列から実行時パラメーターを読み出す。
*[[コンパイラ]]は、ソースファイルで定義されている各クラスの[[Javaクラスファイル|クラスファイル]]([[バイトコード]])を生成する。クラスファイルの名称は、そのクラスの名前に ".class" のサフィクスをつけた名前になる。
*mainメソッドはリターン値を返さないので、voidとする。
**クラスファイルの生成において、内部クラスの一種である無名クラス (anonymous class) の場合は、クラスファイルの名称は、その無名クラスを含むクラスの名称と整数(0から始まり、無名クラスが複数ある場合は、さらに1、2...と順に付番される)を "$" で連結した文字列に、通常のクラスと同じく ".class" のサフィクスを付けた名前になる。
*mainメソッドはクラスメソッドなので、staticとする。
*この例のように、スタンドアロンで実行するプログラム(クラス)では<code>'''main()'''</code>[[メソッド (計算機科学)|メソッド]]を定義する必要がある。メソッド定義には振る舞いを記述する。このmainメソッドのシグニチャ(戻り値、引数)は次のようにしなければならない。
*mainメソッドはクラス内外の全領域から呼び出し可能な、publicとする。
**戻り値の指定には<code>'''void'''</code>キーワードを使う。<code>void</code>は、そのメソッドが何も戻り値を返さないことを示す。
*'''{{Javadoc:SE|java/lang|System}}'''クラスは使用OS環境のAPIを直接扱うクラスである。そのクラスフィールドである'''{{Javadoc:SE|name=out|java/lang|System|out}}'''はコンソール出力系APIを扱うPrintStreamクラスのインスタンスである。このoutからPrintStreamクラスのprintlnメソッドをコールして、パラメータとして渡す文字列をコンソール画面に表示させる。
**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アプリ) ===
[[グラフィカルユーザインタフェース]] (GUI) 環境で動く [[Swing]]を使った[[スタンドアローン|スタンドアロン]]の[[Javaアプリケーション]]の例を示す。Swingは、[[Java Platform, Standard Edition|Java SE]]の高度なGUIの[[ウィジェット・ツールキット]]の[[ライブラリ]]である。
 
478 ⟶ 462行目:
*注意: フレームが一度表示されたら、<code>main</code>メソッドが終了してもプログラムは終了しない。その理由は、AWTのイベントディスパッチング[[スレッド (コンピュータ)|スレッド]]が終了するのは、すべてのトップレベルのSwingウィンドウが破棄された後であるためである。
 
=== 例: アプレット ===
[[Javaアプレット]]は、他のアプリケーションに埋め込まれるプログラムである。多くの場合は、[[ウェブブラウザ]]に表示される[[ウェブページ]]に埋め込まれる。
 
548 ⟶ 532行目:
*アプレットは、<code>applet</code> 要素の代わりに、<code>object</code> 要素あるいは <code>embed</code> 要素を使っても XHTML 文書に埋め込むことができる。ただし現時点では、[[ウェブブラウザ]]によるこの2つの要素の扱いは、ブラウザごとに異なることがある[http://java.sun.com/docs/books/tutorial/deployment/applet/applettag.html][http://java.sun.com/docs/books/tutorial/deployment/applet/mixedbrowser.html]。 XHTML 1.1 仕様においては <code>applet</code> 要素は廃止され、アプレットを使う場合は <code>object</code> 要素を使うことになる。
 
=== 例: サーブレット ===
[[Java Servlet|Javaサーブレット]]は、[[サーバ]]側の[[Java Platform, Enterprise Edition|Java EE]]の構成要素であり、[[クライアント (コンピュータ)|クライアント]]から受けた要求 (request) に対する応答 (response) を生成する。現在、多くの場合は[[ウェブブラウザ]]から要求を受け、応答として[[Extensible HyperText Markup Language|XHTML]] / [[HyperText Markup Language|HTML]]の[[ウェブページ]]を動的に生成する。
 
600 ⟶ 584行目:
 
;Javaクラスライブラリ
 
それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。
Javaクラスライブラリは、普遍的に呼び出される特定の機能を実装したクラスの集合体である。Javaプログラムはライブラリ内のクラスを逐次呼び出しながら処理を実行する。なお、それぞれのJavaクラスライブラリ内部からプログラマの利用に向けて外部公開されている部分を「Java API」と呼ぶ。
 
* 言語基盤ライブラリ - Java言語の基本部分を