2

クラスが同じ名前の 2 つの抽象メソッドと同じ識別子を持つ 2 つの定数を持つ 2 つのインターフェイスを実装するコードを書いています。

public class Test implements A,B {

  public void doStuff() {}

  public void make() {}

  public static void main(String[] args) {
    Test t=new Test();
    System.out.println(A.VALUE);
    System.out.println(B.VALUE);
    //System.out.println(Test.VALUE);
    //System.out.println(t.VALUE);
  }

}


interface A {              // implicitly abstract

  int VALUE=11;            // implicitly public static and final

  void doStuff();               // implicitly public and abstract

}


interface B {

  int VALUE=14;

  void make();

  void doStuff();

}

今では、Java 7 の時点で、抽象メソッドに関する限り、名前の衝突を心配する必要がないことを知っています (そうですか??): 適切な実装を提供するだけで問題ありません (共有するすべてのメソッド同じ名前はカバーされています)、そのため、複数の継承のような問題や「ダイヤモンド」は発生しません (これは、Java 8 に到達したときに対処することになると思います)。

しかし、定数に関する限り、2 つのインターフェイスを実装し、VALUE フィールドにアクセスしようとしない場合、コンパイラは文句を言わないことに気付きました。

どうですか?これは正常な動作ですか?それらのメンバーにアクセスした場合にのみエラーが発生しますか?

編集つまり、インターフェイスを実装しようとすると、コンパイラがあいまいさについて警告しないのはなぜですか?

4

5 に答える 5

1

インターフェイスのすべての変数は public static です。そのため、そのインターフェイスを継承しなければ、どこからでもイベントにアクセスできます。

于 2015-10-01T07:20:49.130 に答える
0

あなたの例では

interface A {              
  int VALUE=11;           
  void doStuff();               
}

interface B {
  int VALUE = 14;
  void make();
  void doStuff();
}

インターフェースで定義された変数はpublic static final 変数として扱われます。したがって、静的変数はクラスレベルの変数であり、クラス全体で使用でき、クラス名自体でアクセスできます。

上記の例では、インターフェイス A と B は public static final VALUE 変数を持っています。また、A インターフェイス変数には値 11 が割り当てられ、B インターフェイス変数には値 14 が割り当てられます。

A および B インターフェースの完全な実装は、クラス Test です。

ここでクラスTestはA、Bを実装します

デフォルトでは、すべてのプロパティと動作が Test クラスで利用できます。ただし、この場合、VALUE 変数は静的で、残りのメソッドはインスタンス メソッドです。静的変数のスコープはクラス レベルであり、静的変数のメモリ割り当てはインスタンス変数やインスタンス メソッドとは異なります。

したがって、スコープは異なります(クラス レベルで)。したがって、これでダイヤモンドの問題が発生する可能性はありません。コードは正常にコンパイルされ、出力はそれぞれ 11 12 です。

于 2015-10-01T08:04:05.447 に答える