0
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

我无法弄清楚这里出了什么问题,我的方法也与文件名不匹配。在这种情况下,“语法”是正确的。

有什么帮助吗?

4

4 回答 4

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); 
 }
于 2012-10-09T05:10:10.757 回答
0

发生此错误是因为在您的超类构造函数中,您尚未定义无参数或默认构造函数。

当您在超类中定义带参数的构造函数时,您也必须定义无参数构造函数,原因是:编译器不会为您添加默认构造函数。

子类将抛出您刚才提到的错误,因为在子类构造函数super()中,javac 将添加一个默认调用。

于 2012-10-09T05:09:47.777 回答
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); 
    }

    }

你没有定义没有参数的默认构造函数。当你在超类中定义一个带参数的构造函数时,你必须定义没有参数的默认构造函数

于 2012-10-09T05:12:03.737 回答
0

在超类和子类中定义构造函数时,需要遵循一些规则: -

  • 如果您没有在这两个类中定义任何构造函数,那么编译器将在这两个类中添加一个默认构造函数。所以,你没问题。

  • 如果您在超类中定义了一个 0-arg 构造函数,那么您仍然可以。因为,从子类中的任何构造函数中,如果您没有调用任何超类构造函数,编译器将super()自动添加一个调用作为每个子类构造函数的第一条语句。(注意: -编译器仅添加super 0-arg 构造函数的调用)

  • 如果您没有在超类中定义 0-arg 构造函数,但有一个参数化构造函数,那么如果您没有从每个子类构造函数中显式调用该参数化构造函数,那么您可能会遇到问题。 . 这是因为,Compiler 只添加了对 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); 
}
于 2012-10-09T05:33:17.973 回答