2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Java インタフェースにおける変数

Last updated at Posted at 2022-03-13

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.定数名でアクセスします
    }

}
2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?