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