はじめに
Javaの修飾子(modifiers)は、クラス、メソッド、または変数の振る舞いを変更するために使われます。修飾子を理解することは、Javaコードを読み、書く際に役立つでしょう。今回は、Javaの主要な修飾子とその使用例を解説します。
アクセス修飾子
Javaには4つのアクセス修飾子があります。
- public: どのクラスからでもアクセス可能です。
- private: 同じクラス内からのみアクセス可能です。
- protected: 同じパッケージ内、またはサブクラスからのみアクセス可能です。
- デフォルト (指定なし): 同じパッケージ内からのみアクセス可能です。
public class MyClass {
public int publicVar = 1;
private int privateVar = 2;
protected int protectedVar = 3;
int defaultVar = 4;
}
非アクセス修飾子
クラス修飾子
- final: サブクラスを作成できません。
- abstract: インスタンス化できず、1つ以上の抽象メソッドを持たなければなりません。
- strictfp: そのクラスの中の全てのメソッドと内部クラスで浮動小数点の精度が一定であることを保証します。
public final class MyFinalClass { }
public abstract class MyAbstractClass {
public abstract void myMethod();
}
public strictfp class MyStrictfpClass { }
メソッド修飾子
- final: メソッドのオーバーライドを禁止します。
- static: インスタンスではなく、クラス自体に属するメソッドにします。
- abstract: メソッドの本体がなく、サブクラスでオーバーライドする必要があります。
- synchronized: 同時に複数のスレッドがアクセスできないようにします。
- native: Java以外の言語で書かれたコードを使用します。
- strictfp: メソッド内で浮動小数点の精度が一定であることを保証します。
public class MyClass {
public final void finalMethod() { }
public static void staticMethod() { }
public abstract void abstractMethod();
public synchronized void syncMethod() { }
public native void nativeMethod();
public strictfp void strictMethod() { }
}
フィールド(変数)修飾子
- final: 値が一度だけ設定できます。再割り当ては不可能です。
- static: インスタンスではなく、クラス自体に属するフィールドにします。
- transient: オブジェクトのシリアル化時に、このフィールドは無視されます。
- volatile: このフィールドは常にメインメモリから読まれ、スレッド間での同期が保証されます。
public class MyClass {
public final int finalVar = 1;
public static int staticVar = 2;
public transient int transientVar = 3;
public volatile int volatileVar = 4;
}