import java.lang.*;
public class GrammerStack extends GrammerStructure implements StringStack {
private String structName;
private int cap;
public GrammerStack(String structureName, int limit){
this.structName = structureName;
this.cap = limit;
System.out.println(structName+"["+cap+"]");
}
public void GrammerStructure(String structureName){
this.structName = structureName;
}
//Empty overrides.
public String[] asArray(){};
public String push(String item) throws FillException{};
public String pop() throws EmptyException{};
public boolean contains(String query){};
public void empty(){};
public double fillPercent(){};
public String getName(){ return structName; }
public void main(String args[]){
GrammerStack("Stack1",3);
}
}
当我运行时:javac GrammerStack.java 我得到以下内容:
GrammerStack.java:15: cannot find symbol
symbol : constructor GrammerStructure()
location: class GrammerStructure
public GrammerStack(String structureName, int limit){
^
GrammerStack.java:41: cannot find symbol
symbol : method GrammerStack(java.lang.String,int)
location: class GrammerStack
GrammerStack("Stack1",3);
^
2 errors
我无法弄清楚这里出了什么问题,我的方法也没有与文件名不匹配。在这种情况下,“语法”是正确的。
任何帮助?
答案 0 :(得分:2)
对于第一个问题,请在构造函数中添加super(structureName);
作为第一行。我假设您在超类中定义了public GrammerStructure(String name)
构造函数。如果不是这种情况,请分享您的构造函数。
public GrammerStack(String structureName, int limit){
super(structureName);
this.structName = structureName;
this.cap = limit;
System.out.println(structName+"["+cap+"]");
}
对于第二个问题,您缺少关键字new
。改变如下:
public void main(String args[]){
GrammerStack("Stack1",3);
}
带
public void main(String args[]){
new GrammerStack("Stack1",3);
}
或
public void main(String args[]){
GrammerStack grammerStack = new GrammerStack("Stack1",3);
}
答案 1 :(得分:0)
发生此错误是因为在您的超类构造函数中,您还没有定义无参数或默认构造函数。
当您在超类中定义带有参数的构造函数时,您必须为此特定原因定义无参数构造函数:编译器不会为您添加默认构造函数。
子类将抛出您刚刚提到的错误,因为在子类构造函数中,javac将添加默认的super()
调用。
答案 2 :(得分:0)
import java.lang.*;
public class GrammerStack extends GrammerStructure implements StringStack {
private String structName;
private int cap;
public GrammerStructure() {
}
public GrammerStack(String structureName, int limit){
this.structName = structureName;
this.cap = limit;
System.out.println(structName+"["+cap+"]");
}
public void GrammerStructure(String structureName){
this.structName = structureName;
}
//Empty overrides.
public String[] asArray(){};
public String push(String item) throws FillException{};
public String pop() throws EmptyException{};
public boolean contains(String query){};
public void empty(){};
public double fillPercent(){};
public String getName(){ return structName; }
public void main(String args[]){
GrammerStack("Stack1",3);
}
}
你没有定义没有参数的默认构造函数。当你在超类中定义一个带有参数的构造函数时,你必须定义没有参数的默认构造函数
答案 3 :(得分:0)
在超类和子类中定义构造函数时,需要遵循以下规则: -
如果你没有在两个类中定义任何构造函数,那么编译器将在两个类中添加一个默认值。所以,你没事。
如果在超类中定义了一个0-arg构造函数,那么你仍然可以。因为,从子类中的任何构造函数,如果您尚未调用任何超类构造函数,编译器将自动添加super()
调用作为每个子类构造函数的第一个语句。 (注意: - 编译器只会将super
调用添加到 0-arg构造函数)
如果在超类中没有定义一个0-arg构造函数,但是有一个参数化构造函数,那么如果你没有给出一个明确的构造函数,你可能会遇到问题从每个子类构造函数调用该参数化构造函数。这是因为,编译器只将调用添加到0-arg构造函数,而你没有那个...
因此,代码的问题是3rd one.
。
解决问题: -
在超类中添加0-arg构造函数
public GrammerStructure() {
}
或者,在每个子类构造函数中,向参数化的超类构造函数添加super
调用。
public GrammerStack(String structureName, int limit) {
// Add a `super` with some parameters to match your parameterized
// super class constructor here..
// It should be the first statement..
}
其次: -
您通过构造函数使用new
关键字来实例化一个类。因此,在您的main方法中,您应该使用以下命令更改您的调用: -
public void main(String args[]){
new GrammerStack("Stack1",3);
}