Abstrakte Klasse ermöglicht es Ihnen, Felder zu definieren so ist es einfach, einige Stateful Basisimplementierung zu implementieren.
In Pre-Java 8 gibt es keine Standardmethoden in Schnittstellen, so dass die einzige Art und Weise, wie Standardmethode Implementierung zur Verfügung zu stellen war abstrakte Klasse zu erstellen.
Da Java 8 können Sie an der Schnittstelle Standardmethoden und statische Methoden definieren, aber noch gibt es keine Felder.
, was die Verwendung eines nicht abstrakte Methode in einer abstrakten Klasse ist
Methoden, die nicht als abstrakt gekennzeichnet sind, können als Standardverfahren in der Standardklasse verwendet werden. Der Grund, warum Sie nicht abstrakte und abstrakte Methoden haben, ist, dass einige Klassenfunktionen (einige Methoden) von der abstrakten Methode abhängen.Hier ein Beispiel:
public class AbstractGreeting {
private final String name;
protected AbstractGreeting(String name) {this.name = name;}
public void displayGreeting() {System.out.println(getGreeting() + " " + name + "!");}
protected abstract String getGreeting();
}
Einige concret Implementierungen:
public class HelloGreeting extends AbstractGreeting {
public HelloGreeting(String name) { super(name);}
@Override protected String getGreeting() { return "Hello"; }
}
public class AlohaGreeting extends AbstractGreeting {
public AlohaGreeting (String name) { super(name);}
@Override protected String getGreeting() { return "Aloha"; }
}
Und Nutzung:
HelloGreeting hg = new HelloGreeting("World"); hg.displayGreeting();
AlohaGreeting ag= new AlohaGreeting ("World"); hg.displayGreeting();
Sure können abstrakte Klassen in die Schnittstelle umgewandelt werden, wenn Sie implementator zwingen Objekts zurückzukehren Zustand. Für abstrakte Beispielklasse kann über neu geschrieben werden als:
public interface Greeting {
String getName();
String getGreeting();
default void displayGreeting() {System.out.println(getGreeting() + " " + name + "!");}
}
Umsetzung:
public class HelloGreeting implements Greeting {
@Override public String getName() {return "World";}
@Override public String getGreeting() {return "Hello";}
}
Aber manchmal ist es besser, keinen Zugang zu staatlichen Objekt bieten daher abstrakte Klassen könnten in einigen Situationen besser geeignet .
Wurde 1000s mal notiert –
* "Was ist die Verwendung einer nicht abstrakten Methode in einer abstrakten Klasse." * Als Beispiel siehe [Vorlagenmethode Muster] (https://en.wikipedia.org/wiki/ Template_method_pattern) – Andreas