予約語 (Java)
出典: フリー百科事典『





(







)』
この項目ではJavaにおける予約語(よやくご)に関して説明する。
この項目は、プログラムの細かい説明には立ち入らず、他の言語の予約語と比較できるような説明を目的としている。
なお、文中のメンバとは、フィールド(クラス内のグローバル変数に相当する)、メソッド(手続き、関数に相当する)、コンストラクタ(オブジェクト指向言語に備わるオブジェクトを生成するときの手続き)のことを指す。
目次 |
[編集] Java言語の予約語の特徴
[編集] 原始型(プリミティブ型)を表す予約語
Javaでは、原始型(プリミティブ型)を表す予約語にC言語と共通の予約語を使用している。
- byte, char, short, int, long, float, double
- boolean, true, false
(注:true と false はJavaのキーワード(予約語)ではありません。ノート:予約語 (Java)#原始型(プリミティブ型)を表す予約語を参照してください。)
- void
- 戻り値のないメソッドで使用。
[編集] 基本的な制御に関する予約語
C言語と共通の予約語を使用している。
- 分岐
- if, else
- switch, case, default
- 繰り返し
- for, while, do
- ジャンプ
- continue - ループの先頭に戻る
- break - ループのブロックから抜け出す
- return - メソッドから抜け出す。戻り値のあるものは値やオブジェクトの参照を返す。
[編集] クラス、パッケージに関する予約語
- package
- import
- 自クラスの所属するパッケージとは異なるパッケージにあるクラスを使用するときにこの宣言でインポートする。
- class
- クラスの定義。例えば、以下のように宣言する。各予約語についてはこの後、説明する。
例1 public class クラス名 { ... }例2 public class クラス名 extends 親クラス名 { ... }例3 public class クラス名 implements インタフェース名1,インタフェース名2, ... { ... }例4 public class クラス名 extends 親クラス名 implements インタフェース名1, ... { ... }- interface
例1 public interface インタフェース名 { ... }例2 public interface インタフェース名 extends スーパーインタフェース名1,スーパーインタフェース名12, ... { ... }- extends
- class の宣言で他のクラスを継承するときに使用する。Javaでは1つのクラスのみ継承可能で多重継承はできない。interfaceの宣言では複数のインタフェースを継承するときに使用する。インタフェースがインタフェースを継承するだけなので、こちらの場合は多重継承が可能。
- implements
- class の宣言で、インタフェースを実装するときに使用する。こちらは複数のインタフェースをカンマ区切りで実装することができる。
- this
- super
- new
- コンストラクタの呼び出し。オブジェクトを生成するときに使用する。
例: Sample s = new Sample()
- null
- 何も参照していない状態を表す。
- instanceof
- 指定されたクラスのオブジェクトかどうかを判定する。a instanceof (クラス名) とした場合、a が (クラス名) のオブジェクトか、そのサブクラスのオブジェクトであれば true になる。(クラス名) のところにオブジェクトの変数名を記述することはできない。
[編集] 修飾子
クラス、メンバの宣言に付けられる修飾子である。
- public, protected, private
- クラス、メンバのアクセス制御を指示する修飾子である。外部からアクセス可能な範囲を決める。Javaでは4つの段階が設けられ、番号が大きくなるほど外部からのアクセスが制約される。
- public では、すべてのクラスから見える(アクセス可能である)。
- protected では、同一パッケージにあるクラスかサブクラスからのみ見える。異なるパッケージでサブクラスでないクラスからはアクセスできない。クラスを修飾することはできない(内部クラスは例外)。
- アクセス制御の修飾子がない場合は、同一のパッケージ内のクラスからのみ見える。サブクラスであってもパッケージが異なる場合はアクセスできない。このときクラスにpublic修飾子がないものを「パッケージプライベート」と呼ぶ。
- private では、自クラス内でのみ見える。外部からはアクセスできない。クラスに修飾することはできない(内部クラスは例外)。
- Java SE1.0ではprivate protectedという組み合わせを使用して、自分自身とサブクラスからのアクセスができたが同じパッケージ内の他のクラスからはアクセスできないという複雑なアクセス権を使用することができたが、これはJava SE 1.1以降から廃止され利用することができなくなった。
- クラス、メンバのアクセス制御を指示する修飾子である。外部からアクセス可能な範囲を決める。Javaでは4つの段階が設けられ、番号が大きくなるほど外部からのアクセスが制約される。
- final
- フィールドに付けられた場合は定数であることを表す。メソッド宣言に付けられた場合は、サブクラスでオーバーライドできないことを表す。クラス宣言に付けられた場合は、継承できないことを表す。なお、Javaでは、final宣言されたフィールドで、宣言部では初期化せずコンストラクタ内で1回だけ代入できる記述も行える。abstractとの併用はできない。メソッドの引数やローカル変数に使用すればその引数やローカル変数を変更できない定数とした堅牢性の高いメソッドを作ることができる。final修飾子は「イミュータブル(不変)」なクラスを実装するときに役立つ。
例1 final int constantvalue = 5;
例2 final int constantvalue; //初期化なし ... public Sample(){ //コンストラクタ constantvalue = 5; //1回だけ代入できる。 }- static
- フィールドに付けられた場合は、クラスに属する変数が確保されることを表す。クラスにつけることはできない(内部クラスは例外)。この修飾子のついたフィールドは、オブジェクトがいくつも生成されてもフィールドの実態は1つで、すべてのオブジェクトから共有される。
記述例: static final String STR = "constant";
例 public class Sample1 { public static void method{...} //static なメソッド } public class Sample2 { void proc(){ ... Sample1.method(); //インスタンスを生成せず直接実行できる。 ... } }- static {...}というブロックが現れた場合は、そのクラスを最初に呼び出されたときにそのブロック内のコードを実行する。これはスタティックイニシャライザと呼び、主にstatic finalな配列や
Collectionオブジェクトの初期化などに利用される。データベースにアクセスするためにJDBCドライバを呼び出すClass.forName("ドライバ名")もこのスタティックイニシャライザを呼び出している。
- static {...}というブロックが現れた場合は、そのクラスを最初に呼び出されたときにそのブロック内のコードを実行する。これはスタティックイニシャライザと呼び、主にstatic finalな配列や
例 public class StaticSample { private static final List<String> list; static{ List<String> tempList = new ArrayList<String>(); tempList = new ArrayList<String>(); tempList.add("Hello,"); tempList.add("World."); StaticSample.list = Collections.unmodifiableList(tempList); } }- abstract
- 実装がないメソッドおよびクラスに付けられる修飾子である。finalと併用することはできない。Javaでは、インスタンスを作成できない、一部実装がなされていないクラスを作成することができる。似たものとしてインターフェイスがあるが、abstract class では、1) コンストラクタを持つことができる点、2) メソッドなどの実装が記述ができる点 3) インスタンスフィールドを持つことができる点が異なる。abstract class はそのままでは使用できず、サブクラスで不足しているメソッドを実装したクラスを用意して使用する。
記述例: public abstract class Sample { public void method1(){ //実装のある記述 } public abstract void method2(); //実装がないメソッド }- native
- Java以外で書かれたモジュールなどにアクセスするときに使用する。
- synchronized
記述例:1 public synchronized void method(){...} 記述例:2 public void method(){ ... synchronized(this){ //自クラスのインスタンスに対して排他制御 //排他制御されるブロック } ... } 記述例:3 public void method(Object o){ ... synchronized(o){ //Object o に対して排他制御 //排他制御されるブロック } ... }- volatile
- フィールドの宣言に付けられ、排他制御を指示する。
例 public class Sample { volatile SyncSample s; ... }- transient
[編集] 例外処理
例外処理はC言語にはない。C++ではほぼ共通の予約語が使用されている。 但しfinallyはC++には存在せず、throwsもC#には存在しない。
- try, catch, finally
- 例外が発生しうる箇所で使用する。tryブロック(
try{と}との間)で例外が発生しうるコードを囲み、catchブロック(catch(Throwableのサブクラス 例外オブジェクト){と}との間)に例外発生後の処理を書く。finallyブロック(finally{と}との間)には、ファイルのクローズ、データベースセッションの切断、ログアウトなど、例外発生の有無にかかわらずtry/catchブロック内の処理を終了する前に必ず実行しておきたいコードを書く。catchを記述した場合finallyは省略可能であり、finallyを記述した場合catchは省略可能である。try/catchブロックとfinallyブロックの両方にreturn文がある場合、後者が優先される。catchブロックにはif-else-if文のように連続して捕捉したい例外を記述することができる。ただし、例外記述順序は最初に具象例外クラスを記述し、徐々に抽象化してゆき、最後にExceptionクラスを記述するようにすべきである。先に抽象的な例外クラスを記述すると、そのサブクラスもそこで捕捉されてしまうからである。
- 例外が発生しうる箇所で使用する。tryブロック(
- throw
- 例外を発生させる。
- throws
- メソッドの宣言で使用される。そのメソッドがどのような例外をスローするかを列挙する。Javaにおける例外の種類には大きく分けて throws の明示が必要な例外と記述を省略可能な例外がある。前者は主にファイルエラーなどプログラムの動作中にその都度対応すべき例外で、後者は主に開発・デバッグの段階で対処すべき例外あるいは深刻な例外である。
記述例:public void method() throws Exception{ // 例外をスローすることを宣言 try { ... if (err) throw new IOException(); //例外を発生させる。 //1) 正常終了 //このtryブロックにはreturn文を記述することもできる。 //但し、finallyブロックにすでにreturn文があるときは //ここにreturn文を書いてもfinallyブロックのreturnが優先される。 } catch(IOException e) { // IOException は Java の例外クラスの1つ //2) エラー処理 //このcatchブロックにはreturn文を記述することもできる。 //但し、finallyブロックにすでにreturn文があるときは //ここにreturn文を書いてもfinallyブロックのreturnが優先される。 } catch(Exception e) { //IOException よりも上位(親)の例外クラス //3) 例外をさらに外のブロックにスローする。 throw e; } finally { //例外発生の有無にかかわらず、1) 2) 3) どの場合でもこのブロックは //必ず処理される。ここにreturn文があるときはtry/catchブロックにも //return文があろうともこちらのreturn文が優先される。 ... }}[編集] 追加された予約語
J2SE 1.4でassertが追加され、J2SE 5.0でenumが追加された。
[編集] その他の予約語
const, goto が予約されているが、Javaでは使用できない。使用するとコンパイルエラーになる。 StrictMathクラスにも使われている、浮動小数点演算の精度を高めるstrictfpも予約語である。現在ではJavaの浮動小数点演算ではこのstrictfp修飾子を使わなくもほぼ高い精度を得ることができるが、strictfpを付与した場合は相異なるプラットフォーム同士の間でも演算結果が一致することが保証される。
| ||||||||||||||
[記事全文]






® は 












