2012-10-09 93 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); 
}