Java - возможно ли иметь в конструкторе подкласса только 1 параметр, который не требует вызова super()?
Вот мой абстрактный класс:
public abstract class BankAccount{
protected long balance;
public BankAccount(long balance){ \\<--Abstract class constructor
this.balance = balance;
}
... more stuff
}
У меня есть следующий подкласс (также дополнительный подкласс SavingsAccount, они оба имеют свой собственный независимый баланс, но это не имеет значения):
public class CurrentAccount extends BankAccount{
private int PIN;
private long overdraft = 0;
private long balance;
// Set balance and overdraft and the PIN
public CurrentAccount(long balance, long overdraft, int PIN){
super(balance);
this.overdraft = overdraft;
setPIN(PIN);
}
// Set balance and overdraft
public CurrentAccount(long balance, long overdraft){
super(balance);
this.overdraft = overdraft;
}
// Set overdraft only
public CurrentAccount(long overdraft){ \\<-- is it possible to have something like this?
super(balance);
this.overdraft = overdraft;
}
public void setPIN(int PIN){
if(PIN >= 0000 && PIN <= 9999){
this.PIN = PIN;
}
}
... more methods
}
Как видно из приведенного выше, я хочу конструктор, который просто устанавливает овердрафт, но мне все равно нужно вызывать super в начале каждого конструктора, так что я просто передаю, каким бы ни был текущий баланс, могу ли я это сделать?? Или мне нужна переменная баланса в моем подклассе CurrentAccount?
Когда компиляция Java дает мне это:
CurrentAccount.java:41: error: cannot reference balance before supertype constructor has been called
super(balance);
^
1 error
Любая помощь будет оценена.
2 ответа
Если родительский класс не имеет конструктора по умолчанию (без аргументов), то это означает, что по замыслу класс должен быть инициализирован с balance
значение.
Это означает, что нет способа сделать то, что вы связываете, если не инициализировать его значением по умолчанию (например, super(0)
).
Ошибка объясняется тем фактом, что вы обращаетесь к полю суперкласса перед его фактическим построением, что является первым, что вы должны сделать в подклассе.
До тех пор, пока ваш объект не будет создан, значения по умолчанию для переменных не будут установлены, следовательно, если вы хотите, чтобы их значения по умолчанию были установлены во время создания, сделайте их статическими или явно установите их ранее.