Может ли абстрактный класс иметь окончательный метод в Java?Может ли абстрактный класс иметь окончательный метод?
ответ
Да, эти методы не могут быть переопределены в подклассах. Пример этого является шаблоном шаблонного метода ...
Да, может ... нужно больше символов
Конечно, это означает, что вы можете унаследовать его, но вы не можете переопределить этот конкретный метод.
Да. Модификатор abstract
позволяет опустить часть реализации класса (т. Е. Иметь некоторые методы abstract
), но не налагает на вас каких-либо ограничений.
Да.
Подсказка: просто запустите свою любимую IDE (затмение, netbeans и т. Д.) И попробуйте. Он будет жаловаться, если он не работает.
-1. Точка SO не означает, что люди «сами пробовали». Это пустая трата времени и усилий, если каждый, кто выполняет поиск в Интернете по этому вопросу, должен запустить среду IDE и попробовать ее для себя, когда кто-то может дать полный и исчерпывающий ответ на вопрос: http://stackoverflow.com/questions/1299398/1299434 # 1299434 –
Да, ваше право, и я принимаю downvote, но это третий тривиальный вопрос Keyur об абстрактных классах в строке, поэтому я сделал исключение. –
@Andreas_D: Я пропустил этот ключ, задал многочисленные вопросы по одному и тому же вопросу, и я видел достаточно, «почему бы вам не попробовать сами» ответы и комментарии сегодня утром, что я слишком быстро отреагировал с нисходящим потоком. Я удалил его (это означает, что вы возвращаете свой репер?), Так как ваш ответ на самом деле неверен. –
Несомненно. Взгляните на пример Template method pattern.
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
, поскольку он объявлен окончательным.
В абстрактном классе также могут быть методы, которые не являются ни абстрактными, ни окончательными, а просто обычными методами. Эти методы должны быть реализованы в абстрактном классе, но разработчик должен решить, должны ли расширения классов переопределять их или нет.
прекрасный! Upvote для воссоздания шаблона шаблона метода –
Но wats его использование – Sawyer
@Bill the Lizard: отличный ответ! но у меня есть один вопрос: что, если метод playOneGame() был нормальным (не окончательным). это было то же самое? какое преимущество использовать здесь final вместо того, чтобы не использовать какое-либо ключевое слово? Спасибо –
Да, это возможно. Но последний метод не может быть абстрактным (другие не конечные методы в одном классе могут быть).
В абстрактном классе методы могут быть определены или нет. Если мы расширим абстрактный класс, тогда только он имеет смысл, поэтому любые методы, которые мы объявляем или определяем в Abstract, требуют, чтобы он переместился в подкласс. Таким образом, мы можем объявить метод как final в абстрактном классе, и он будет преодолен в подклассе.
Я вижу, что вы пытаетесь сказать здесь, но, пожалуйста, отредактируйте свой ответ, так как сейчас ОЧЕНЬ неясно. – szegedi
Да, в «абстрактном» классе могут быть «окончательные» методы. Но любой «абстрактный» метод в классе не может быть объявлен окончательным. Он даст "незаконная комбинация модификаторов: абстрактная и окончательная" ошибка.
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
Вот ссылка ideone: - http://ideone.com/G1UBR5
Предположим, я хочу, чтобы разработанный класс, который имеет некоторую реализацию, но я не хочу, чтобы другие (суб классы) в реализуют его, но другие методы, тогда в этом случае нам нужен окончательный реализованный метод и очевидный выбор абстрактного класса.
- 1. Почему абстрактный класс может иметь метод экземпляра?
- 2. Может ли абстрактный класс иметь конструктор?
- 3. Должен ли абстрактный класс иметь хотя бы один абстрактный метод?
- 4. Должен ли абстрактный класс иметь serialVersionUID
- 5. Может ли расширение Groovy расширить абстрактный класс
- 6. Может ли анонимный класс реализовать не абстрактный метод абстрактного класса?
- 7. Делегат метод или абстрактный класс
- 8. Класс не абстрактный, не переопределяет абстрактный метод
- 9. Java Class расширяет абстрактный класс, но должен иметь статический метод
- 10. Может ли фрагмент расширить абстрактный класс?
- 11. Может ли абстрактный класс быть внедрен в другой класс?
- 12. C++ абстрактный класс не может иметь метод с параметром этого класса
- 13. абстрактный класс расширяет абстрактный класс в php?
- 14. Может ли класс получить более чем один абстрактный класс?
- 15. Может ли класс иметь свой собственный PrintWriter?
- 16. Deserialize Абстрактный класс
- 17. Аннотация метод в не-абстрактный класс?
- 18. Может ли один абстрактный класс расширить другой абстрактный класс и увеличить функциональность
- 19. Абстрактный класс, как сделать метод аннотацию
- 20. Абстрактный класс, класс, интерфейс
- 21. анонимный класс не абстрактный и не переопределяет абстрактный метод
- 22. Может ли класс иметь объект как атрибут?
- 23. может ли класс иметь членов виртуальных данных?
- 24. Может ли класс иметь два стандартных конструктора?
- 25. Абстрактный базовый класс имеет абстрактный вложенный класс
- 26. Вложенный абстрактный класс и возвращающий абстрактный класс
- 27. C# общий абстрактный класс и общий метод
- 28. Класс должен быть объявлен как абстрактный или реализовать абстрактный метод
- 29. Почему абстрактный класс должен реализовывать абстрактный метод абстрактного базового класса?
- 30. ОШИБКА: класс не абстрактный и не переопределяет абстрактный метод
Вы должны дать больше объяснений. Метод шаблонов не подразумевает окончательного, хотя это, безусловно, упрощает жизнь. – kdgregory
Ok let say final настоятельно рекомендуется :) Я рассматриваю его как ошибку, чтобы не использовать final для метода шаблона ... – pgras