Может ли абстрактный класс иметь окончательный метод в 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
Предположим, что я хочу создать класс, который имеет некоторую реализацию, но я не хочу, чтобы другие (подклассы) реализовали его, но другие методы, тогда в этом случае нам нужен окончательный реализованный метод и очевидный выбор абстрактного класса.
