Java-修飾子

アクセス修飾子

クラスのメンバー変数、メンバーメソッドへのアクセス(参照可能スコープの制御)は以下の定義により制限できます。

クラス、インタフェース、メソッド、コンストラクタ、変数の修飾子として利用できます。

public 全てのクラスから参照可能です。
protected 同じクラス、同一パッケージ内のクラス、サブクラスからのみ参照可能です。他クラスからのアクセスをプロテクトします。
private 同じクラスからのみ参照可能です。

static修飾子

static宣言は、使用場所により意味が変わります。

  • 静的変数
    • 複数のインスタンスで、メモリ的に共有する変数。
    • 静的なメモリ確保が行われる。
  • 静的メソッド
    • インスタンスが作られていなくても、メソッドを呼び出すことができます。
    • newを行うことなく、関数を実行できます。
  • 静的ブロック
    • クラスが使用される直前に呼び出されます。

class A{
    static int s; //静的変数

    // 静的ブロック
    static{
        System.out.println("静的ブロック");
    }
    // 静的メソッド
    static void hoge(){
        s = -10;
    }
}

class Test{
    public static void main(String args[]){
        A.hoge()
        A.s = 5;
        A a = new A();
    }
}

final修飾子

finalは上書き禁止を意味します。

使用場所により、意味が変わります。

  • クラス宣言時にfinalを使用
    • final修飾子を付与してクラスを宣言すると、そのクラスはサブクラスで継承できなくなります
  • メソッド宣言時にfinalを使用
    • 当該メソッドはサブクラスでオーバーライドできなくなります。
  • メンバ変数宣言時にfinalを使用
    • final修飾子を付与してメンバ変数を宣言するとそのメンバ変数は定数として扱われます。
    • finalが付与されたメンバ変数に一度値を代入するとその値を変更することはできません。

final class クラス名 {
    :
}
class クラス名 {
    final 型 メソッド名(引数) {
        :
    }

    public static final int s = 5;
}

abstract修飾子

abstractは、抽象修飾子と呼ばれ、定義を持たない(宣言のみ)ことを示します。

クラス作成時点では、形式のみ決まっていて実装が決まらないメソッドに対して指定します。

サブクラスで必ず実装しなくてはならない機能を明示することが主な利用目的です。


abstract class クラス名 {
        :
    abstract 型 メソッド名(引数) ;
        :
}

synchronized修飾子

synchronizedは、マルチスレッド環境でメソッドを実行した場合、メソッドのインスタンスに対して排他制御を行います。

synchronizedが指定されたメソッド・ブロックが属するオブジェクトはメソッド・ブロックを実行している間、同じオブジェクト内のsynchronizedが指定されたメソッド・ブロックからアクセスされないようロックされます。


class クラス名 {
    synchronized 型 メソッド名(引数) {
    }
}

下記のように記述することもできます。


class クラス名 {
    void メソッド() {
        synchronized (this) {
       }
    }
}

volatile(揮発性)修飾子

volatile修飾子は、その変数が複数のスレッドからアクセスされても 内容が同期されることが保障されます。

Javaにおけるマルチスレッドは、処理の最適化などの理由でメインメモリの内容を個々のスレッドが保持している作業メモリにコピーして処理を行うことがあります。

このとき、作業メモリとメインメモリの間で不整合が生じる可能性があり、同じ変数でもスレッドによって値が異なるという現象が発生します。

複数のスレッドから参照される可能性のある変数にvolatileを指定することで、この問題を回避することができます。


class クラス名 {
    //以下のように宣言すると複数のスレッドから参照されても不整合は生じない。
    volatile int nCount;
}

transient修飾子

一時的な変数であり、「オブジェクトのシリアライズ(直列化)」の対象から除外されます。

オブジェクトのシリアライズとは「オブジェクトの情報をストリーム化」することであり、オブジェクトをファイル保存したり、 ネットワークで送信することができるようになります。


class クラス名 {
    transient String buf;
}

native修飾子

nativeは、メソッドがネイティブメソッドであることを示します。

ネイテブメソッドは型、メソッド名、引数の型といった作法のみを定義するものであり、その実装がJava以外の言語で記述されてコンパイルされていることを示します。


class クラス名 {
    public native 型 メソッド名(引数);
}

strictfp(厳密浮動小数)修飾子

strictfpは、floatやdoubleの浮動小数点演算がプラットフォームに依存しない動作(IEEE754の仕様)で厳密に行うように指示します。

なお、strictfpを指定しない浮動小数点演算は、CPUの仕様によって若干結果が異なります。


strictfp class クラス名 {
    double d1, d2;
}

関連ページ