Почему абстрактные методы могут быть объявлены только в абстрактных классах?
Я понимаю, что в абстрактных классах методы будут как абстрактными, так и нет. Но почему я не могу создать абстрактный метод в "нормальном", не абстрактный класс?
заранее спасибо за любые разъяснения!
8 ответов
Аннотация метод в основном говорит, что нет реализации метода и он должен быть реализован в подкласс. Однако, если бы у вас был аннотация метод неабстрактный class, вы можете создать экземпляр класса и получить объект, который будет иметь нереализованный метод, который вы не сможете вызвать.
давайте начнем с понимания почему нам нужно что-то вроде аннотация метод. Ответ прост. Я не хочу мой экстендеры использовать мои методы, я хочу, чтобы они определяют свое собственное поведение конкретного метода. Поскольку я использую этот метод в других методах моего абстрактного класса. Я могу предоставить /**java doc**/ в абстрактном классе и укажите им использовать поведение по умолчанию.
class abstract LoveTheWorld {
private int myKindness ;
public int defaultGiveKindness() {
myKindness -= 5 ;
return 5 ;
}
/**
you can use the defaultGiveKindness method, and not define your own behavior
**/
public abstract int giveKindness() ;
}
этот также сообщает удлинитель что они могут расширения только один класс (согласно правилам наследования java). Теперь, если вы хотите изменить эту историю, вы можете использовать интерфейс вместо абстрактного класса. Но все зависит от какие ограничения вы хотите, чтобы ваш будущий разработчик соблюдать строгую или гибкую. строго будет держать его плотно и обеспечить снижение ошибок,гибкий будет держать его свободным и свободным и продвигать инновации. Этот вопрос: **что нужно*8.
наличие абстрактного метода предотвращает создание экземпляра класса, что делает его де-факто абстрактным классом. Java настаивает на том, чтобы вы объявили этот факт явно для согласованности: технически Java-компилятор не нуждается в этой дополнительной метке, чтобы решить, является ли класс абстрактным на основе наличия абстрактных методов, но поскольку вы можете захотеть сделать абстрактный класс, не делая ни один из его методов абстрактным, требование объявления о классе было способом.
вы хочу чтобы вызвать метод, предоставляющий реализацию, это суть программирования.
основываясь на этой идее, правила Java:
- вы не может создать экземпляр абстрактного класса.
- вы может быть только создать экземпляр неабстрактного класса.
Что делать, если Java позволит вам вызвать метод на экземпляре неабстрактного класса С ... без реализации с метода будет abstract
=>нет смысла.
вот почему Java и любые другие языки, имеющие дело с подобным механизмом, таким как C# (виртуальный метод), предотвращают объявление абстрактного метода в неабстрактном классе.
если конкретный класс может иметь абстрактный метод, вы не сможете создать объект из этого. Представьте себе Shape
с конкретным методом getColor()
и абстрактный метод draw()
. Это здорово см. к некоторым вещам в абстрактной манере, поэтому кто-то может сказать вам: "сделайте форму!":
public void render(Shape s) { ... }
но когда вы используете ссылку для вызова draw()
, вы ожидаете, что объект, упомянутый s
знает, как это сделать:
s.draw();
если конкретным классам разрешалось иметь абстрактные методы, вы могли создавать экземпляр объекта Shape, но когда вы вызывали метод draw, он не знал, что рисовать! Даже если бы он знал, как сказать свой цвет, положение или 1000 других вещей. Если он не указан на 100%, он не может существовать в качестве рабочих объектов.
поэтому Java требует, чтобы такие классы были отмечены как абстрактные. Тогда вы не сможете использовать их для создания объектов, так как они не знают, как конкретно делать 100% вещей, которые вы ожидать от объекта. Для ссылки на них можно использовать только абстрактные классы. Теперь вы можете быть уверены, что для создания объектов будут использоваться только классы, в которых реализованы все их методы, и у них, вероятно, будут имена, которые тоже кажутся менее абстрактными:
Shape shape = new Rectangle();
render(shape);
теперь вы можете сказать "рендеринг фигуры", и вы программируете, используя ссылку на прямоугольник, будете знать, как draw()
его.
абстрактные методы предназначены для того, чтобы оставить реализацию дочерним классам.Если нормальный класс содержит абстрактный метод, то можно создать объект для этого класса и вызвать абстрактный метод так же, как обычный метод.Тогда возникнет проблема.Это является причиной абстрактные методы должны быть в абстрактном классе (так что нельзя создать объект абстрактного класса)или только интерфейсы.
простой ответ: если класс не является абстрактным (конкретный класс), вы можете создать экземпляр этого класса и вызвать любой метод в этом классе .но предположим, если бы вы объявили абстрактный метод в этом не абстрактном классе-невозможно назвать этот конкретный абстрактный метод.(чтобы предотвратить это,мы не можем объявить абстрактные методы в не абстрактном классе )