Я, кажется, не понимаю ключевое слово super (), и его использование довольно хорошо - PullRequest
2 голосов
/ 06 мая 2019

Я знаю, что вы используете его при наследовании от другого класса, и вам нужно сначала вызвать его внутри конструктора, а также, что вместо этого автоматически вызывается пустой метод super (), если я не вызываю его вручную.

Например, у нас есть родительский класс с именем bank:

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 с двумя строковыми аргументами.Ваш супер ();поэтому метод должен также содержать 2 аргумента типа String.Но что, если конструктор подкласса имеет только (String, int) аргументы, я должен просто поместить (String, null) в мой super ();метод?Поскольку я должен вставить что-то еще, я получаю сообщение об ошибке.

Ответы [ 3 ]

2 голосов
/ 06 мая 2019

Вы должны вызвать один из конструкторов суперкласса из конструктора подкласса.

Если у суперкласса есть только один конструктор, который принимает два String s, вы должны вызвать этот конструктор из подпунктаконструктор класса.Конструктор вашего подкласса должен решить, какие 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 голос
/ 06 мая 2019

В классе Bank есть только конструктор с параметрами name и ownersName.Поэтому при вызове super() из класса Account вам придется решить, как вы хотите инициализировать оба этих параметра.Если у вас нет ownersName в Account, вы действительно можете передать ноль в качестве второго аргумента.Это может потенциально привести к проблемам, хотя позже, если класс Банка действительно зависит от установленного ownersName.

Я также нахожу странным, что Account расширяет Bank, так как Счет на самом деле небанк.Но я мог бы упустить полный контекст вашего дизайна здесь.Если предпочли бы, чтобы банк был полем Account, или Bank имел бы поле ArrayList<Account>.

0 голосов
/ 07 мая 2019

В этом случае объединение конструкторов с помощью this (); был бы оптимальный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...