予約語 (Java言語)
出典: フリー百科事典『ウィキペディア(Wikipedia)』
この項目ではJava言語における予約語(よやくご)に関して説明する。
この項目は、プログラムの細かい説明には立ち入らず、他の言語の予約語と比較できるような説明を目的としている。
なお、文中のメンバとは、フィールド(クラス内のグローバル変数に相当する)、メソッド(手続き、関数に相当する)、コンストラクタ(オブジェクト指向言語に備わるオブジェクトを生成するときの手続き)のことを指す。
目次 |
[編集] Java言語の予約語の特徴
- Javaには50の予約語がある。
- 原始型の予約語や分岐処理(if, switch)、反復処理(for, while)などの基本的な予約語はC言語とほぼ共通で親和性が高い。また、予約語以外でもメソッドなどのブロックに { } を用いる点や多くの演算子でもC言語と共通している。
[編集] 原始型(プリミティブ型)を表す予約語
Javaでは、原始型(プリミティブ型)を表す予約語にC言語と共通の予約語を使用している。
- byte, char, short, int, long, float, double
- boolean, true, false
- void
- 戻り値のないメソッドで使用。
[編集] 基本的な制御に関する予約語
C言語と共通の予約語を使用している。
- 分岐
- if, else
- switch, case, default
- 繰り返し
- for, while, do
- ジャンプ
- continue - ループの先頭に戻る
- break - ループのブロックから抜け出す
- return - メソッドから抜け出す。戻り値のあるものは値やオブジェクトの参照を返す。
[編集] クラス、パッケージに関する予約語
- package
- 自クラスのパッケージを宣言する。Javaではパッケージと呼ばれるツリー構造でクラス群を分類している。クラスやメンバにアクセス制御の修飾子 (後述する public, protected, private )を付けることにより、パッケージ内外でクラスやクラスのメンバにアクセス可能な範囲が変わってくる。
- 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 では、自クラス内でのみ見える。外部からはアクセスできない。クラスに修飾することはできない(内部クラスは例外)。finalと併用することはできないが、privateにするだけでもfinal扱いにもなる。
- 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は省略可能。finallyはC++言語には存在しない。ただし、tryブロックやcatchブロック内にreturn文があるとfinallyは無視されてしまうことに注意しなければならない。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修飾子を使わなくもほぼ高い精度を得ることができる。
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 |