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 分配给 name 之前调用 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

所有类都需要构造函数。任何构造函数的第一行必须是对父类的构造函数的调用。

为了有帮助,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 回答
0

我看到两件事:

  1. 当您在父类中定义带参数的构造函数时,它们必须由子类显式调用。

  2. 检查类和构造函数的可见性。他们不是全部public。当没有修饰符时,它仅在同一个包中可见。

于 2013-09-10T23:03:41.937 回答