【问题标题】:Why this stack using super.isEmpty()?为什么这个堆栈使用 super.isEmpty()?
【发布时间】:2017-08-18 21:16:04
【问题描述】:

为什么我必须调用super.isEmpty()?我试过this.isEmpty(),但是调试过程暂停了。

import java.util.*;

public class Stack<e>  extends ArrayList<e> {
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    public void showPrompt(){
    System.out.println("Please input informations five times and type Enter between each gap:");
    }
    // `enter code here`


    public e peek(){
        return get(size()-1);
    }

    public void push(e o){
        add(o);
    }
    public e pop(){
        e o=get(size()-1);
        remove (size()-1);
        return o;
    }

    public boolean isEmpty(){
        return super.isEmpty();
        /* Why did I have to invoke super.isEmpty()? */
    }
    public String toString(){
        return "stack"+toString();
    }
}

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Stack<String> s=new Stack<>();
        s.showPrompt();
        Scanner scan=new Scanner(System.in);
        for(int i=0;i<5;i++){
        s.push(scan.next());
        }
        System.out.println("Reverse order is:");
        while(!s.isEmpty()){
            System.out.println(s.pop());
        }

    }

}

【问题讨论】:

  • 您是在问为什么super 是必要的,或者为什么this 不起作用?
  • 是的,我就是这个意思
  • 这是两个问题。你问的是哪一个?
  • 另外,请仔细阅读minimal reproducible example 发布代码指南 - 您不需要所有代码来询问任何一个问题(这两个问题都是许多现有问题的重复)
  • 我的意思是为什么不使用 'this' 或什么都不使用,而是使用 'super'。?关于 superclass 的业务是什么?

标签: java arrays stack


【解决方案1】:

我们正在谈论这种方法:

public boolean isEmpty() {
    return super.isEmpty();
}

首先,写的这个方法是不必要的1。它只是调用超类中的isEmpty() 方法;即ArrayList。如果您忽略它,对StackisEmpty() 调用将直接转到超类中实现的isEmpty() 方法。

现在你的问题是为什么需要super。答案是,如果您在此处使用super,请这样写:

public boolean isEmpty() {
    return this.isEmpty();  // INCORRECT!
}

然后isEmpty() 方法将调用自身。这会导致无限递归,并导致StackOverflowError。 (如果您查看堆栈跟踪,您会看到一长串堆栈帧,其中isEmpty() 调用isEmpty() 调用isEmpty() .... 等等。最终,你用完了堆栈空间()。)

通过使用super,我们告诉Java 调用在超类中实现的isEmpty 方法。


1 - 此代码不是java.util.Stack 的标准实现。标准的 Stack 类扩展了 Vector 并且没有声明对 isEmpty() 的覆盖

【讨论】:

  • 谢谢,终于明白哪里错了,非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 2021-01-08
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2020-02-21
相关资源
最近更新 更多