Может ли абстрактный класс иметь окончательный метод?

Может ли абстрактный класс иметь окончательный метод в Java?

Ответ 1

Конечно. Для примера рассмотрим шаблон шаблона шаблона.

abstract class Game
{
    protected int playersCount;

    abstract void initializeGame();

    abstract void makePlay(int player);

    abstract boolean endOfGame();

    abstract void printWinner();

    /* A template method : */
    final void playOneGame(int playersCount) {
        this.playersCount = playersCount;
        initializeGame();
        int j = 0;
        while (!endOfGame()) {
            makePlay(j);
            j = (j + 1) % playersCount;
        }
        printWinner();
    }
}

Классы, которые расширяют Game, все равно должны будут выполнять все абстрактные методы, но они не смогут расширять playOneGame, потому что объявлены окончательными.

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

Ответ 2

Да.

Подсказка: просто запустите свою любимую IDE (затмение, netbeans и т.д.) и попробуйте. Он будет жаловаться, если он не работает.

Ответ 3

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

Ответ 4

Да.

Ответ 5

Да, в "абстрактном" классе могут быть "окончательные" методы. Но любой "абстрактный" метод в классе не может быть объявлен окончательным. Это даст "незаконную комбинацию модификаторов: абстрактную и конечную ошибку.

public abstract final void show();
    illegal combination of modifiers: abstract and final

Вот рабочий пример реализации.

abstract class Sian                 //ABSTRACT CLASS
{
    public final void show()        // FINAL METHOD
    {
         System.out.println("Yes");
    }
    public void display()
    {
         System.out.println("Overriding");
    }
    public abstract void success();
}
class Ideone extends Sian               //INHERTING ABSTRACT CLASS
{
    public void display()
    {
        System.out.println("Overridden");
    }
    public void success()               //OVERRIDING THE ABSTRACT METHOD
    {
        System.out.println("Success overriding");
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        Ideone id = new Ideone();       //OBJECT OF SUBCLASS
        id.show();                      //CALLING FINAL METHOD
        id.display();                   //OVERRIDDEN METHODS
        id.success();
    }
}

ВЫВОД: -

Yes
Overridden
Success overriding

Вот идеонная ссылка: - http://ideone.com/G1UBR5

Ответ 6

Да, эти методы не могут быть переопределены в подклассах. Примером этого является шаблон шаблона метода...

Ответ 7

Да, это может... нужно больше символов

Ответ 8

Конечно, это означает, что вы можете подклассифицировать его, но вы не можете переопределить этот конкретный метод.

Ответ 9

Да. Модификатор abstract позволяет опустить некоторую реализацию класса (т.е. Иметь некоторые методы abstract), но не налагает на вас каких-либо ограничений.

Ответ 10

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

Ответ 11

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