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

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

11 ответов

Конечно. Взгляните на шаблон шаблонов для примера.

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 потому что он объявлен окончательным.

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

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

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

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

Да.

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

Да.

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

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

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

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

Да, мы можем написать окончательный метод с реализацией.

public abstract class AbstractWithfinalMethod {
  public static  final boolean m1() {
    System.out.println(" M1 method executed");
    return true;
  }

  public static void main(String[] args) {
    System.out.println(m1());
  }
}

вывод: метод M1 выполнен true

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

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

Другие вопросы по тегам