Java - 找不到构造函数的符号

时间:2012-10-09 05:06:49

标签: java

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 个答案:

答案 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); 
}