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

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

5 に答える 5

5

問題は、コンストラクターが継承されたクラスに対して 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;  
}
于 2013-09-10T22:53:54.313 に答える
1

適切な引数 super() を使用して、両方の LawClient コンストラクターで 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;
}
于 2013-09-10T22:50:28.237 に答える
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 原則の両方に違反します。

于 2013-09-10T22:56:08.060 に答える
0

次の 2 つのことがわかります。

  1. 親クラスでパラメーターを使用してコンストラクターを定義する場合、コンストラクターは子によって明示的に呼び出される必要があります。

  2. クラスとコンストラクターの可視性を確認してください。それらはすべてではありませんpublic。修飾子がない場合、同じパッケージからのみ表示されます。

于 2013-09-10T23:03:41.937 に答える
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 コンストラクターで特定のコンストラクターを呼び出す必要があります。

于 2013-09-10T22:56:33.543 に答える