Почему абстрактные методы могут быть объявлены только в абстрактных классах?

Я понимаю, что в абстрактных классах методы являются абстрактными или нет. Но почему я не могу создать абстрактный метод в "нормальном", не-абстрактном классе?

Заранее благодарим за любые объяснения!

Ответы

Ответ 1

Абстрактный метод в основном говорит о том, что реализации метода нет и его необходимо реализовать в подклассе. Однако, если у вас был абстрактный метод в не-абстрактном классе, вы могли бы создать экземпляр класса и получить объект, у которого был бы нереализованный метод, который вы не смогли бы вызвать.

Ответ 2

Наличие абстрактного метода предотвращает создание экземпляра класса, что делает его де-факто абстрактным классом. Java настаивает на том, что вы явно декларируете этот факт для согласованности: технически компилятор Java не нуждается в этом дополнительном знаке, чтобы решить, является ли класс абстрактным, исходя из наличия абстрактных методов, но так как вы можете захотеть создать абстрактное представление класса, не делая любой из его методов аннотация, требующая объявления в классе, была способ пойти.

Ответ 3

Давайте начнем с понимания почему нам нужно что-то вроде метода abstract. Ответ прост. Я не хочу, чтобы мои расширители использовали мои методы как есть, я хочу, чтобы они определяли свое поведение конкретного метода. Поскольку я использую этот метод в других методах моего абстрактного класса. Я могу предоставить / ** 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.

Ответ 4

Вы хотите вызывать метод, обеспечивающий реализацию, суть программирования.

На основе этой идеи правила Java:

  • Вы не можете создать экземпляр абстрактного класса.
  • Вы можете только создавать не-абстрактный класс.

Что делать, если Java позволяет вам вызывать метод в экземпляре не-абстрактного класса с... без реализации, поскольку метод будет abstract = > вообще не иметь смысла.

Почему Java и любые другие языки, имеющие отношение к подобному механизму, например С# (виртуальный метод), препятствуют объявлению абстрактного метода в не абстрактном классе.

Ответ 5

Если конкретный класс может иметь абстрактный метод, вы не сможете создать из него объект. Представьте себе 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() это.

Ответ 6

Поскольку наличие абстрактного метода делает его абстрактным классом. Обоснование является круглым.

Ответ 7

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

Ответ 8

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