2013-09-10 31 views
0
public class LawClient extends Client 
{ 
    boolean defendant; 
    String caseTopic; 

     LawClient (String n, boolean d) 
    { 
     name = n; 
     defendant = d; 
    } 

     LawClient (String n, boolean d, String c, String e) 
    { 
     name = n; 
     defendant = d; 
     caseTopic = c; 
     email = e; 
    } 

    public String determineStatus() 
    { 
     if(caseTopic == null) 
     { 
      return "none"; 
     } 
     else 
     { 
     String s = ""; 
     s += "defendant: " + defendant +"\n" + "CaseTopic: " + caseTopic; 
     return s; 
     } 
    } 
} 

我得到2錯誤的法律客戶端構造函數沒有可變的構造函數,但不知道我做錯了什麼或如何解決它。抽象多態性和繼承的類賦值錯誤

這裏是超類,所以你可以運行它或看看它。

abstract class Client 
{ 
    protected String name; 
    protected double balance; 
    protected String email; 

    Client (String n) 
    { 
     name = n; 
    } 

    Client (String n, String e) 
    { 
     name = n; 
     email = e; 
    } 


    public String getName() 
    { 
     return name; 
    } 

    public double getBalance() 
    { 
     return balance; 
    } 

    public String getEmail() 
    { 
     return email; 
    } 

    public String setName(String a) 
    { 
     name = a; 
     return name; 
    } 

    public double adjustBalance(double b) 
    { 
     balance = b; 
     return balance; 
    } 

    public String setEmail(String e) 
    { 
     email = e; 
     return email; 
    } 

    public abstract String determineStatus(); 

    public String toString() 
    { 
     String a = ""; 
     a += "name: " +name + ("\n")+"Balance: " +balance + ("\n")+"Email: " +email + ("\n"); 
     return a; 
    } 
} 
+0

應該將構造函數公開嗎? – Taylor

+0

是的,謝謝我錯過了,但它不能解決問題 – user2744515

+0

顯示與錯誤pls的代碼。編輯:從頭開始。只要讀懂你的錯誤是在構造函數本身。構造函數應該在Client或Client中引用一個顯式的構造函數,但需要一個無參數構造函數。 – Taylor

回答

5

的問題是構造在Java中是如何工作的繼承類。如果您沒有指定對父類的構造函數的調用,Java會自動在構造函數的頂部插入super()方法。

對於LawClient的下面的構造:

LawClient (String n, boolean d) 
{ 
    name = n; 
    defendant = d; 
} 

Java正在嘗試分配n至名前使超()的調用,但沒有構造,在您的客戶端類相匹配。

如果添加了一個無參數的構造函數來Client類就可以工作了:

Client() { 
    //no-args 
} 

或者,你可以調用適當的超類的構造函數的LawClient構造內像這樣:

LawClient (String n, boolean d) 
{ 
    super(n); // this will call the first constructor of the Client class 
    name = n; 
    defendant = d; 
} 
+1

另一種方法比在'Client'中創建默認構造函數更好。它保留封裝並且不違反[DRY](http://en.wikipedia.org/wiki/Don't_repeat_yourself)。 –

1

只需調用客戶端構造上都LawClient構造適當的參數 超()

例如

LawClient (String n, boolean d) 
{ 
    super(n); 
    defendant = d; 
} 

LawClient (String n, boolean d, String c, String e) 
{ 
    super(n, e); 
    defendant = d; 
    caseTopic = c; 
} 
+3

對'super()'的調用需要是構造函數中的第一件事。 –

1

當您爲類定義任何構造函數(就像您爲Client類所做的那樣)時,編譯器不會自動爲該類生成默認(無參數)構造函數。但是,當您在子類中定義構造函數並且未顯式調用超類構造函數時,編譯器會自動將調用插入到超類的默認構造函數中。由於Client沒有默認的構造函數,這就是導致錯誤的原因。

的解決方案是重寫LawClient類的構造函數調用適當的超構造函數:

LawClient (String n, boolean d) 
{ 
    super(n); 
    defendant = d; 
} 

LawClient (String n, boolean d, String c, String e) 
{ 
    super(n, e); 
    defendant = d; 
    caseTopic = c; 
} 

另一種方法是顯式定義默認構造Client。您當前的代碼可以工作,但這會違反封裝(因爲您將從子類構造函數初始化Client字段)以及DRY principle

0

所有類都需要構造函數。任何構造函數的第一行必須是對父類的構造函數的調用。

是有幫助的Java創建一個默認的空構造只有當你沒有指定任何同時也建立了對默認的父類的構造函數的調用,如果你沒有指定調用,這樣

class Parent{ 
} 

class Child extends Parent{ 
} 

正是同

class Parent{ 
    public Parent(){ 
     super(); 
    } 
} 

class Child extends Parent{ 
    public Child(){ 
     super(); 
    } 
} 

你的代碼試圖做的是

public class LawClient extends Client 
{ 
    .... 
    LawClient (String n, boolean d) 
    { 
     super(); 
     name = n; 
     defendant = d; 
    } 

    LawClient (String n, boolean d, String c, String e) 
    { 
     super(); 
     name = n; 
     defendant = d; 
     caseTopic = c; 
     email = e; 
    } 

哪個不能當作

Client(){ 
} 

不存在。

因此,您需要指定無參數構造函數或在每個LawClient構造函數中調用構造函數。

0

我看到兩件事情:

  1. 當你定義在父類的構造函數的參數,必須明確孩子叫。

  2. 檢查您的類和構造函數的可見性。他們並不都是public。當沒有修飾符時,它只能從相同的包中看到。