1
Stack<Animal> myStack = new Stack<Animal>();
Animal a = new Animal();
a.setValueOfAnimal(5);
myStack.push(a);
a.setValueOfAnimal(15);
System.out.println(myStack.pop().getValueOfAnimal());

在上面你会看到一个示例 main 方法。

输出将是:15。

无论如何要使堆栈中的对象安全吗?我不希望在修改“Animal a”的值时修改堆栈中的对象。

任何内置 Java 类都支持这一点吗?

4

4 回答 4

6

我不希望在修改“Animal a”的值时修改堆栈中的对象。

然后你必须创建Animal.

当您在 中添加Animal引用时Stack,您只是存储了引用的副本,它指向相同的Animal. 因此,如果您Animal使用原始引用修改您的实例,它也会被修改为Stack.

所以,你需要像这样修改你的代码: -

myStack.push(a);
a = new Animal(); // Make the reference `a` point to a new instance.
a.setValueOfAnimal(15);
于 2012-11-29T19:40:54.717 回答
3

你不能,除非你添加a = new Animal()after myStack.push(a);

您还可以做的是提供一个复制构造函数:

public Animal(Animal someAnimal) {
    this.value = someAnimal.value;
}

然后你可以写:

myStack.push(new Animal(a)); //put a copy in the stack
于 2012-11-29T19:39:51.933 回答
2

推送后的空引用将使堆栈上的对象安全:

Animal a = new Animal();
a.setValueOfAnimal(5);
myStack.push(a);
a = null;  // remark here.
于 2012-11-29T19:41:54.843 回答
0
于 2020-12-20T04:32:31.630 回答