問題
次のコードの[ A ]に記述するとコンパイルエラーになるものはどれですか。(4つ選択)
interface MyType {
int one = 1;
static int two = 2;
static final int three = 3;
}
class MyClass implements MyType {
public static void main(String... args) {
MyType t = new MyClass();
//[ A ]
}
}
選択肢
A) int c = three;
B) int h = t.two;
C) int b = two + 1;
D) int g = 1 + t.one;
E) int i = t.three++;
F) int f += MyType.three;
G) int e = MyType.two + +1;
H) int a = ++one;
I) int d = MyType.one;
解答
A) int c = three;
B) int h = t.two;
C) int b = two + 1;
D) int g = 1 + t.one;
E) int i = t.three++;
F) int f += MyType.three;
G) int e = MyType.two + +1;
H) int a = ++one;
I) int d = MyType.one;
解説
次のコードを見て、[ A ]
に記述するとコンパイルエラーになるものを特定します。
コードの構成
MyType
インターフェースには、いくつかの静的フィールドが定義されています。これらのフィールドは、static
とfinal
として扱われます。- インターフェースのフィールドは暗黙的に
public static final
であるため、インスタンスから直接アクセスすることはできませんが、クラス名を通じてアクセスすることができます。
各選択肢の検討
A)int c = three;
→ 有効。three
は static final
フィールドで、インターフェース名なしでアクセスすることはできませんが、MyType.three
と書けば有効です。
B)int h = t.two;
→ コンパイルエラー。two
はインターフェースの静的フィールドですが、インスタンス変数からは直接アクセスできません。
C)int b = two + 1;
→ 有効。two
はインターフェースの静的フィールドで、MyType.two
と書けば有効です。
D)int g = 1 + t.one;
→ 有効。one
も static final
フィールドですが、インスタンスからアクセスしてもコンパイルエラーにはなりません。
E)int i = t.three++;
→ コンパイルエラー。three
は final
フィールドのため、変更できません。
F)int f += MyType.three;
→ コンパイルエラー。+=
は初期化を必要とするため、int f
が宣言されていないとエラーになります。
G)int e = MyType.two + +1;
→ 有効。two
はインターフェースの静的フィールドとして正しくアクセスしています。
H)int a = ++one;
→ コンパイルエラー。one
は final
フィールドのため、変更できません。
I)int d = MyType.one;
→ 有効。one
に対してクラス名を使ってアクセスすることも可能です。
対象資格:Java SE17 認定資格