Может ли абстрактный класс иметь конечный метод?
Может ли абстрактный класс иметь финальный метод в 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, и он будет перезаписан в подклассе.