Java 路过参考树桩新手

Java 路过参考树桩新手,java,extends,Java,Extends,根据javadocs,“子类继承所有成员(字段、方法和嵌套类)”。还有,引用,那么为什么这个子类为aList[0]返回错误的值呢?似乎每个类都在修改自己的数组,而我希望它们都修改相同的数组 public class mystery { protected List<String> aList; public mystery() { aList = new ArrayList<String>(); } public void addToArray() {

根据javadocs,“子类继承所有成员(字段、方法和嵌套类)”。还有,引用,那么为什么这个子类为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();
}   

}这是因为您正在调用
prob2.addToArray2()
的“bar”
字符串添加到
prob2
变量的
aList
属性中。考虑到它们共享相同的属性,而不是对对象引用的相同引用,因此每个
prob
prob2
都有自己的
aList
属性值。使用调试器可以很容易地证明此行为。

这是因为您正在调用
prob2.addToArray2()
的“bar”
字符串添加到
prob2
变量的
aList
属性中。考虑到它们共享相同的属性,而不是对对象引用的相同引用,因此每个
prob
prob2
都有自己的
aList
属性值。使用调试器可以很容易地证明此行为

    mystery prob1 = new mystery();
    mysterySubclass prob2 = new mysterySubclass();
这里您正在创建两个新对象,因此它们将有自己的列表,并且不会像您所期望的那样共享一个

您需要的是:

    mystery prob1 = new mysterySubclass();
    mysterySubclass prob2 = (mysterySubclass)prob1;
试试这个

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();
这里您正在创建两个新对象,因此它们将有自己的列表,并且不会像您所期望的那样共享一个

您需要的是:

    mystery prob1 = new mysterySubclass();
    mysterySubclass prob2 = (mysterySubclass)prob1;
试试这个

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();
你的问题1已经解决了 你的问题2已经解决了 是的,它们是不同的

第四行之后=>prob1.aList--foo

第6行之后=>prob2.aList--bar

所以prob2.printary()只有“bar”可打印,还有prob2.printArray2() 基本上他们做同样的事情

你的问题1已经解决了 你的问题2已经解决了 是的,它们是不同的

第四行之后=>prob1.aList--foo

第6行之后=>prob2.aList--bar

所以prob2.printary()只有“bar”可打印,还有prob2.printArray2()
基本上,它们都做同样的事情。

你从来不会在
prob2
上调用
addToArray()
,那么你怎么能指望它神奇地在列表中的某个地方有
foo
?另外,
printary
printArray2
做同样的事情:
mysterySubclass
的每个实例都有一个底层列表。这与按引用传递无关:您没有向任何方法传递任何内容。如果您注意到了链接到的文章,它会明确指出Java不会通过引用传递任何内容;尽管它通过值传递引用。这两者之间有一个微妙但重要的区别。你从不在
prob2
上调用
addToArray()
,那么你怎么能指望它神奇地在列表中的某个地方有
foo
?另外,
printary
printArray2
做同样的事情:
mysterySubclass
的每个实例都有一个底层列表。这与按引用传递无关:您没有向任何方法传递任何内容。如果您注意到了链接到的文章,它会明确指出Java不会通过引用传递任何内容;尽管它通过值传递引用。两者之间有一个微妙但重要的区别。另外,请注意
printaray2()
您使用的是super,但不是必需的。正如@Luiggi Mendoza所说的,尝试使用调试器并自己找出它。您的问题与按引用传递无关。通过这种方式,您对同一对象有两个不同的引用,然后当您使用方法操作列表时,它们都将添加到同一个列表中。还要标记您正在使用super的
printArray2(),但这不是必需的。正如@Luiggi Mendoza所说的,尝试使用调试器,然后自己找到它。您的问题与按引用传递无关。通过这种方式,您对同一对象有两个不同的引用,然后当您使用方法操作列表时,它们都将添加到同一个列表中。因此,听起来好像即使子类可以访问父类的字段,它也没有相同的引用。因此mysterySubclass获得了它自己的“aList”,而不是引用父对象aList。谢谢你的帮助。@user1626687不客气。别忘了用绿色复选框标记最佳答案(我的或
@Narendra
,由你决定)。因此,听起来即使子类可以访问父类的字段,它也没有相同的引用。因此mysterySubclass获得了它自己的“aList”,而不是引用父对象aList。谢谢你的帮助。@user1626687不客气。别忘了用绿色勾选最佳答案(我的或
@Narendra
,由你决定)。