Java

как правильней организовывать абстрактный класс JAVA

ссылка абстрактного класса может ссылаться на своих наследников, но как я понял не может получать доступ к их собственным методам и полям, поэтому в абстрактном классе нужно описывать прототипы методов, а потом переопределять их в классах наследниках для удобства реализации полиморфизма, да?
абстрактные классы в Java, https://pro-java.ru/tag/abstraktnye-klassy-v-java/
Старый Лис
Старый Лис
70 673
Лучший ответ
Родительский класс не может и не должен ссылаться на своих наследников.
Вячеслав Кураков то есть нужно исключить полиморфизм из языка?))
это-то так.
но к СВОИМ методам (РЕАЛИЗОВАННЫМ в абстрактном классе) - может.
а если таких нету и не будет - то интерфейс делай.

abstract class Weapon {
public void shoot() {
recharge();
fire();
}

abstract void recharge();
abstract void fire();
}

class Pistol extends Weapon {
@Override
void recharge() {
...
}
@Override
void fire() {
...
}
}
Aleks Koshkin Вариант через интерфейсы отличается, фактически, только служебными словами. В данном примере не "чистый" интерфейс, а с дефолтным методом:

public interface Weapon {
public default void shoot() {
recharge();
fire();
}
public void recharge();
public void fire();
}

class Pistol implements Weapon {
@Override
void recharge() {
...
}
@Override
void fire() {
...
}
}

Но класс-предок может быть только один, а интерфейсов - сколько угодно.
Правильней вместо абстрактного класса описать интерфейс.
Дмитрий Гордиенко зря Sun фичу делали?
и в других языках тоже зря? или просто сама реализация поганая?
не джавист
не используйте слово "ссылается". Это слово уже занято :-)
Ссылка в java это неявный указатель на объект. Обычно говорят что объект ссылается на другой объект. Классы наследуются. Классы могут реализовывать интерфейс. То есть в заголовке класса или его родителя есть объявление implementation КакойтоИнтерфейс. Абстрактный класс почти ничем не отличается от НЕабстрактного класса кроме парочки нюансов. Абстрактный класс может объявлять методы без реализации. Соответственно нельзя создать объект такого класса потому, что комп не знает что именно нужно сделать когда вызывается метод без реализации. Это логично. Поэтому чтобы использовать абстрактный класс, нужно создать его наследника и реализовать недостающие методы. В остальном для абстрактного класса работают все те же правила что и для обычного класса. Если все методы абстрактного класса без реализации, то лучше использовать интерфейс. Это удобнее.