Oracle Certified Java Programmer, Gold SE 11の勉強をしていると、インタフェースの仕様をよく間違えるのでまとめておきます。
今回は変数編です。
インタフェースにおける変数
どのバージョンのJavaでもインタフェースはpubli static final
な定数を宣言することができます。
publi static final
な変数以外は許可されていない、つまり変数を定義した場合publi static final
以外は有り得ないので、アクセス修飾子を省略しても、暗黙的にpubli static final
が付与されます。
final
な定数なので、宣言時に初期化しなけれなりません。
変数
public interface Calc {
double PI = 3.14; // 暗黙的にpublic static finalが付与されます
// private double PI = 3.14; publicでないのでコンパイルエラーです
// double PI; 初期化されていないのでコンパイルエラーです
default void setPi(double pi) {
// PI = pi; 暗黙的にfinalで就職されており、値の再代入は許可されていないのでコンパイルエラーです
}
}
継承
親インタフェースで宣言した定数と同名の定数を子インタフェースで宣言できます。
また、インタフェースで宣言した定数と同名の変数を実装クラスで宣言できます。
親インタフェース
public interface SuperCalc {
double PI = 3.00;
}
子インタフェース
public interface Calc {
double PI = 3.14;
}
実装クラス1
public class CalcImpl1 implements Calc {
public static void main(String... args) {
System.out.println(PI); // 3.14 直接実現しているインタフェースのPIが出力されます
System.out.println(SuperCalc.PI); // 3 親インタフェースの定数にアクセスするときはインタフェースのFQCN.定数名でアクセスします
}
}
実装クラス2
public class CalcImpl2 implements Calc {
static double PI = 3.1415;
public static void main(String... args) {
System.out.println(PI); // 3.1415 実装クラスにstatic変数があるときは実装クラスの変数の値が出力されます
System.out.println(PI); // 3.14 直接実現しているインタフェースの定数にアクセスするときはインタフェースのFQCN.定数名でアクセスします
System.out.println(SuperCalc.PI); // 3 親インタフェースの定数にアクセスするときはインタフェースのFQCN.定数名でアクセスします
}
}