Определение абстрактного класса без каких-либо абстрактных методов - PullRequest
96 голосов
/ 27 января 2011

Можно ли определить абстрактный класс без добавления абстрактного метода?

Ответы [ 11 ]

146 голосов
/ 27 января 2011

Конечно.

Объявление только абстрактного класса означает, что вы не разрешаете создавать его экземпляр самостоятельно.

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

Это два отдельных понятия, хотя, очевидно, вы не можете иметь абстрактный метод в неабстрактном классе. Вы можете даже иметь абстрактные классы с final методами, но никогда не сможете наоборот.

14 голосов
/ 27 января 2011

Да, вы можете сделать это. Почему бы тебе просто не попробовать это сделать?

8 голосов
/ 20 сентября 2012

Да, вы можете.Абстрактный класс, используемый в Java, означает, что вы не можете создать объект класса.И абстрактный метод, подклассы должны обеспечить реализацию для этого метода.

Таким образом, вы можете легко определить абстрактный класс без какого-либо абстрактного метода.

Как в Примере:

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

Хорошо.

5 голосов
/ 07 января 2015

ДА Вы можете создать абстрактный класс без любого абстрактного метода. Лучший пример абстрактного класса без абстрактного метода - HttpServlet
Абстрактный метод - это метод, который не имеет тела. Если вы объявили хотя бы один метод в классе,класс должен быть объявлен как абстрактный, его обязательный, НО, если вы объявили абстрактный класс, не обязательно объявлять абстрактный метод внутри класса.

Вы не можете создавать объекты абстрактного класса, что означает, что он не может быть создан.

4 голосов
/ 27 января 2011

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

3 голосов
/ 20 апреля 2017

Да, мы можем объявить абстрактный класс без какого-либо абстрактного метода.Целью объявления класса как абстрактного является не создание экземпляра класса.

, поэтому два случая

1) абстрактный класс с абстрактными методами.

эти типы классов, мыдолжен наследовать класс от этого абстрактного класса и должен переопределять абстрактные методы в нашем классе, например: GenricServlet class

2) абстрактный класс без абстрактных методов.

эти типы классов мы должны наследоватькласс из этого абстрактного класса, например: цель класса HttpServlet состоит в том, что если вы не реализуете свою логику в дочернем классе, вы можете получить родительскую логику

, пожалуйста, проверьте исходный код HttpServlet

3 голосов
/ 14 января 2014

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

2 голосов
/ 21 августа 2013

да, вы можете сделать это.

объявление абстрактного класса означает, что класс не будет создан каким-либо другим классом.

и в нем должен быть хотя бы один абстрактный метод, и это означает, что вы можете объявить абстрактный метод в этом классе, если вы не объявляете метод, чем его.

пример:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

это будет работать наверняка.

2 голосов
/ 27 января 2011

Да, вы можете определить абстрактный класс без абстрактного метода.Однако, если внутри нет метода, лучше использовать интерфейс

1 голос
/ 22 марта 2018

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

Для меня наследование подразумевает отношения «есть».Представьте себе класс собаки, который может быть расширен более специализированными подтипами (эльзасский, пудель и т. Д.).В этом случае может быть правильным сделать абстракцию класса собаки, поскольку подтипы - это собаки.Теперь давайте представим, что собакам нужен ошейник.В этом случае наследование не имеет смысла: бессмысленно иметь отношения «есть-а» между собаками и ошейниками.Это определенно отношения «есть», ошейник - это объект сотрудничества.Делать ошейник абстрактным только для того, чтобы у собак был один, не имеет смысла.

Я часто нахожу, что абстрактные классы без абстрактных методов действительно выражают отношение «есть».В этих случаях я обычно нахожу, что код можно лучше разложить без использования наследования.Я также обнаружил, что абстрактные классы без абстрактного метода часто являются запахом кода и, по крайней мере, должны приводить к возникновению вопросов при рассмотрении кода.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...