0

クラスパラメータとしてのメソッドdummyAありますが、サブクラスのインスタンスをそのメソッドに渡す必要があります B。私は知っています: Javaキャスティングはオーバーヘッドをもたらしますか? なんで? Javaでのダウンキャストにはオーバーヘッドがあります。私のコードのほとんどはサブクラスを扱ってBいるので、この目的でダウンキャストを使用していません。代わりに、その目的のために一時的なインスタンス変数を使用しますcc。しかし、これはサブクラスのオブジェクトを変更するものではありませんmccインスタンス variable についても、利用可能な変数を変更する必要がありますm。これは私のコードです:

public class TestCast {

    public TestCast() {
        B m = new B(12, 3);
        dummy(m);
        A cc = m;
        dummy(cc);
        System.out.println(m.a);
        System.out.println(cc.a);
    }

    public void dummy(A t) {
        t.a = 22222;
    }

    public static void main(String[] args) {
        new TestCast();
    }
}

class A {
    public int a = 0;

    public A(int a) {
        this.a = a;
    }
}

class B extends A {

    public int a;
    public int b;

    public B(int a, int b) {
        super(a);
        this.a = a;
        this.b = b;
    }
}

出力あり

12
22222
4

4 に答える 4

3

特定の例では、親クラスと子クラスの両方が name のフィールドを宣言しましたa。この場合、子変数は親変数を隠します。

また、変数/フィールドは、メソッドのような多態的なエンティティではありません。それらは参照の静的型によってアクセスされます。

つまり、フィールドアクセス

A var = new A(10);
var.a; // returns 10

そしてフィールドアクセス

A var = new B(1501, 10); 
var.a; // also returns 10

しかし

A var = new B(1501, 10); 
var.a; // returns 10
((B)var).a; // returns 1501

astatic type の参照にアクセスするためですB

あなたの方法では

public void dummy(A t) {
    t.a = 22222;
}

の静的型はtAクラス変数の値を変更するためです。

于 2013-09-13T02:54:06.327 に答える
1

Typeキャストは、参照変数が実行時に固有のものであることをコンパイラーに伝えます

于 2013-09-13T02:45:21.253 に答える
1

B は A を拡張しているため、変数 a を再定義したくありません。

コメントへの回答として、コードは次のようになります。

class B extends A {

   public int b;

   public B(int a, int b) {
    super(a);
    this.b = b;
   }
}
于 2013-09-13T02:50:51.853 に答える
0

IMO、サンプルコードは継承の完全な実装ではありません。継承により、コードの再利用が可能になります。int aつまり、 class で再度宣言する必要はありませんB

インスタンス変数 m についても、変数 cc を変更する必要があります。

ただし、変数も変更する場合は、 と の両方で変数を private/protected としてcc宣言します。また、両方のクラスでセッターとゲッターを提供します。そして、クラス内で以下のように呼び出します。a, bABBsuper.setA(a)

class B extends A {

    private int a;
    private int b;

    public B(int a, int b) {
        super(a);
        this.a = a;
        this.b = b;
    }

    public setA(int a) {
        super.setA(a);
        this.a = a;
    }
}
于 2013-09-13T03:19:24.063 に答える