我是Java的业余爱好者请帮助我。
我有一个班级:帐户
public class Account {
protected String fullName;
protected String accontNumber;
protected String password;
protected int balance;
public Account(String name, String acc_num, String pass, int b){
fullName = name;
accontNumber = acc_num;
password = pass;
balance = b;
}
}
我将创建一个继承自帐户
的新类 Account2public class Account2 extends Account{
public Account2(String l){
String[] temp = l.split(",");
super.fullName = temp[0];
super.accontNumber = temp[1];
super.password = temp[2];
super.balance = Integer.parseInt(temp[3]);
}
}
但是我收到一条错误消息,上面写着: 实际和正式的参数列表长度不同
我该如何解决这个问题?
答案 0 :(得分:4)
喜欢这个
public class Account2 extends Account{
public Account2(String l){
super(l.split(",")[0],l.split(",")[1],l.split(",")[2],Integer.parseInt(l.split(",")[3]))
}
}
答案 1 :(得分:4)
当基类具有非默认构造函数(一个或多个参数)时,派生类必须在其构造函数中使用super(paramters)
调用基类构造函数。并且还注意到构造函数,你必须有超级语句的第一行,所以你必须声明一个具有相同参数的构造,或者在一行内正确传递参数,尽管不建议这样做:
public Account2(String l) {
super(l.split(",")[0],l.split(",")[1],l.split(",")[2],Integer.parseInt(l.split(",")[3]));
}
答案 2 :(得分:1)
您尚未放置super
构造函数调用。因此,默认情况下,它会尝试选择super()
,即Account
类中不存在的无参数构造函数
答案 3 :(得分:1)
当前的子类构造函数在超类构造之后设置超类参数的值。如果您希望保留该方法,请将no-arg构造函数添加到设置默认值的超类中。
最好使用setter而不是直接访问字段。
答案 4 :(得分:1)
恕我直言,在这种情况下,你不应该使用构造函数。创建一个静态方法,该方法接受String
输入,验证它,将其拆分为某些逻辑部分,然后使用“normal”构造函数创建一个对象:
class Account2 extends Account {
Account2(String name, String acc_num, String pass, int b) {
super(name, acc_num, pass, b);
}
public static Account2 createFromString(String input) {
String[] temp = l.split(",");
if (temp.length != 4) {
throw new RuntimeException("...");
}
return new Account2(temp[0], temp[1], temp[2], Integer.parseInt(temp[3]));
}
}
我个人认为你的代码会更清晰:
Account2 acc1 = new Account2("abc", "def", "ghi", 2);
Account2 acc2 = Account2.createFromString("abc,def,ghi,2");
答案 5 :(得分:1)
问题:
实际和正式参数列表的长度不同
要理解这一点,对构造函数及其继承行为的基本理解将对您有所帮助。