4

質問を説明する以下のコード スニペットを見つけてください。

public class Test {

/**
 * @param args
 */
public static void main(String[] args) {
    I ref = new B();
    ref.equals("");
}

}

interface I{

}

class A {
public void method(){

}
}

class B extends A implements I{

}

を参照してください。は許可されていますが、許可されていmain()ません。どうしてですか?ref.equals()ref.method()

EDIT:オブジェクトはB(またはAまたは他のクラス)のスーパークラスですが、同じようにAはBのスーパークラスでもあります。私の質問は、Aの「メソッド()」が「参照」に表示されない理由です、つまり、なぜ ref.equals() は許可されているのに ref.method() は許可されていないのですか? このメソッドの可視性チェックはどのように行われますか? JVMをルート化していますか?

4

6 に答える 6

7

それは、あなたがそれを I として宣言したからです:

I ref = new B();

I で宣言されたメソッドのみが表示されand the methods from Objectます。

あなたがするとき:

A として宣言します。

A ref = new B();

または B として宣言する

B ref = new B();

またはAにキャストする

I ref = new B();
((A)ref).method()

にアクセスできます:

ref.method()

A と I のメソッドを見たい場合は、それらの間でオブジェクトをキャストできます。または、A に I も実装してもらいます。

于 2012-11-12T05:44:12.237 に答える
2

Java 言語仕様では、java.lang.Object は、スーパーインターフェースを持たないすべてのインターフェースの直接のスーパータイプであると述べています。

于 2012-11-12T05:50:39.077 に答える
1

インターフェイスを使用してオブジェクトを参照する場合など

       I ref = new B();

その場合、インターフェイスとオブジェクト クラス メソッドのみにアクセスできます。オブジェクトをそのクラスにキャストするまで、クラス メソッドは表示されません

method宣言されたクラスにアクセスする場合Aは、次のいずれかを実行できます。

   I ref = new B();
   ((A)ref).method()

また

    A ref = new B();
    ref.method();

また

    B ref = new B();
    ref.method();
于 2012-11-12T05:44:48.600 に答える
0

インターフェイス型は、デフォルトで Object のサブクラスである具象クラスを使用してのみインスタンス化できます。したがって、インターフェース型で Object のメソッドを呼び出すことができます。他のすべてのカスタム メソッドは、そのインターフェイスまたはそのスーパー インターフェイスで宣言されている場合にのみ、インターフェイス タイプで呼び出すことができます。

于 2012-11-12T05:45:33.090 に答える
0

インターフェイスを介してオブジェクトを参照する場合、インターフェイスが公開するメソッドにのみアクセスできます。

于 2012-11-12T05:45:48.533 に答える
0

ref.equals()はオブジェクトのメソッドであり、すべてのサブクラスで使用できるため許可さequals()れます (B は暗黙的に extends であるため B もObject)。

method() が B にない場合、ステートメントが のときにアクセスできませんI i = new B()

于 2012-11-12T05:46:39.610 に答える