Наследование в Java - не удается найти конструктор символов

Я работаю над классом, который наследуется от другого класса, но я получаю сообщение об ошибке компилятора «Не удается найти конструктор символов Account ()». В основном то, что я пытаюсь сделать, это создать класс InvestmentAccount, который расширяется от Account. Account предназначен для хранения баланса с методами снятия/вложения денег, и InvestmentAccount аналогичен, но баланс хранится в акциях с ценой акции, определяющей, как многие акции депонируются или снимаются с учетом определенной суммы денег. Вот первые несколько строк (приблизительно там, где компилятор указал на проблему) подкласса InvestmentAccount:

public class InvestmentAccount extends Account
{
    protected int sharePrice;
    protected int numShares;
    private Person customer;

    public InvestmentAccount(Person customer, int sharePrice)
    {
        this.customer = customer;
        sharePrice = sharePrice;
    }
    // etc...

Класс Person хранится в другом файле (Person.java). Вот первые несколько строк надкласса Account:

public class Account 
{
    private Person customer;
    protected int balanceInPence;

    public Account(Person customer)
    {
        this.customer = customer;
        balanceInPence = 0;
    }
    // etc...

Есть ли причина, по которой компилятор просто не читает конструктор символов для Account из класса Account? Или мне нужно определить новый конструктор для Account в InvestmentAccount, который говорит ему наследовать все?

Спасибо


person benwad    schedule 04.02.2009    source источник


Ответы (5)


используйте super(customer) в конструкторе InvestmentAccounts.

Java не может знать, как вызвать единственный конструктор, который есть у Account, потому что это не пустой конструктор. Вы можете опустить super(), только если ваш базовый класс имеет пустой конструктор.

Изменять

public InvestmentAccount(Person customer, int sharePrice)
{
        this.customer = customer;
        sharePrice = sharePrice;
}

to

public InvestmentAccount(Person customer, int sharePrice)
{
        super(customer);
        sharePrice = sharePrice;
}

Это будет работать.

person Johannes Weiss    schedule 04.02.2009

Вы должны вызвать конструктор суперкласса, иначе Java не будет знать, какой конструктор вы вызываете для создания суперкласса в подклассе.

public class InvestmentAccount extends Account {
    protected int sharePrice;
    protected int numShares;
    private Person customer;

    public InvestmentAccount(Person customer, int sharePrice) {
        super(customer);
        this.customer = customer;
        sharePrice = sharePrice;
    }
}
person Edison Gustavo Muenz    schedule 04.02.2009

Вызовите метод super(). Если вы хотите вызвать конструктор Account(Person), используйте оператор super(customer); Также это должен быть первый статус в конструкторе вашего инвестиционного счета.

person Ritesh M Nayak    schedule 04.02.2009
comment
Не "должен быть", а "должен". - person Bombe; 04.02.2009

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

В вашем случае конструктор должен быть:

public InvestmentAccount(Person customer, int sharePrice) {
    super(customer);
    sharePrice = sharePrice;
}

И не переопределяйте customer как переменную экземпляра подкласса!

person Guillaume    schedule 04.02.2009

Либо определите конструктор по умолчанию в классе Account:

public Account() {}

Или вызовите super(customer) в конструкторе InvestmentAccount.

person Bhushan Bhangale    schedule 04.02.2009