2012-10-09 57 views
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 我得到如下:爪哇 - 无法找到象征Contstructor

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 

我也弄不清是怎么回事错了,我的方法是不与文件名称不匹配。在这种情况下,“Grammer”是正确的。

任何帮助?

+0

请提供'GrammerStructure'的代码。 –

+0

请分享您的'GrammerStructure'类构造函数。 –

回答

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); 
} 
+0

这消除了第二个错误,但不是第一个错误。 TY。 – user1695505

+0

我相信你已经在你的超类'GrammerStructure'中定义了一些构造函数。我假设它把'structureName'作为参数。如果是,请在类构造函数方法'public GrammerStack(String structureName,int limit){'中添加'super(structureName);'作为第一行。我更新了答案。如果情况并非如此,那么请在'GrammerStructure'类中共享您的构造函数。 –

+0

谢谢你的帮助,这解决了它! – user1695505

0

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

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

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

+0

我试过加入: public GrammerStack(){};但是这并没有处理这个错误。 – user1695505

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

    } 

你是不是没有argument.When定义默认构造函数定义构造函数与超类的参数,你必须定义不带参数的默认构造函数

+0

当我将代码更改为以下代码以包含super()时,它仍然给我一个错误,但仅限于一个空的构造函数。没有其他两个超级它仍然抱怨他们,但超级这两个没有提到。 public GrammerStack(){ } public GrammerStack(String structureName){ super(structureName); } public GrammerStack(String structureName,int limit){ super(structureName); } – user1695505

0

当你定义的超类和子类的构造函数,有一些规律可循: -

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

  • 如果你在已经定义了超级类中的0-参数构造函数,你仍然可以。因为从子类中的任何构造函数中,如果您尚未调用任何超类构造函数,Compiler将自动添加一个调用作为每个子类构造函数的第一条语句。(注意: - 编译器只会增加super调用0参数的构造

  • 如果没有定义在超一流的0参数的构造函数,但有一个参数的构造函数,那么你可能会遇到问题,如果你没有从你的每个子类的构造函数给这个参数化构造函数一个明确的调用。这是因为,编译器只添加了对0-arg构造函数的调用,并且你没有one there ..

所以,你的代码的问题是3rd one.

要解决此问题: -

  • 无论是在你的超级类中添加一个0参数的构造

    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关键词与你的构造函数实例化一个类。所以,在你的主要方法,你应该改变你的调用与此: -

public void main(String args[]){ 
    new GrammerStack("Stack1",3); 
}