1

Javaでのアップキャストを理解しようとしています。最近観察された奇妙な行動。

例:

public class A extends B {

    public int i = 2;

    public void printI() {
        System.out.println("print i = " + this.i);
    }

    public static void main(String[] args) {

        B a = new A(); // <- upcasting here

        System.out.println("i = " + a.i);
        a.printI();
    }
}

class B {
     public int i = 1;
     public void printI() {}
}

//Output:
//i = 1
//print i = 2

そのアップキャストされたオブジェクトには、2つの別個の「i」プロパティがあるようです。1つの「i」は直接アクセス可能(ai)で、もう1つは子クラスのメソッド(a.printI())を介してアクセスできます。

アップキャストされたオブジェクトはスーパークラスからプロパティを取得し、子クラスからメソッドを取得するように見えます。

オブジェクトはどのようにして2つの別々の「i」を持つことができますか?!

4

2 に答える 2

5

そのアップキャストされたオブジェクトには、2つの別個の「i」プロパティがあるようです。

まず、用語について明確にする価値があります。「アップキャストされたオブジェクト」のようなものはありません-そして「i」はとのそれぞれのフィールドですAB

しかし、はい、ここには2つの別々のフィールドがあります。あるフィールドが別のフィールドを「オーバーライド」するようなものではありません。

何を達成しようとしていたかは明確ではありませんが、 inの宣言はiinの宣言をA 隠しています。詳細については、Java言語仕様のセクション6.4を参照してください。iB

ほとんどすべての場合、フィールドはプライベートである必要があることに注意してください。この時点では、コーディングしているクラスで宣言されていない変数を参照しようとしないため、非表示は実際には重要ではありません。

于 2012-05-18T13:51:16.057 に答える
1

これがJavaの仕組みです。両方のフィールドが「使用可能」ですが、たまたま同じ名前になっています。サブクラスから参照すると、スーパークラスのバージョンが非表示になっていますが、まだ存在しています。

于 2012-05-18T13:50:33.513 に答える