[英]class assignment error with abstract polymorphism and inheritance
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;
}
}
}
對於Lawclient構造函數沒有可構造函數,我遇到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;
}
}
問題是構造函數如何在Java中為繼承的類工作。 如果您未指定對父類的構造函數的調用,則Java會自動在構造函數的頂部插入super()方法。
對於以下LawClient的構造函數:
LawClient (String n, boolean d)
{
name = n;
defendant = d;
}
Java在嘗試為名稱分配n之前先調用super(),但是Client類中沒有匹配的構造函數。
如果向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;
}
只需在兩個LawClient構造函數上使用適當的參數super()調用Client構造函數
例如
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
沒有默認的構造函數,所以才是導致錯誤的原因。
解決方案是重寫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原則 。
所有類都需要一個構造函數。 任何構造函數的第一行都必須是對父類的構造函數的調用。
為了幫助您,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構造函數中調用一個特殊的構造函數。
我看到兩件事:
當您在父類中使用參數定義構造函數時,子類必須顯式調用它們。
檢查您的類和構造函數的可見性。 他們不是所有人都public
。 如果沒有修飾符,則只能從同一包中看到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.