Javaの文法
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Java言語の文法はJavaプログラムを記述し解釈する方法を定義するルールの集合である。
目次 |
[編集] データ構造
言語は特殊な文法を持つが、配列と文字列はプリミティブ型ではない: それらはjava.lang.Object
に代入できる参照型である。
[編集] 基本データ型
整数型 | |
---|---|
byte | 8-bit 符号付き |
short | 16-bit 符号付き |
int | 32-bit 符号付き |
long | 64-bit 符号付き |
浮動小数点数型 | |
---|---|
float | 32-bit 符号付き |
double | 64-bit 符号付き |
- 注
- 浮動小数点数は決して例外をスローしない
- 0(ゼロ)で割った値はInf(無限大)と等値である
- Infで割った値は0(ゼロ)と等値である。
文字 | |
---|---|
char | 16-bit 符号無しUnicode |
ブール代数 | |
---|---|
boolean | true または false |
- 注
- falseは0(ゼロ)またはnulを表現することはできない
- trueは非ゼロを表現することはできない
- boolean型から非boolean型へのキャストとその逆はできない
- 使用法
- 値はある型から他の型へと変換できる
- 参照に対して基本データ型を渡して使用できる
- その他
- メソッドへは値渡しとなる。
- デフォルトでは0、nullまたはfalseに初期化される。
[編集] リテラル
整数 | |
---|---|
8進数 | 0365, 0[0..7]* |
16進数 | 0xF5, 0x[0..9, A..F, a..f]* |
10進数 | 245, [1..9][0..9]* |
浮動小数点数型 | |
float | 23.5F, 23.5f; 1.72E3F, 1.72E3f, 1.72e3F, 1.72e3f |
double | 23.5, 23.5D, 23.5d; 1.72E3, 1.72E3D, ... |
文字リテラル | |
char | 'a', 'Z', '\u0231' |
文字列リテラル | |
String | "Hello, world" |
エスケープシーケンス | |
Unicode文字 | \u 16進数Unicode文字を表現するときに使用する |
タブ文字 | \t |
後退(Backspace)文字 | \b |
キャリッジリターン(復帰文字) | \r |
改ページ | \f |
バックスラッシュ | \\ |
シングルクォーテーション(単一引用符) | \' |
ダブルクォーテーション(二重引用符) | \" |
ラインフィード(改行文字) | \n |
[編集] 文字列
文字列
String
オブジェクトはイミュータブルである- Stringオブジェクトは生成時に初期化されなければならない
- コンパイラが文字列リテラル (ダブルクォーテーションで囲まれた文字列)を見つけたとき、Stringオブジェクトが生成される
- 演算子 "+" と "+=" は文字列を連結するためにオーバーロードされる
String str1 = "alpha"; String str2 = new String("alpha");
StringBuffer
とStringBuilder
オブジェクトは可変である- StringもStringBufferもどちらももう一方から派生したものではない
StringBuffer str1 = new StringBuffer("beta"); StringBuffer str2 = new StringBuffer(50);
[編集] 配列
- Javaはプリミティブ型、クラス、インタフェースそれぞれの配列型はもちろん、配列の多次元配列をも持つ。
- すべての配列要素は同じ型を引き継がなければならない。
- すべての配列クラスはクラス
java.lang.Object
を引き継ぎ、それらを含む型階層を反映する。 - 配列オブジェクトは配列要素の数を持っている読み取り専用の
length
属性を持つ。 - 配列は実行時に領域確保される。それで配列生成宣言するときの配列のサイズは可変である(むしろ、Cでは定数表現)。
- Java配列は一次元である。多次元配列は言語サポートされているが、配列の配列として扱われる。
// 配列を宣言 - 配列名は「myArray」、 要素の型は "SomeClass" への参照 SomeClass[] myArray = null;
// 配列の領域(サイズ)を確保 myArray = new SomeClass[10];
// または宣言と配列生成を同時に行う SomeClass[] myArray = new SomeClass[10];
// 配列の要素を割り当て (基本データ型は必要ではない) for (int i = 0; i < myArray.length; i++) myArray[i] = new SomeClass();
[編集] 国際化サポート
言語はbyteと文字型とを見分ける。文字は内部でUCS-2で保存されるが、J2SE 5.0以降は、言語はUTF-16とそのサロゲートもサポートする。JavaプログラムソースはそれゆえUnicode文字を持つ。
以下にこのような正しいJavaコードを示す。文字列リテラルだけでなくクラスと変数名にも日本語を使うことができる:
public class こんにちは世界 { private String 文字列 = "こんにちは世界"; }
[編集] 演算子
[編集] 計算
二項演算子 | |
---|---|
文法 | 意味 |
+ | 加算 |
- | 減算 |
* | 乗算 |
/ | 除算 |
% | 剰余 (整数の余りを返す) |
単項演算子 | |
文法 | 意味 |
- | 単項マイナス (符号反転) |
++ | インクリメント (変数の前か後につけることができる) |
-- | デクリメント (変数の前か後につけることができる) |
! | ブール補数演算 |
~ | ビット単位反転 |
(型名) | キャスト |
[編集] 代入
文法 | 意味 |
---|---|
= | 代入 |
+= | 加算と代入 |
-= | 減算と代入 |
*= | 乗算と代入 |
/= | 除算と代入 |
%= | 剰余と代入 |
&= | ビット演算 ANDと代入 |
|= | ビット演算 ORと代入 |
^= | ビット演算 XORと代入 |
<<= | 左シフト(ゼロ埋め)と代入 |
>>= | 右シフト (符号伝達と代入) |
>>>= | 右シフト (ゼロ埋め) と代入 |
[編集] 比較
文法 | 意味 |
---|---|
== | 同値 |
!= | 否定 |
> | 大なり |
>= | 大なりイコール |
< | 小なり |
<= | 小なりイコール |
instanceof | ~のインスタンス |
参照型を使うとき、同値演算子(==と!=)は参照値を比較し、参照オブジェクトの比較を含まない–比較演算子は、二つの参照が同じオブジェクト(またはnull
)を参照しようが、二つのオブジェクトが等価であろうとテストする。.equals(Object)
メソッドはオブジェクトの内容を比較するために使われる。instanceof演算子はオブジェクトがクラスのインスタンスであるかどうかを判定するために使われる。
[編集] 条件式
条件式は複合?:
演算子を使用する。条件演算子とも呼ぶ。文法:
condition ? expression1 : expression2
条件condition
の評価は、それがtrue
であるとき、条件式は式expression1
の値を持ち、そうでない場合は条件式はexpression2
の値を持つ。
例:
String answer = (p < 0.05)? "reject" : "keep"; // これは以下のコードと等価である: String answer; if (p < 0.05) answer = "reject"; else answer = "keep";
[編集] ブール代数
- 短絡回路論理演算(結果が判定するまでオペランドを左から右へと評価する)
- 必要なだけ最小数の式を評価する
- 部分計算 (むしろ完全評価(計算))
文法 | 意味 |
---|---|
&& | AND (左のオペランドがfalseのとき、式はfalseを返し右のオペランドは評価されない) |
|| | OR (左のオペランドがtrueのとき、式はtrueを返し右のオペランドは評価されない) |
! | NOT (論理否定) |
[編集] ビット演算
二項演算子 | |
---|---|
& | AND (完全評価ではブール演算子として使われる) |
| | OR (完全評価ではブール演算子として使われる) |
^ | XOR |
<< | 左シフト (ゼロ埋め) |
>> | 右シフト (符号伝達) |
>>> | 右シフト (ゼロ埋め) |
単項演算子 | |
~ | NOT (ビット反転) |
[編集] 文字列演算子
Syntax | Meaning |
---|---|
+ | 連結 |
+= | 連結と代入 |
[編集] 制御構造
[編集] If ... else
if (expr) { statements; } else if (expr) { statements; } else { statements; }
- expr変数は例"if(String a1 == String a2)"が等しくてもtrueではないと論理値を評価しなければならないが、値を比較する。しかし替わりに、値を比較し、論理的に等価ではないと判断する。
替わりに"if(String a1.equals(String a2))" またはインスタンスの比較を使用する。
[編集] Switch文
switch (expr) { case VALUE: statements; break; case VALUE: statements; break; default: statements; break; }
- expr値はbyte, short, int またはchar型でなければならない。
各々のcase値はユニークなリテラル値でなければならず、変動する変数は使われない。
[編集] forループ
for (initial-expr; cond-expr; incr-expr) { statements; }
[編集] for-each ループ
J2SE 5.0は、コレクションのすべての要素を反復するタスクを非常に簡易化する拡張for文と呼ばれる新しい機能を追加した。そのループ無しでは、反復はコレクションの上で明示的に反復子の宣言をを要求した:
public int sumLength(Set<String> stringSet) { int sum = 0; Iterator<String> itr = stringSet.iterator(); while (itr.hasNext()) { sum += itr.next().length(); } return sum; }
拡張for文はこのメソッドを簡素化する:
public int sumLength(Set<String> stringSet) { int sum = 0; for (String s : stringSet) { sum += s.length(); } return sum }
このループはstringSetに入っている各々のString
を読み、その長さをsumに加算する。
[編集] whileループ
while (expr) { statements; }
[編集] do ... while
do { statements; } while (expr);
[編集] 分岐文
文法 | 意味 |
---|---|
break; | 最も深いループから直ちに脱出する。 |
continue; | ループの次の繰り返し(イテレーション)を継続する。 |
break LABEL | ラベルが付いた文に直ちにジャンプする(ラベル付き文の前で直ちにループを終了する)。 |
continue LABEL | ラベルが付いた文にジャンプする(ラベルが付いた文を再開するかまたはラベル付きループの実行を継続する) |
[編集] 例:
int sum = 0; int i = 1; while (i < 10) { if (i == 3) { continue; //このループ反復の残りをスキップする。 } sum += i; if (sum > 15) { break; // ループを脱出する。 } }
[編集] ラベル
- コロンがついた識別子からなる
- 文を識別または参照するジャンプ文のコードをブロックするために使われる。
- 仮にラベルを故意に除外すると、ジャンプ文は最も深いループを参照する。
例
LABEL1: statement; LABEL2: { statements; }
[編集] 注、"goto" 文について
"goto
" 文はJavaの予約語であるが、Java言語では機能しない。
[編集] オブジェクト
[編集] クラス
Javaは もう一つのクラスまたはインタフェース内で宣言するネスト されたクラスを持つ。ネストされていないクラスは、'トップレベルクラスと呼ばれる。 内部クラスは非staticなネストされたクラスである。
クラスは以下の修飾子で宣言できる:
abstract
– インスタンス化できない。インタフェースとabstract
(抽象)クラスだけがabstract
(抽象)メソッドを持つことができる。abstract
クラスを拡張する具象(非abstract
)サブクラスは引き継がれたabstract
メソッドをオーバーライドしなければならない。修飾子final
と併用することはできない。final
– サブクラスを作らせない。 finalクラスのすべてのメソッドは無条件にfinal
になる。 修飾子abstract
と併用することはできない。strictfp
– クラスやエンクロージングクラスにおいて、全ての浮動小数点演算は厳密な浮動小数点演算動作を使用する。厳密な浮動小数点演算動作は浮動小数点演算が全てのプラットフォームにおいて同じ結果をもたらすことを保証する。
C++文法は要求するが、Javaクラスはセミコロン(";")で終わらせる必要が無いことに注意すること。
[編集] 継承
// 子クラスは親クラスを継承する class ChildClass extends ParentClass { ... }
- クラスのデフォルトでの親クラスは
Object
クラスである。 - クラスは単一の親クラスだけ継承することができる(実装多重継承はできない)。
[編集] スコープ
this
– サブクラス(デフォルト)への参照(i.e.this.someMethod()
)。super
– 親クラスへの参照(i.e.super.someMethod()
)。サブクラスがオーバーライドした、またはサブクラスが隠蔽する継承されたフィールドを持つ、継承されたメソッドにアクセスするためにサブクラスで使う。
[編集] インタフェース
インタフェースは実装の詳細が一切無い抽象クラスである。その目的はクラスの集合がどう使われるかを定義するためにある。共通インタフェースを実行するクラスはインタフェース型のコンテキストで交換可能性を使用することができる。インタフェースはクラスの実装方法を隠蔽する抽象化のコンセプトを強要するのに役立つ。
インタフェースは抽象メソッドとstatic finalフィールドだけを含むことができる。インタフェースメソッドはデフォルト(非実装)でpublic
かつabstract
であり、インタフェースフィールドはデフォルトで public
static
final
である。
Javaは完全に直交の多重継承をサポートしない。C++にある多重継承は、 フィールド、多重スーパークラスから継承したメソッド、多重継承した型を区別する複雑なルールを持つ。実装からインタフェースを分離することにより、インタフェースは少ない複雑性と少ない曖昧さを持つ多重継承の恩恵を大いに与える。インタフェースは実装を含めることができないが、クラスのシグニチャだけを定義するようになって以来、多重継承を禁ずることの価値は多くのコードを冗長にしている。実装も継承される純粋な多重継承と違って、インタフェースを継承しているすべてのクラスは定義されたメソッドを実装しなければならない。
Javaインタフェースは Objective-C規約のコンセプトのような振る舞いをよく見せる。
[編集] インタフェースの実装
クラスは、一つのクラスを継承できることに加えて、implements
キーワードを用いて一つ以上のインタフェースを実装することができる。
interface MyInterface { void foo(); }
interface Interface2 { void bar(); }
class MyClass implements MyInterface { void foo() {...} ... }
class ChildClass extends ParentClass implements MyInterface, Interface2 { void foo() {...} void bar(); ... }
以下の例では、
public interface Deleteable { void delete(); }
Deleteable
インタフェースを実装した非abstract
クラスは引数無しで戻り型がvoid
であるdelete
という名前の非抽象メソッドを定義しなければならない。実装とメソッドの機能は各々のクラスによって決定される。このコンセプトに関して、多くの使用方法がある。例えば:
public class Fred implements Deleteable { // このメソッドはDeleteableインタフェースを満足させる public void delete() { // ここにコードを実装する } public void someOtherMethod() { } }
public void deleteAll(Deleteable[] list) { for (int i = 0; i < list.length; i++) { list[i].delete(); } }
配列上にあるオブジェクトはdelete()
を持つために保証されているため、deleteAll()
メソッドはFred
オブジェクトと他のDeleteable
オブジェクトとを区別する必要がない。
[編集] インタフェースの継承
インタフェースはextends
キーワードを用いて一つ以上のインタフェースを継承することができる。
interface ChildInterface extends ParentInterface, AnotherInterface { ... }
結果としてインタフェースを実装するクラスはメソッドの複合セットを定義しなければならない。
public interface MyInterface { foo(); }
public interface Interface2 extends MyInterface { bar(); }
public class MyClass implements Interface2 { void foo() {...} void bar() {...} ... }
[編集] アクセス修飾子
アクセス修飾子はコードにクラスやクラスメンバのアクセス権を決定する。
[編集] トップレベルクラスアクセス
public
– 定義されたパッケージ外からアクセス可能。- default – 定義されたパッケージ内からのみアクセス可能。
[編集] クラスメンバアクセス
クラスメンバとはフィールド、メソッド、コンストラクタ、クラス内で定義されたネストされたクラスのことである。アクセス権にて制限の強さ順での、クラスメンバのアクセス修飾子:
public
– 任意のクラスからアクセス可能。protected
– 継承されたクラスや同じパッケージ内の他のクラスからアクセス可能。- default – 同じパッケージからアクセス可能。
private
– そのクラスからのみアクセス可能 (内部クラスからのアクセスを含む)。private
宣言されたメンバはサブクラスによって引き継ぐことができない。
メソッドをオーバーライドするとき、メソッドアクセス修飾子はより制限的することができない。さもなければ、親クラスとのインタフェース契約を破壊する。このように、オーバライドされるき、public
メソッドは、デフォルトアクセスを与えられないpublic
とprotected
メソッドによって定義されなければならない。しかしながら、オーバーライドメソッドがそれをより制限的にすることは許される。このように、オーバーライドするときは、デフォルト(パッケージ)アクセスメソッドはprotected
またはpublic
として宣言することができ、 protected
メソッドはpublic
として宣言することができる。
[編集] フィールド
アクセス修飾子に加えて、データフィールドは以下の修飾子によって宣言される:
final
– この値は変更できない。正確には一度だけ初期化されなければならない。イニシャライザ(初期化子)が無いfinalフィールドは ブランクfinalフィールドである—static
なブランクfinalフィールドは最終的にスタティックイニシャライザによって初期化されなければならない。非static
ブランクfinalフィールドは各々のコンストラクタの実行中に初期化されなければならない。volatile
と併用することはできない。static
– クラスのインスタンスではなくクラスに属する。transient
– オブジェクトの永続化の一部ではない。この値はシリアライズによって保存されるべきでも後に復元されるべきでもない。volatile
– 非同期に分割されたスレッドによってアクセスされたことをコンパイラに通知する。final
と併用することはできない。
[編集] 定数
static
とfinal
両方を宣言されたフィールドは事実上、定数である。static
はクラスに関連するフィールドの存在を意味し、final
は一度きりだけ代入されたフィールドであることを意味する。
[編集] 初期化子
イニシャライザ(初期化子)はフィールドのイニシャライザとして同時に実行されるコードのブロックである。
[編集] スタティックイニシャライザ
スタティックイニシャライザ (Static initializers)はstaticフィールドのイニシャライザとして同時に実行されるコードのブロックである。静的フィールド初期化子とスタティックイニシャライザは宣言された順番に実行される。静的初期化はクラスがロードされてから実行される。
static int count = 20; static int[] squares; static { // スタティックイニシャライザ squares = new int[count]; for (int i = 0; i < count; i++) squares[i] = i * i; } static int x = squares[5]; // x には値25が代入されている。
[編集] インスタンスイニシャライザ
インスタンスイニシャライザ (Instance initializers)はインスタンス(非static
)フィールドのイニシャライザとして同時に実行されるコードのブロックである。インスタンスフィールドイニシャライザとインスタンスイニシャライザは宣言された順番に実行される。
インスタンスイニシャライザとインスタンスフィールドイニシャライザはコンストラクタが呼び出されている間に実行される。イニシャライザはスーパクラスコンストラクタの後と、コンストラクタ本体の前に、直ちに実行される。
[編集] メソッド
アクセス修飾子に加えて、メソッドは以下の修飾子で宣言される:
abstract
– クラスで定義されていないメソッドであり、具象(非abstract
)サブクラスによって定義されなければならないメソッドである。static
、final
、native
と併用することはできない。final
– サブクラスによって再定義できないメソッド。インスタンス(非static
) メソッドとして、これは、メソッドは小型化するがコンパイラにメソッド(インライン関数に類似)の拡張を許可する。abstract
と併用することはできない。native
– このメソッドはネイティブなマシン依存コードにリンクする。メソッド本体無しで宣言される。abstract
と併用することはできない。static
– クラスのインタンスではなく、クラスに属する。abstract
と併用はできない。strictfp
– メソッドや内部クラスですべての浮動小数点演算が厳密浮動小数点演算動作を使用する。厳密浮動小数点演算動作はすべてのプラットフォームで同じ結果を返す浮動小数点演算を保証する。synchronized
– メソッド本体実行前にオブジェクトに関連するロックを確保するカレントスレッドを引き起こす。もしそのロックが、現在他のスレッドによって確保されているとき、カレントスレッドはそのロックが解放され、そのスレッドがロックを得られるまでブロックするだろう。
関連オブジェクトはstatic
メソッドに関するClass
オブジェクトであり、非static
メソッドに関するオブジェクトインスタンスである。それがsynchronized
としてabstract
メソッドを許可するが、同期化が実装や宣言ではないもの、実装を持たない抽象メソッドを横断することは無意味である。
private
メソッドはabstract
にできず暗黙のうちにfinal
になっていることに注意せよ。
[編集] 可変引数
Java SE 5.0は、可変引数を要するメソッドのタイプセーフ使用を簡易にする可変引数(varargs) [1]を持つメソッドサポートのシンタックスを追加した。最後の引数は...を付け足すことができ、Javaはすべての引数を配列に詰める:
public void drawPolygon (Point
... points) {…}
メソッドを呼ぶとき、プログラマは、明確にPoint
オブジェクトの配列を作らずに カンマによって簡単にポイントを分割できる。そのメソッドではポイントはpoints[0],、points[1]、etcとして参照される。もし、ポイントが渡されなければ、配列は長さがゼロの配列を持つ。最小の引数を使うことをプログラマに要求することは、それらの引数が、可変引数よりも前に特定できるということである:
// ポリゴンは少なくとも3つの点を必要とする。 public void drawPolygon (Point p1, Point p2, Point p3, Point... otherPoints) {…}
[編集] コンストラクタ
コンストラクタはオブジェクトが割り当てられた後ですぐにオブジェクトを初期化するときに呼ばれる。 典型的に、コンストラクタはnew
キーワードを使用して呼び出されるが、コンストラクタは、java.lang.reflectパッケージによって提供されるリフレクションを使用することでも呼び出すことができる。
アクセス修飾子はコンストラクタを宣言するために使われる修飾子だけがある。
- 可能ならば、オブジェクトは、分割された初期化メソッドに頼ることと対比して、正確で、一度だけ構築される意味深長なオブジェクトであるべきである。
- 慣習では、コピーコンストラクタは、引数としてそれ自身の型をオブジェクトを受け入れるコンストラクタのことであり、データメンバをコピーする。
もし、コンストラクタが明示的に定義されていなければ、コンパイラは暗黙のうちに空の引数無しデフォルトコンストラクタを提供する。
- コンストラクタはオーバーロードできる。
- コンストラクタの最初の文はスーパークラスのコンストラクタ:
super(...);
または同じくクラス内にあるもう一つのコンストラクタ:this(...);
を呼び出すことがある。 - もし、
super(...)
またはthis(...)
が明示的に呼び出されてないときは、コンストラクタ本体が実行される前に、デフォルトのスーパークラスのコンストラクタsuper();
が呼ばれる。
[編集] Object
クラスのメソッド
Object
クラスのメソッドは引き継がれ、すべてのクラスで共有される。
[編集] clone
メソッド
- 詳細はクローン (関数)を参照
Object.clone()
メソッドは現在のオブジェクトのコピーである新しいオブジェクトを返す。クラスは、それがクローンできることをはっきりと示すためにマーカーインタフェースCloneable
を実装しなければならない。
[編集] equals
メソッド
Object.equals(Object)
メソッドはオブジェクトをもう一つのオブジェクトと比較し、ふたつのオブジェクトが同一であるかどうかを示すboolean
型の結果を返す。意味論的には、このメソッドはオブジェクトの内容を比較する。だが一方、同値性比較演算子"==
"はオブジェクトの参照を比較する。equals
メソッドはjava.util
パッケージにあるデータ構造クラスの多くによって使われる。これらのデータ構造クラスのいくつかはObject.hashCode
メソッドにも頼る - 関連 hashCode
メソッド equals
とhashCode
との契約の詳細。
[編集] finalize
メソッド
- 詳細はファイナライザを参照
Object.finalize()
メソッドはガーベッジコレクタがオブジェクトのメモリを解放するまえに一度だけ明示的に呼び出される。クラスはオブジェクトが再生される前に機能しなければならないクリーンナップを機能するためのfinalize
をオーバーライドする。大多数のオブジェクトはfinalize
のオーバーライドを必要としない。
finalize
メソッドが呼ばれる保証は無い。さもないと、finalize
メソッドの命令では多くのオブジェクトが呼ばれるだろう。もしJVMがガーベッジコレクションを機能せずに終了すると、finalize
メソッドが呼ばれない場合、OSはオブジェクトを解放するかもしれない。 finalize
メソッドは、finalize
メソッド呼び出している他のクラスを防ぐために常にprotected
宣言されるべきである。
protected void finalize() throws Throwable { ... }
[編集] getClass
メソッド
Object.getClass()
メソッドはオブジェクトをインスタンス化するために使われたクラスのClass
オブジェクトを返す。クラスオブジェクトはJavaの|リフレクションのクラスをベースにしている。追加されたリフレクションのサポートはjava.lang.reflect
パッケージで提供されている。
[編集] hashCode
メソッド
Object.hashCode()
メソッドは連想配列にオブジェクトを保存するためのハッシュコードとして(int
型の)整数を返す。java.util.Map
インタフェースを実装するクラスは連想配列を提供しhashCode
メソッドを頼る。良いhashCode
実装は安定した(変更されない)ハッシュコードを返し、均等に分布する(ユニークなオブジェクトのハッシュコードユニークになる傾向がり、ハッシュコードは整数値の範囲内で均等に分布する。)。
連想配列はequals
とhashCode
メソッド両方に依存するため、これら二つのメソッドの間には、オブジェクトがMap
に挿入された状態を保持しなければならない重要な契約がある:
- 二つのオブジェクト a と bに関して
-
a.equals(b) == b.equals(a)
でなければならない。- もし
a.equals(b)
ならばa.hashCode() == b.hashCode()
でなければならない。
この契約を維持するために、equals
メソッドをオーバーライドしたクラスはhashCode
メソッドもオーバーライドしなければならない。逆もまた同様である。その結果、hashCode
はequals
として同じプロパティ(またはプロパティのサブセット)をベースとしている。
マップがオブジェクトを持つさらなる契約は、hashCode
と equals
メソッドが、マップに挿入されたオブジェクトを一度も変えない効果である。従って、オブジェクトのイミュータブルプロパティでハッシュ関数をベースとすることは、一般的に良いプラクティスである。
[編集] toString
メソッド
Object.toString()
メソッドはオブジェクトの文字列表現をString
で返すものである。toString
メソッドは、オブジェクトが文字列連結演算子(+
と+=
)で使われるとき、暗黙のうちにコンパイラによって呼び出される。
[編集] wait と notifyスレッドシグナルメソッド
すべてのオブジェクトはスレッドが関連する二つの待ちリストを持つ。一つの待ちリストはオブジェクトに関連するミューテックスロックを得るsynchronized
キーワードによって使われる。もしミューテックスロックがもう一つのスレッドによって確保されたとき、現在のスレッドは、ミューテックスロックを待っているブロックされたスレッドを、リストに追加する。スレッド間にシグナルを送るために使われるもう一つの待ちリストは、wait
、notify
、notifyAll
メソッドを通して遂行される。
wait/notigyの使用はスレッド間のタスクの能率的な強調を与える。あるスレッドがもう一方のスレッドの命令が終わるのを待つ必要があるとき、または、イベント発生まで待つ必要があるとき、スレッドはその実行を一時停止することができ、イベントが発生するときに通知されるために待つ。これはスレッドが短期間で待機し続け、フラグや他の条件指標をチェックするポーリング (情報工学)の契約である。ポーリングは
スレッドがチェックを継続する、より計算量的コストがかかるものと、状態を通知しないスレッドが、チェックする次回まで変わらない鈍感なものとがある。
[編集] wait
メソッド
タイムアウト値を特定する異なる方法でサポートするwait
メソッドには三つのオーバーロードバージョンがある:wait()
、wait(long timeout)
、wait(long timeout, int nanos)
。一つ目のメソッドは、待機がタイムアウトしないことを意味する値がゼロ(0)のタイムアウトを使用する。二つ目のメソッドはタイムアウトのミリ秒を取る。三つ目のメソッドは、1000000 * timeout + nanos
として計算されたタイムアウトのナノ秒をとる。
wait
を呼ぶスレッドはブロック(実行スレッドから除去される)され、オブジェクトの待ちリストに追加される。スレッドは以下の三つのイベントのうち一つが起きるまで、オブジェクトの待ちリストは留まる:
- もう一つのスレッドはオブジェクトの
notify
またはnotifyAll
メソッドを呼ぶ。 (詳細に関しては下の関連 notifyメソッド を見よ)。 - もう一方のスレッドがスレッドの
interrupt()
メソッドを呼ぶか、または、 - 非ゼロタイムアウト は無効な
wait
の呼び出しで指定される。
wait
メソッドは、ブロック内またはオブジェクトのメソッド同期で呼ばれなければならない。これはwait
とnotify
との間で競合を起こさないための予備である。スレッドが待ちリストに置かれたとき、スレッドはオブジェクトのミューテックスロックを解放する。スレッドが待ちリストから除去され実行スレッドのセットに追加された後で、それは実行を継続する前にオブジェクトのミューテックスロックを得る。
[編集] notify
とnotifyAll
メソッド
Object.notify()
と Object.notifyAll()
メソッドはオブジェクトの待ちリストからひとつ以上のスレッドを除去し、それらを実行スレッドのセットに追加する。notify
は待ちリストからシングルスレッドを除去するが、notifyAll
は待ちリストからすべてのスレッドを除去する。スレッドがnotify
によって除去されることは特定されず、JVM実装に依存しない。
通知メソッドはブロックまたはオブジェクトの同期をとるメソッド内で呼ばれなければならない。これはwait
とnotify
との間で競合を起こさないための予備である。
[編集] 入出力
- 関連項目: Java Platform, Standard Edition#java.io と New I/O
J2SE1,4前のJavaのバージョンはストリーム・ベースのブロッキングI/Oのいをサポートしていた。これはアクティブスレッドが入出力待機するをブロックする場所得る他の処理が無いもとして、扱われるストリームによってスレッドを要求した。これは、Javaネットワークサービスを実装する必要があるものにとって重要な拡張性と性能問題であった。J2SE1.4でNIO(New I/O)の導入以来、この拡張性問題は非ブロッキングI/Oフレームワーク(だが、サンによって実装されるNIO APIには多くの未解決の問題がある)の導入によって改正された。
非ブロッキングIOフレームワークは、独自のブロッキングIOフレームワークよりもかなり複雑だがシングルスレッドによって扱われる多くの"チャネル"を与える。フレームワークはReactorパターンをベースとしている。
[編集] 実行コード
[編集] アプリケーション
public class MyClass { public static void main (String[] args) {...} ... }
[編集] アプレット
- 詳細はJavaアプレットを参照
// MyApplet.java import java.applet.*; public class MyApplet extends Applet { init() {...} // ブラウザが最初にアプレットを読み込むときに呼ばれる。 destroy() {...} // ユーザがブラウザを終了するときに呼ばれる。 start(){...} // アプレットを実行し始めるときに呼ばれる。 stop() {...} // ユーザがウェブページを去るとき、再読込するとき、 // ブラウザを終了するときにに呼ばれる。 } <applet code="MyApplet" width="200" height="200"> </applet>
[編集] appletタグの埋め込み
- HTMLアプレットタグはアプレットソースコードに埋め込むことができる。
- アプレットタグに含まれるものは、.htmlファイルを必要とせずとも、簡易アプレットビューアによって直接実行されるアプレットを許可する。
- 典型的に、アプレットタグは直ちにimport文に従う。
- それは/* */コメントによって囲まれていなければならない。
It must be enclosed by /* */ comments.
// MyApplet.java ... /* <applet code="MyApplet" width="200" height="200"> </applet> */ ...
[編集] サーブレット
- 詳細はJava Servletを参照
[編集] JSP (JavaServer Pages)
- 詳細はJavaServer Pagesを参照
- ウェブページにJavaコードを埋め込む形態。
- JSPタグはウェブサーバで処理され、出力結果(一般的にHTMLやXML)はクライアントに送信される。
- JSPコードは実行される前にJava Servletにコンパイルされる。
- JSPはJava Servletの拡張である。
- JSPタグの使用法はPHPやASPのタグの使用方法と類似する。
[編集] JSPタグ
文法 | 意味 |
---|---|
<% Java構文 %> | スクリプトレット |
<%= 単一Java構文の出力 %> | 構文 |
<%! Java宣言文 %> | 宣言 |
<%@ [page, include, taglib] JSPディレクティブ %> | ディレクティブ |
[編集] その他
[編集] ケースセンシビティ (大文字小文字区別)
Javaはケースセンシティブ (大文字小文字を区別する) である。
[編集] コメント
// 一行コメント
/* 複数行 コメント */
/** * この行はクラス、インタフェース、メソッド、データメンバ宣言の直前に記述する。 * このコメントはクラスのドキュメンテーションを自動生成する * ユーティリティで使用することができる。 */
[編集] 関連項目
[編集] 参考文献
- James Gosling, Bill Joy, Guy Steele, and Gilad Bracha, The Java language specification, third edition. Addison-Wesley, 2005. ISBN 0-321-24678-0.
- Patrick Naughton, Herbert Schildt. Java 2: The Complete Reference, third edition. The McGraw-Hill Companies, 1999. ISBN 0-07-211976-4
- Vermeulen, Ambler, Bumgardner, Metz, Misfeldt, Shur, Thompson. The Elements of Java Style. Cambridge University Press, 2000. ISBN 0-521-77768-2
[編集] 外部リンク
[編集] サン・マイクロシステムズ
- Official Java home site
- The Java Language Specification, Third edition Authoritative description of the Java language
- Java SE 6 API Javadocs
- The Java Tutorial
- New features in J2SE 1.5.0
Java | |
---|---|
主要 テクノロジ |
Java言語 | Javaプラットフォーム | Java Development Kit | Java仮想マシン | Java Runtime Environment | Javaコンパイラ | Enterprise JavaBeans | Java Message Service | Java Transaction API | Java3D | JDBC | Java Web Start |
歴史 | Javaバージョンの歴史 | Java批評 | Java Community Process | サン・マイクロシステムズ |
言語機能 | バイトコード | 文法 | Applet | Servlet | JavaServer Pages | Java Foundation Classes | Java予約語 | パッケージ | JAR | Javadoc |
Java関連技術 | Jakarta Project | Apache Tomcat | NetBeans |