Ja, ich denke, Sie haben Recht. Die zweite Option betrifft nur einen bestimmten Fall: besondere Unterklasse ist in einem anderen Paket als seine Oberklasse.
Zum Beispiel
package superpackage;
public abstract class SuperFoo {
abstract void foo();
}
package subpackage;
import superpackage.SuperFoo;
public abstract class SubFoo extends SuperFoo {}
Bitte beachten Sie, dass diese Klasse abstrakt deklariert werden sollte, sonst Kompilierungsfehler wir haben.
In diesem speziellen Fall haben wir nicht "Vererbung von foo-Methode" als Vererbung erfordert , dass SubFoo-Klasse im gleichen Paket wie SuperFoo sein. siehe Abschnitt 8.4.8 in JLS für weitere Details.
Trotzdem enthält diese Klasse immer noch die "foo" -Methode (per Definition) und sollte daher mit abstract keyword markiert werden.
Außerdem können wir unsere SubFoo-Klasse um eine weitere konkrete Klasse erweitern, die zum "Superpackage" -Paket gehört.
Zum Beispiel
package subclass;
import subpackage.SubFoo;
public class SecondSubFoo extends SubFoo {
@Override
void foo() {}
}
Hinweis:
1) Die Tatsache, dass die öffentlichen und geschützten Methoden in Artikel der Definition zuerst fallen, wie sie vererbt werden und es besteht keine Notwendigkeit zweite Element der Definition für Sie.
2) Paketzugriffsmethoden fallen auch in das erste Element der Definition, wenn sie sich im selben Paket befinden und daher gibt es kein zweites Element der Definition für sie auch.
3) Andererseits fallen Paketzugriffsmethoden, die in dem anderen Paket enthalten sind, nicht in den ersten Definitionsbereich, da sie nicht vererbt werden (siehe Definition der Vererbung abstrakter Methoden in Abschnitt 8.4.8 von JSL). und daher sind sie ein zweiter Definitionsgegenstand.
Es ist im Grunde gesagt, dass Ihre Klasse abstrakt ist, bis Sie konkrete Implementierungen für alle Ihre abstrakten Methoden bereitstellen (Methoden explizit in Ihrer Klasse oder implizit von übergeordneten Klassen). Denken Sie daran: "Paketumfang" ist, wenn Sie * nicht "öffentlich" oder "geschützt" oder "privat" angeben; Es ist überall in der Verpackung sichtbar und außerhalb der Verpackung nicht sichtbar. – paulsm4