1

javadocs によると、「サブクラスはそのスーパークラスからすべてのメンバー (フィールド、メソッド、およびネストされたクラス) を継承します」。また、Java は参照によってオブジェクトを操作します。では、なぜこのサブクラスは aList[0] に対して間違った値を返すのでしょうか? 両方が同じ配列を変更することを期待しているときに、各クラスが独自の配列を変更しているようです。

public class mystery {
protected List<String> aList;

public mystery() {
    aList = new ArrayList<String>();
}

public void addToArray() {
    //"foo" is successfully added to the arraylist
    aList.add("foo");
}

public void printArray() {
    System.out.println( "printArray " + aList.get(0) +"" );
}
public static void main(String[] args) {
    mystery prob1 = new mystery();
    mysterySubclass prob2 = new mysterySubclass();
    //add "foo" to array
    prob1.addToArray();
    //add "bar" to array
    prob2.addToArray2();

    //expect to print "foo", works as expected
    prob1.printArray();
    //expect to print "foo", but actually prints "bar"
    prob2.printArray();
    //expect to print "foo", but actually prints "bar"
    prob2.printArray2();
}   

}

public class mysterySubclass extends mystery {

public void mysterySubclass() {}
public void addToArray2() {
    aList.add("bar");
}

public void printArray2() {
    System.out.println( "printArray2 " + super.aList.get(0) +"" );
}

}

4

3 に答える 3

1
    mystery prob1 = new mystery();
    mysterySubclass prob2 = new mysterySubclass();

ここでは、2 つの新しいオブジェクトを作成しているため、それらは独自のリストを持ち、期待どおりに 1 つを共有しません。

あなたが探しているものは次のとおりです。

    mystery prob1 = new mysterySubclass();
    mysterySubclass prob2 = (mysterySubclass)prob1;

これを試して..

于 2012-11-30T05:07:42.273 に答える
0

これは、変数の属性にString をprob2.addToArray2();追加する呼び出しを行っているためです。オブジェクト参照への同じ参照ではなく、同じ属性を共有することを考慮してください。そのため、それぞれに独自の属性値があります。この動作は、デバッガーを使用して簡単に証明できます。"bar"aListprob2probprob2aList

于 2012-11-30T04:49:44.917 に答える
0
mystery prob1 = new mystery();
mysterySubclass prob2 = new mysterySubclass();
//add "foo" to array
prob1.addToArray();
//add "bar" to array
prob2.addToArray2();

//expect to print "foo", works as expected
prob1.printArray();
//expect to print "foo", but actually prints "bar"
prob2.printArray();
//expect to print "foo", but actually prints "bar"
prob2.printArray2();

あなたのprob1にはaListがあり、prob2にはaListがあり、はい、それらは異なります。

4行目以降 => prob1.aList -- foo

6 行目以降 => prob2.aList -- bar

したがって、prob2.printArray() には印刷する「バー」のみがあり、prob2.printArray2() も基本的に同じことを行います。

于 2012-11-30T05:20:26.870 に答える