Für alle, die hier über den Thread stolpern und dann leicht verwirrt werden möchte ich einfach einmal ein paar Punkte deutlich machen.
Also es gibt hier jetzt 3 Punkte, die betrachtet werden müssen:
a) Das Thema Inheritance. Wenn eine Klasse von einer anderen erbt, dann ist klar vorgegeben, was von dieser Klasse geerbt wird und was nicht.
b) Overriding - Eine Methode kann überschrieben werden. Laut Definition der JLS wird die Methode dann nicht geerbt sondern überschrieben.
c) Overloading - Es kann mehrere Methoden mit gleichem Namen aber unterschiedlichen Signaturen geben. Und da gibt es dann Regeln, die gelten müssen.
Die Bedingungen sind in
Chapter 8. Classes (oracle.com) auch recht deutlich:
Inheritance (Methoden)
Eine Methode wird geerbt wenn:
A class C
inherits from its direct superclass type D all concrete methods m (both static and instance) for which all of the following are true:
- m is a member of D.
- m is public, protected, or declared with package access in the same package as C.
- No method declared in C has a signature that is a subsignature (§8.4.2) of the signature of m as a member of D.
Also die Methode muss in der übergeordneten Klasse sein und sie muss public protected oder package private sein mit beiden Klassen im gleichen Package.
Und sie darf nicht überschrieben worden sein - sprich die Signatur darf keine "subsignature" sein.
Overriding
Beim
Overriding ist es dann sehr ähnlich - nur der letzte Punkt ist eigentlich negiert sowie leichte Veränderungen bezüglich der Zugriffsrechte:
An instance method mC declared in or inherited by class C,
overrides from C another method mA declared in class A, iff all of the following are true:
- C is a subclass of A.
- C does not inherit mA.
- The signature of mC is a subsignature (§8.4.2) of the signature of mA as a member of the supertype of C that names A.
- One of the following is true:
- mA is public.
- mA is protected.
- mA is declared with package access in the same package as C, and either C declares mC or mA is a member of the direct superclass type of C.
- mA is declared with package access and mC overrides mA from some superclass of C.
- mA is declared with package access and mC overrides a method m' from C (m' distinct from mC and mA), such that m' overrides mA from some superclass of C.
If mC is non-abstract and overrides from C an abstract method mA, then mC is said to
implement mA
from C.
Dann kommt als letzter Fall noch das
Hiding, das hier im Thread noch nicht angesprochen wurde und das führe ich jetzt nicht weiter aus.
Overloading
Dann hatten wir noch als weiteren Punkt das
Overloading - das Überladen von Methoden. Das hat mit Inheritance wenig zu tun:
Overloading ist einfach, dass es mehrere Methoden geben kann mit gleichem Namen aber mit unterschiedlichen Signaturen. Was da für Regeln gelten ist dann in der JLS im Detail erläutert. Dabei spielt es aber keine Rolle, woher die Methoden kommen: Sie können aus der übergeordneten Klasse geerbt worden sein oder die Methoden sind in der Klasse selbst geschrieben worden (und dann können sie ggf. eine vorhandene Methode überschreiben oder verstecken). Das spielt alles keine Rolle - wichtig sind lediglich die Regeln, die da dann bezüglich der Signaturen gelten.