超级方法参数

时间:2017-07-23 05:20:40

标签: java stack

我遇到了这段代码,并试图了解超级正在做什么:

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>

2 个答案:

答案 0 :(得分:1)

s2StackWithMax的成员,但StackWithMax也继承自Stack<Integer>
如果你想进入s2,你可以写s2.push(),但是当你想要进入'你自己'时,你会调用你继承的推送方法。使用super关键字是因为您还重写了推送方法。

答案 1 :(得分:0)

这里有两个堆栈。 StsckWithMax本身就是一个堆栈。它包含第二个堆栈!

对超级方法的调用解决了第一个堆栈。所以区别在于实际上有两种不同的数据结构可供访问。

就像一辆载有汽车的卡车。两者都是车辆,所以你可以启动两个引擎。这段代码有两个可以操作的堆栈。

在这种特殊情况下,需要像这样使用super - 如果push方法只调用push() - 而不是super.push() - 那么最终会出现无休止的递归和stackoverflow异常。