繁体   English   中英

Java继承和构造函数参数

[英]Java Inheritance and Constructor Arguments

我是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 ,该类继承自Account

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]);
    }

}

但是我收到一条错误消息,说: 实际参数和形式参数列表的长度不同

我怎么解决这个问题?

像这样

public class Account2 extends Account{
    public Account2(String l){            
        super(l.split(",")[0],l.split(",")[1],l.split(",")[2],Integer.parseInt(l.split(",")[3]))      
    }
}

当基类具有非默认构造函数(一个或多个参数)时,派生类必须在其构造函数中使用super(paramters)调用基类构造函数。 还要注意构造函数,您必须在第一行中包含super语句,因此您必须声明具有相同参数的构造,或者在一行中正确传递参数,尽管不建议这样做:

public Account2(String l) {
    super(l.split(",")[0],l.split(",")[1],l.split(",")[2],Integer.parseInt(l.split(",")[3]));
}

您尚未放置super构造函数调用。 因此,默认情况下它将尝试选择super()Account类中不存在的无参数构造函数

当前的子类构造函数在超类构造之后设置超类参数的值。 如果您希望保留该方法,请向设置默认值的超类中添加一个无参数的构造函数。

最好使用setter而不是直接访问这些字段。

恕我直言,在这种情况下,您不应该使用构造函数。 创建一个静态方法,该方法接受您的String输入,对其进行验证,将其拆分为一些逻辑部分,然后使用“常规”构造函数创建一个对象:

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");

探针:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM