抽象多态和继承的类赋值错误

时间:2013-09-10 22:39:46

标签: java inheritance constructor

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构造函数我没有sutable构造函数我得到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;
    }
}

5 个答案:

答案 0 :(得分:5)

问题是构造函数如何在Java中为继承的类工作。如果未指定对父类的构造函数的调用,Java会自动在构造函数的顶部插入super()方法。

对于LawClient的以下构造函数:

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

在尝试将n分配给name之前,Java正在调用super(),但是没有在Client类中匹配的构造函数。

如果向Client类添加no-args构造函数,则一切都应该有效:

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 :(得分:1)

只需使用适当的参数调用两个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;
}

答案 2 :(得分: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

答案 3 :(得分:0)

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

为了有用,java只有在你没有指定any时才创建一个默认的空构造函数,如果你没有指定一个调用,它也会创建一个对默认父类构造函数的调用,所以

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构造函数中指定无参数构造函数或调用spefic构造函数。

答案 4 :(得分:0)

我看到两件事:

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

  2. 检查类和构造函数的可见性。他们不是全部public。如果没有修饰符,则只能从同一个包中看到它。