予約語 (Java)

出典: フリー百科事典『ウィキペディア(Wikipedia)』

この項目ではJavaにおける予約語(よやくご)に関して説明する。

この項目は、プログラムの細かい説明には立ち入らず、他の言語の予約語と比較できるような説明を目的としている。

なお、文中のメンバとは、フィールド(クラス内のグローバル変数に相当する)、メソッド(手続き、関数に相当する)、コンストラクタオブジェクト指向言語に備わるオブジェクトを生成するときの手続き)のことを指す。

目次

[編集] Java言語の予約語の特徴

[編集] 原始型(プリミティブ型)を表す予約語

Javaでは、原始型(プリミティブ型)を表す予約語にC言語と共通の予約語を使用している。

  • byte, char, short, int, long, float, double
    整数型浮動小数点型。Javaには符号なしの整数型がなく、C言語で使われる unsigned はない。
  • boolean, true, false
    論理型と論理値。booleanはC言語(C99)における_Bool、C++におけるboolに相当する。
  • 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
    インタフェースの定義。Javaのインタフェースとは定義のみで実装をもたない多重継承ができる抽象クラスのようなもので、そのままではインスタンスを生成できない。サブクラスでインタフェースを実装したクラスを用意して使用する。インタフェースは複数のインタフェースをカンマ区切りで多重継承できる。
例1 public interface インタフェース名 { ... }
例2 public interface インタフェース名 extends スーパーインタフェース名1,スーパーインタフェース名12, ... { ... }
  • extends
    class の宣言で他のクラスを継承するときに使用する。Javaでは1つのクラスのみ継承可能で多重継承はできない。interfaceの宣言では複数のインタフェースを継承するときに使用する。インタフェースがインタフェースを継承するだけなので、こちらの場合は多重継承が可能。
  • implements
    class の宣言で、インタフェースを実装するときに使用する。こちらは複数のインタフェースをカンマ区切りで実装することができる。
  • this
    自クラスを明示するときに使用する。コンストラクタ内から他の引数のコンストラクタを呼ぶときに使用するのが一般的である。また、例えば、コンストラクタの場合はthis(引数)、メソッドの場合はthis.メソッド名(引数) などのように使い、親クラスに同一名・同一引数のメソッドがあるときに明示的に区別できるようにする。こちらは、ローカル変数や同じクラス内メソッドやスーパークラスのメソッドと名前がかぶらなければ this を省略できる。
  • super
    スーパークラスコンストラクタフィールドメソッドにアクセスするときに使用する。スーパークラスのコンストラクタを呼び出すときは単にsuper(引数)と書き、メソッドを呼び出すときはsuper.メソッド名(引数) などのように使う。フィールドやメソッドの場合は、自クラスに同一のものがない場合は super の記述を省略できる。
  • new
    コンストラクタの呼び出し。オブジェクトを生成するときに使用する。
 例: Sample s = new Sample()
  • null
    何も参照していない状態を表す。
  • instanceof
    指定されたクラスのオブジェクトかどうかを判定する。a instanceof (クラス名) とした場合、a が (クラス名) のオブジェクトか、そのサブクラスのオブジェクトであれば true になる。(クラス名) のところにオブジェクトの変数名を記述することはできない。

[編集] 修飾子

クラス、メンバの宣言に付けられる修飾子である。

  • public, protected, private
    クラス、メンバのアクセス制御を指示する修飾子である。外部からアクセス可能な範囲を決める。Javaでは4つの段階が設けられ、番号が大きくなるほど外部からのアクセスが制約される。
    1. public では、すべてのクラスから見える(アクセス可能である)。
    2. protected では、同一パッケージにあるクラスかサブクラスからのみ見える。異なるパッケージでサブクラスでないクラスからはアクセスできない。クラスを修飾することはできない(内部クラスは例外)。
    3. アクセス制御の修飾子がない場合は、同一のパッケージ内のクラスからのみ見える。サブクラスであってもパッケージが異なる場合はアクセスできない。このときクラスにpublic修飾子がないものを「パッケージプライベート」と呼ぶ。
    4. private では、自クラス内でのみ見える。外部からはアクセスできない。クラスに修飾することはできない(内部クラスは例外)。
    5. Java SE1.0ではprivate protectedという組み合わせを使用して、自分自身とサブクラスからのアクセスができたが同じパッケージ内の他のクラスからはアクセスできないという複雑なアクセス権を使用することができたが、これはJava SE 1.1以降から廃止され利用することができなくなった。
  • 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("ドライバ名")もこのスタティックイニシャライザを呼び出している。
 例 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つしか存在しない。
 記述例: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
    フィールドの宣言につけられる。Javaにはオブジェクトをそのままネットワークに送信したりファイルなどに保存するシリアライズと呼ばれる機能があり、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クラスを記述するようにすべきである。先に抽象的な例外クラスを記述すると、そのサブクラスもそこで捕捉されてしまうからである。
  • 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を付与した場合は相異なるプラットフォーム同士の間でも演算結果が一致することが保証される。

ウィキブックス
ウィキブックスJava関連の教科書や解説書があります。