Kann eine abstrakte Klasse eine endgültige Methode in Java haben?Kann eine abstrakte Klasse eine endgültige Methode haben?
Antwort
Ja, diese Methoden können nicht in Unterklassen überschrieben werden. Ein Beispiel dafür ist die Mustervorlage Methode ...
Ja, es kann ... Bedarf mehr Zeichen
Natürlich ist es bedeutet, dass Sie es Unterklasse können, aber Sie können nicht diese spezielle Methode außer Kraft setzen.
Ja. Der Modifizierer abstract
macht es möglich, einige der Implementierung einer Klasse wegzulassen (d. H. Einige abstract
Methoden haben), aber keine Einschränkungen für Sie auferlegt.
Ja.
Tipp: Starten Sie einfach Ihre Lieblings-IDE (Eclipse, Netbeans, etc) und probieren Sie es aus. Es wird sich beschweren, wenn es nicht funktioniert.
-1. Der Sinn von SO besteht nicht darin, den Leuten zu sagen, dass sie es selbst ausprobieren sollen. Es ist eine Verschwendung von Aufwand und Zeit, wenn jeder, der eine Internetsuche für diese Frage durchführt, eine IDE starten und es selbst ausprobieren muss, wenn jemand eine vollständige und umfassende Antwort auf die Frage geben kann: http://stackoverflow.com/questions/1299398/1299434 # 1299434 –
Ja, dein Recht und ich akzeptiere den Downvote, aber das ist die dritte triviale Frage von keyur über abstrakte Klassen in der Reihe, also habe ich eine Ausnahme gemacht. –
@Andreas_D: Ich habe verpasst, dass Keyur zahlreiche Fragen zum gleichen Thema gestellt hat, und ich habe genug gesehen "Warum versuchst du es nicht für dich selbst?" Antworten und Kommentare heute Morgen, dass ich etwas zu schnell mit dem Downvote reagiert habe. Ich habe es entfernt (bedeutet das, dass du deine Wiederholung zurückbekommst?), Da deine Antwort nicht wirklich falsch ist. –
Sicher. Werfen Sie einen Blick auf die Template method pattern für ein Beispiel.
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();
}
}
Klassen, die Game
verlängern müssten noch alle abstrakten Methoden implementieren, aber sie würden nicht in der Lage playOneGame
zu verlängern, weil es endgültig deklariert wird.
Eine abstrakte Klasse kann auch Methoden haben, die weder abstrakt noch final sind, sondern nur normale Methoden. Diese Methoden müssen in der abstrakten Klasse implementiert werden, aber es liegt am Implementierer selbst zu entscheiden, ob erweiterte Klassen diese überschreiben müssen oder nicht.
ausgezeichnet! Upvote für die Vorlage Methode Muster –
Aber wats die Verwendung davon – Sawyer
@Bill die Eidechse: ausgezeichnete Antwort! Aber ich habe eine Frage: Was wäre, wenn die Methode playOneGame() eine normale (nicht endgültige) Methode wäre? es war das gleiche? Welchen Vorteil kann man hier nutzen, anstatt ein Keyword zu verwenden? Danke –
Ja, kann es. Aber die endgültige Methode kann nicht abstrakt sein (andere nicht-finale Methoden in derselben Klasse können auch sein).
In der abstrakten Klasse können Methoden definiert werden oder nicht. Wenn wir die abstrakte Klasse erweitern, dann hat nur sie eine Bedeutung. Also, was auch immer Methoden, die wir in Abstract deklarieren oder definieren, nennen, werden sie in Unterklassen überfahren. So können wir eine Methode in der Klasse Abstract als final deklarieren, und sie wird in der Unterklasse überschrieben.
Ich sehe, was Sie hier zu sagen versuchen, aber bitte bearbeiten Sie Ihre Antwort, da es jetzt sehr unklar ist. – szegedi
Ja, es kann "finale" Methoden in der "abstrakten" Klasse geben. Aber jede "abstrakte" Methode in der Klasse kann nicht als final deklariert werden. Es wird geben "illegale Kombination von Modifikatoren: Zusammenfassung und endgültige" Fehler.
public abstract final void show();
illegal combination of modifiers: abstract and final
Hier ist das Arbeitsbeispiel der Implementierung.
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();
}
}
OUTPUT: -
Yes
Overridden
Success overriding
Hier ist die ideone Link: - http://ideone.com/G1UBR5
Angenommen, ich entworfen Klasse wollen, die eine gewisse Umsetzung hat, aber ich will nicht andere (Unterklassen) zu implementieren Sie es aber andere Methoden, dann in diesem Fall brauchen wir eine endgültige implementierte Methode und offensichtliche Wahl abstrakte Klasse.
Sie sollten mehr Erklärung geben. Template-Methode bedeutet nicht endgültig, obwohl es sicherlich das Leben einfacher macht. – kdgregory
Ok sagen wir, das Finale wird dringend empfohlen :) Ich betrachte es als einen Fehler, nicht für die Vorlage-Methode endgültig zu verwenden ... – pgras