2
class A { 
    int i = 1; 
    int f() { return i; } 
} 
class B extends A { 
    int i = 2;
    int @Override f() { return -i; }
} 
public class override_test { 
    public static void main(String args[]) { 
         B b = new B(); 
         A a = (A) b;               // Cast b to an instance of class A. 
         System.out.println(a.i);   // Now refers to A.i; prints 1; 
         System.out.println(a.f()); // Still refers to B.f(); prints -2; 
    } 
}

ai が Ai を参照しているのに、なぜ af() がまだ Bf() を参照しているのか疑問に思っています

前もって感謝します!

4

3 に答える 3

2

Javaでは、フィールドは多形ではないためa.iA.i

はオブジェクトobであるためa.f()参照しますが、これをキャストしている場合は、で宣言されているメソッドのみを使用できることを意味します。B.f()bBAA

ただし、オブジェクトはまだタイプBです。

したがって、フィールドにアクセスするときは参照タイプに基づいており、メソッドにアクセスするときはオブジェクトタイプに基づいています

于 2013-02-16T17:11:40.437 に答える
0

メソッドを呼び出すときの単純なルールは、インスタンス型 (ポリモーフィズム) になります。この場合B、参照は型ですが、インスタンスは型Aです。

変数を呼び出すと、参照の Type になります。

多態性についてもっと読む

于 2013-02-16T17:09:06.077 に答える
0

仕方ないよ。Java インスタンス メソッドの呼び出しは、C++ の用語では仮想です。選択されるメソッドは、対象オブジェクトへの参照の型ではなく、対象オブジェクトの実際のクラスによって異なります。フィールド参照は仮想ではなく、フィールドの選択は参照のタイプによって異なります。

私は通常、フィールドを非公開または保護し、フィールドへの直接の外部アクセスではなくメソッドを使用して作業します

于 2013-02-16T17:10:36.837 に答える