Java 带参数的超级方法

Java 带参数的超级方法,java,stack,Java,Stack,我遇到了这段代码,并试图了解super在这里做什么: 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 &

我遇到了这段代码,并试图了解super在这里做什么:

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();
    }
  }
} 
import java.util.Stack;
公共类StackWithMax扩展堆栈{
堆栈s2;
公共StackWithMax(){
s2=新堆栈();
}
公共无效推送(int值){
如果(值>=max()){
s2.推送(值);
}
super.push(值);
}
公共整数pop(){
int value=super.pop();
如果(值==max()){
s2.pop();
}
返回值;
}
公共int max(){
if(s2.isEmpty()){
返回Integer.MIN_值;
}否则{
返回s2.peek();
}
}
} 
调用super.push(value)时,修改的对象是什么


调用s2.push(value)和super.push(value)有什么区别,因为super指的是
堆栈,s2是
堆栈

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

对超级方法的调用处理第一个堆栈。所以区别在于,实际上有两种不同的数据结构可以在这里访问

它就像一辆卡车,上面有一辆汽车。两者都是车辆,因此您可以启动两个发动机。此代码手头有两个堆栈,可以对其进行操作


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

s2
StackWithMax
的成员,但
StackWithMax
也继承自
Stack


当您想要推入s2时,您可以编写
s2.push()
,但是当您想要推入“您自己”时,您可以调用继承的推入方法<之所以使用code>super
关键字,是因为您还重写了push方法。

查看此问题的简单方法是打印.this(StackWithMax)和成员堆栈(s2)的堆栈。您将看到,根据提供的INT,它们是不同的。