我遇到了这段代码,并试图了解超级正在做什么:
import java.util.Stack;
public class StackWithMax extends Stack<Integer> {
Stack<Integer> s2;
public StackWithMax() {
s2 = new Stack<Integer>();
}
public void push(int value){
if (value >= max()) {
s2.push(value);
}
super.push(value);
}
public Integer pop() {
int value = super.pop();
if (value == max()) {
s2.pop();
}
return value;
}
public int max() {
if (s2.isEmpty()) {
return Integer.MIN_VALUE;
} else {
return s2.peek();
}
}
}
当调用super.push(value)时,正在修改哪个对象?
调用s2.push(value)和super.push(value)之间有什么区别,因为super指的是Stack<Integer>
而s2是Stack<Integer>
?
答案 0 :(得分:1)
s2
是StackWithMax
的成员,但StackWithMax
也继承自Stack<Integer>
。
如果你想进入s2,你可以写s2.push()
,但是当你想要进入'你自己'时,你会调用你继承的推送方法。使用super
关键字是因为您还重写了推送方法。
答案 1 :(得分:0)
这里有两个堆栈。 StsckWithMax本身就是一个堆栈。它包含第二个堆栈!
对超级方法的调用解决了第一个堆栈。所以区别在于实际上有两种不同的数据结构可供访问。
就像一辆载有汽车的卡车。两者都是车辆,所以你可以启动两个引擎。这段代码有两个可以操作的堆栈。
在这种特殊情况下,需要像这样使用super - 如果push方法只调用push() - 而不是super.push() - 那么最终会出现无休止的递归和stackoverflow异常。