簡體   English   中英

具有抽象多態性和繼承的類分配錯誤

[英]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構造函數中調用一個特殊的構造函數。

我看到兩件事:

  1. 當您在父類中使用參數定義構造函數時,子類必須顯式調用它們。

  2. 檢查您的類和構造函數的可見性。 他們不是所有人都public 如果沒有修飾符,則只能從同一包中看到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM