【发布时间】:2022-01-03 05:45:54
【问题描述】:
我正在做一个使用抽象类的项目。我把 Item 类弄疯了,然后我做了一个“Snickers”和一个“Mars”类,它们都扩展了 Item 类。
我在堆栈中使用它,在填充这些堆栈后,我试图打印出顶部的名称,在本例中为 Snickers。我尝试直接调用 getName() 方法,但它告诉我它未声明。当我尝试使用像 System.out.println(snickersStack.top().super().getName()) 这样的 super 关键字来使用它时,会出现一个错误,上面写着“无法取消引用 void”,我无法真正理解,因为我尝试使用的方法是返回字符串的方法.
这是 Item 类:
public abstract class Item {
private float preis;
private String name;
private boolean haltbar;
public Item(float pPreis, String pName, boolean pHaltbar)
{
preis = pPreis;
name = pName;
haltbar = pHaltbar;
}
public float getPreis() {
return preis;
}
public String getName() {
return name;
}
public boolean getHaltbar() {
return haltbar;
}
public void setPreis(float pPreis) {
preis = pPreis;
}
public void setName(String pName) {
name = pName;
}
public void setHaltbar(boolean pHaltbar) {
haltbar = pHaltbar;
}
}
显然有 getName() 方法,这是 Snickers 方法,它只是引用了 Item 类:
public class Snickers extends Item {
public Snickers(boolean pHaltbar) {
super(1.2f, "Snickers", pHaltbar);
}
}
这就是我将不同数量的项目填充到堆栈中的方式,在底部有我的问题所在的行。
public void fuelleStacks() {
//random int 0 - 7
randomInt = random.nextInt(8);
//fuelle snickersStack
while(randomInt != 0) {
randomBool = random.nextBoolean();
Snickers snickers = new Snickers(randomBool);
snickersStack.push(snickers);
randomInt--;
}
//fuelle marsStack
randomInt = random.nextInt(8);
while(randomInt != 0) {
randomBool = random.nextBoolean();
Mars mars = new Mars(randomBool);
marsStack.push(mars);
randomInt--;
}
System.out.println(snickersStack.top().super().getName());
}
我已经在同一个类中声明并初始化了堆栈本身,如下所示:
public class Automat {
public Stack snickersStack;
public Automat() {
snickersStack = new Stack<Snickers>();
marsStack = new Stack<Mars>();
}
}
我没有导入 Stack 类,而是有另一个名为 Stack 的类包含此代码(这就是为什么我使用 top(),而不是像使用普通 Stack 类那样使用 peek()):
public class Stack<ContentType> {
private class StackNode {
private ContentType content = null;
private StackNode nextNode = null;
public StackNode(ContentType pContent) {
content = pContent;
nextNode = null;
}
public void setNext(StackNode pNext) {
nextNode = pNext;
}
public StackNode getNext() {
return nextNode;
}
/**
* @return das Inhaltsobjekt vom Typ ContentType
*/
public ContentType getContent() {
return content;
}
}
private StackNode head;
private int anzahl;
public Stack() {
head = null;
anzahl = 0;
}
public boolean isEmpty() {
return (head == null);
}
public void push(ContentType pContent) {
if (pContent != null) {
StackNode node = new StackNode(pContent);
node.setNext(head);
head = node;
anzahl++;
}
}
public void pop() {
if (!isEmpty()) {
head = head.getNext();
anzahl--;
}
}
public ContentType top() {
if (!this.isEmpty()) {
return head.getContent();
} else {
return null;
}
}
public int getAnzahl() {
return anzahl;
}
}
【问题讨论】:
-
问题不在于您粘贴的任何内容;它在您声明
snickersStack的位置。编辑您的问题并包含这部分代码。最好是粘贴自包含代码。对于本练习,这样做似乎微不足道。 -
你想用
snickersStack.top().super().getName()做什么?你认为这应该怎么做? -
旁注:当您在
snickersStack.top().super().getName()等长表达式中遇到错误时,您可以通过将其分解为更小的部分并将每个部分分配给一个变量来对其进行调试。这将更准确地告诉您问题出在哪里。 -
另一个注意事项:缩进代码的第一行是不够的。每行必须缩进额外的四个空格。如果您不这样做,那么前四个空格将被视为“这是一行代码”,而不是缩进以实际格式化您的代码。或者,您可以在每个代码块的上方和下方添加三个反引号以进行格式化。
标签: java stack abstract-class return-value abstract