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;
}
}
答案 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)
我看到两件事:
当您在父类中定义带参数的构造函数时,它们必须由子项显式调用。
检查类和构造函数的可见性。他们不是全部public
。如果没有修饰符,则只能从同一个包中看到它。