我似乎不太了解super()关键字,而且用法很好

时间:2019-05-06 13:06:43

标签: java class inheritance methods polymorphism

我知道您在从另一个类继承时会使用它,并且必须首先在构造函数内部调用它,而且如果我不手动调用它,则会自动调用一个空的super()方法。

例如,我们有一个名为bank的Parent类:

public class bank implements Comparable<bank> {
        private String owner;
        public String money;
        public boolean intheCubby;

public bank(String name, String ownersName) {
        owner = ownersName;
        money = name;
    }

还有一个名为Account的子类:

public class Account extends bank {

    private int totalquantity;
    public int neededquantity;

    public Account(String name, int n) {
        super(name, name);
        money = name;
        totalquantity = n;

    }

    public Account(String name, int n, String ownersName) {
        super(name,ownersName);
        money = name;
        totalquantity = n;
        setOwner(ownersName);

    }

因此,我知道它的工作原理是这样的:您在Parentclass中具有bank构造函数,并带有2个String参数。 您的super();因此,该方法还应包含2个String类型的参数。 但是,如果子类的构造函数仅具有(String,int)个参数,我应该将(String,null)放入我的super()怎么办?方法?因为我必须插入其他内容,所以出现错误。

3 个答案:

答案 0 :(得分:2)

您必须从子类构造函数中调用超类的构造函数之一。

如果超类只有一个接受两个String的构造函数,则必须从子类构造函数调用该构造函数。您的子类的构造函数应决定将哪些String实例传递给超类构造函数。

在您的示例中,

public Account(String name, int n, String ownersName) {
    super(name, ownersName);
    ...
}

将起作用。

public Account(String name, int n) {
    super(name, "someDefaultValue"); // or super(name, null);
    ...
}

也可以。

答案 1 :(得分:1)

Bank类只有一个带有nameownersName参数的构造函数。因此,当从super()类调用Account时,必须决定如何初始化这两个参数。如果您在ownersName中没有Account,则可以确实将null作为第二个参数传递。这可能会导致问题,但稍后如果Bank类真的依赖于设置的ownersName

我还发现Account扩展了Bank很奇怪,因为一个帐户实际上不是银行。但在这里我可能会丢失您设计的完整上下文。如果希望银行是Account的字段,或者Bank有一个ArrayList<Account>的字段。

答案 2 :(得分:0)

在这种情况下,将构造函数与this()链接;本来是 最佳。