Java继承和构造函数参数

时间:2013-12-23 08:43:53

标签: java inheritance

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

我将创建一个继承自帐户

的新类 Account2
public 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]);
    }

}

但是我收到一条错误消息,上面写着: 实际和正式的参数列表长度不同

我该如何解决这个问题?

6 个答案:

答案 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)

问题:

实际和正式参数列表的长度不同

要理解这一点,对构造函数及其继承行为的基本理解将对您有所帮助。

  1. 当我们定义一个没有构造函数的类时,编译器会自己插入一个零参数构造函数。
  2. 如果我们使用某个参数编写自己的构造函数,则编译器不会插入此默认构造函数,如果需要,必须显式添加。
  3. 当创建子类的实例时,默认情况下会对超类构造函数进行隐式调用(在构造函数调用期间首先执行)。
  4. 因此,如果超类中有没有默认构造函数(当我们使用参数定义自己的自定义构造函数时就是这种情况),编译器会抱怨。
  5. 要解决这个问题,您需要使用参数作为子类构造函数中的第一行来调用构造函数,或者显式定义默认构造函数。