Methoden Verständnisfrage Vererbung von Methoden

Werniman

Mitglied
Hallo,
ich bin gerade dabei, das Buch "Schrödinger programmiert Java" durchzuarbeiten. Beim Thema Vererbung habe ich allerdings ein kleines Verständnisproblem.

Bisher hatte ich den Ablauf des Methodenaufruf in den früheren Beispielen so verstanden:
Oberklasse variable = new Unterklasse();
//erzeugt eine Referenzvariable vom Typ Oberklasse, die mit einem Objekt vom Typ Unterklasse verknüpft ist.

variable.methode();
// Es wird erstmal geschaut,ob es die Methode in der Oberklasse gibt und dann ob sie in der Unterklasse überschrieben wird (da das verknüpfte Objekt diesen Typ hat). Wenn die Methode aber bereits in der Oberklasse als static gekennzeichnet ist, wird gar nicht erst nach einer vererbten Methode gesucht.

Seh ich das so richtig ?
 

White_Fox

Top Contributor
static heißt, daß es diesselbe Methode für alle Objekte dieser Klasse gibt. Ich würde sogar sagen, daß sie im eigentlichen Sinne gar nicht vererbt wird, da statische Elemente nicht mehr objektspezifisch, sondern allenfalls klassenspezifisch sind.

Ansonsten machst du dir meines Erachtens gerade zu viele Gedanken um Implementierungsdetails und es ist hilfreich, sich von diesen zu lösen. Eines der Geheimnisse in der objektorientierten Programmierung besteht in der Vereinfachung-und diese Vereinfachung muß man erstmal in sein Denken reinkriegen. (Das klingt zunächst trivial, ist tatsächlich aber alles andere als das.)

Eine Methode wird durch ihre Signatur, das ist die Kombination aus Rückgabewert, Methodenname und Aufrufparameter, definiert. Eigentlich legst du damit nur fest was du einem Objekt damit vor die Füße werfen kannst und was es daraufhin zurückliefert.

Was der Compiler im Hintergrund macht, ob er erst in der Oberklasse nach einer Methode sucht und dann in der Unterklasse schaut...ehrlich gesagt: das weiß ich gar nicht. Ich weiß nichtmal, ob man das so überhaupt sagen kann.
Was ich dir aber sagen kann: Gewöhne dir schnurstracks ab, in einer Hochsprache auf solche Ausführungsdetails zu schließen. Zwischen dem von dir geschriebenem Code und dem was der Computer dann tatsächlich macht liegen so viele Abstraktionsschichten und Optimierungsprozesse daß solche Überlegungen eigentlich immer fehl gehen.
 

abc66

Top Contributor
Im Prinzip ist es ganz einfach. Es gibt Überladung, Überschreibung und Verstecken.
Zur Methodensignatur siehe hier: https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.2 (~= Name+Parameter)
Zur Vererbung siehe insbesondere den Abschnitt: Example 8.4.9-2. Overloading, Overriding, and Hiding

Ein Beispiel:
Java:
class A {
	float hidingExample1 = 1;

	static void hidingExample2() {
		System.out.println("hidingExample2 A " + new A().hidingExample1);
	}

	void overrideExample1() {
		System.out.println("overrideExample1 A " + hidingExample1);
	}

	void overloadExample1() {
		System.out.println("overloadExample1 A " + hidingExample1);
	}

	void overloadExample1(float f) {
		System.out.println("overloadExample1 A " + hidingExample1 + " " + f);
	}
}

class B extends A {
	float hidingExample1 = 2;

	static void hidingExample2() {
		System.out.println("hidingExample2 B " + new B().hidingExample1);
	}

	void overrideExample1() {
		System.out.println("overrideExample1 B " + hidingExample1);
	}
}

Java:
	public static void main(String[] args) {
		A a = new B();
		a.hidingExample2();
		B.hidingExample2();
		a.overrideExample1();
		a.overloadExample1();
		a.overloadExample1(3);
		new A().overrideExample1();
	}

Alles andere ist nicht erlaubt.
Frage: Was wird ausgegeben werden?

PS. a.hidingExample2(); sollte so nicht aufgerufen werden, hilft aber bei dem Verständnis.
PS2. Es ist zudem nicht erlaubt, die Sichtbarkeit von überschriebenen Methoden einzuschränken...
 

abc66

Top Contributor
Wobei ich mir gerad unsicher bin, ob hidingExample2 nicht besser overrideAndHidingExample2 heißen müsste... Statische Methoden werden auch überschrieben, kommen jedoch bei der Polymorphie nicht zum Zuge. :(
 

abc66

Top Contributor
Ich denke, man könnte auch von einer speziellen Form der Vererbung sprechen... Wenn du aber sagst, das ist Blödsinn, wirst du recht haben.

Jedenfalls darf man dessen/deren Sichtbarkeiten auch nicht einschränken.
 
K

kneitzel

Gast
Nunja - darüber bin ich auch etwas gestolpert und musste es doch gleich verifizieren: Es scheint zu stimmen.

Ich habe also einfach eine Klasse A mit statischer Methode test() gemacht. Dann Klasse B, die von A erbt.
==> B.test() war möglich und A.test() wurde ausgeführt.
Dann in b auch ein public static test() geschrieben und siehe da: Nun wurde diese Methode aufgerufen.

Hat mich etwas gewundert, denn ich meine, dass ich da in der Vergangenheit schon einmal drüber gestolpert bin und er so ein Konstrukt nicht mochte. Aber das kann auch an etwas anderem gelegen haben.

Nur zur Info: bei mir ging es um Builder in abgeleiteten Klassen. Ist evtl. der eine oder andere auch schon etwas drüber gestolpert :)
 

mrBrown

Super-Moderator
Mitarbeiter
Ich habe also einfach eine Klasse A mit statischer Methode test() gemacht. Dann Klasse B, die von A erbt.
==> B.test() war möglich und A.test() wurde ausgeführt.
Dann in b auch ein public static test() geschrieben und siehe da: Nun wurde diese Methode aufgerufen.
B#test wird allerdings nur aufgerufen, wenn der statische Typ B ist. Dann ist A#test durch B#test versteckt, und B#test wird aufgerufen, sonst A#test.

Gleiches passiert ja, wenn test ein Feld und keine Methode wäre.
 
K

kneitzel

Gast
Das ist einfach das Hiding statischer Methoden.
Ja klar, ich erinnere mich jetzt nur nicht, wo die Problematik damals bei mir lag. Diese Thematik hat man in der Praxis ja in der Regel nicht wirklich. Zumindest erinnere ich mich jetzt nicht, wo diese Thematik jemals relevant gewesen wäre in meiner Praxis - abgesehen halt einmal bezüglich dieser abgeleiteten Builder. Daher halt tatsächlich eine gewisse Unsicherheit, wie es sich verhält. Und statt dies über JLS zu verifizieren ist ein kleiner Test halt schneller.
 

mihe7

Top Contributor
K

kneitzel

Gast
Vielleicht waren es statische Factory-Methoden bei abgeleiteten Klassen?
Die statische Methode war lediglich die getBuilder Methode (so dass es halt MyClass.getBuilder() ist statt eines neu MyClass.Builder() um den Builder zu bekommen. Wobei das Kernproblem bei abgeleiteten Buildern ja die Rückgabe des Builders ist. Man will ja den eigentlichen Builder behalten, auch wenn eine Methode vom Basis Builder aufgerufen wurde. Geht mit Generics relativ gut aber fand ich teilweise zumindest ungewohnt.

Generell sehe ich da sehr viel Code für wenig Aktivität. Da bin ich doch ernsthaft am überlegen z.B. Lombok einzuführen. Aber das muss man mal in einer ruhigen Minute im Team diskutieren ...
 

M.L.

Top Contributor
Weiterhin kann man sich ein kleines Beispiel zwecks Studium ansehen und damit experimentieren: https://www.geeksforgeeks.org/inheritance-in-java/ (Single Inheritance)
Java:
  ... 
class one
{
    public static void print_geek()
    {
        System.out.println("Geeks");
    }
}
 
class two extends one
{
    @Override //Fehlermeldung: "method does not override or implement a method from a supertype" oder
//"print_geek() in two cannot override print_geek() in one"
//Lösung: static löschen

    public void print_geek()
    {
        System.out.println("for");
    }
}
...
two g = new two(); //Je nach instanziierter Klasse greift der Compiler auf die jeweils definierte Methode zu
        g.print_geek();
        //g.print_for();
        //g.print_geek();
...
Ansonsten könnte das Diamond-Problem aus der C++-Programmierung als (warnendes) Schlagwort dienen: https://www.geeksforgeeks.org/multiple-inheritance-in-c/
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
A Verständnisfrage Java Basics - Anfänger-Themen 12
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
P Verständnisfrage: PageFactory.initElements Java Basics - Anfänger-Themen 2
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
G while.next() Verständnisfrage Java Basics - Anfänger-Themen 16
Vivien Kurze Verständnisfrage zu Java Point aus java.awt.* Java Basics - Anfänger-Themen 5
C Erste Schritte Anfänger Verständnisfrage zum Compiler Java Basics - Anfänger-Themen 31
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
J Verständnisfrage zu throws neben Funktionen Java Basics - Anfänger-Themen 2
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
P Verständnisfrage zum Mapping Java Basics - Anfänger-Themen 3
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Verständnisfrage zur Konsolenausgabe Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
S Verständnisfrage lokale Ordnerpfade Java Basics - Anfänger-Themen 1
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
O Anfänger, Verständnisfrage Java Basics - Anfänger-Themen 3
C Verständnisfrage zu Modulo Java Basics - Anfänger-Themen 6
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
L Verständnisfrage - Speicherabbild Java Basics - Anfänger-Themen 4
melly_ Verständnisfrage zu args Java Basics - Anfänger-Themen 3
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
K Verständnisfrage eines Abschnitts Java Basics - Anfänger-Themen 6
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
JavaTalksToMe Erste Schritte Println-Frage (Verständnisfrage) Java Basics - Anfänger-Themen 1
R Verständnisfrage zu Objekten u. Übergabeparameter Java Basics - Anfänger-Themen 8
G Collections Verständnisfrage zur For-Each-Schleife Java Basics - Anfänger-Themen 7
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
G Verständnisfrage zu for-each Java Basics - Anfänger-Themen 4
DontFeedTheTroll Erste Schritte Verständnisfrage zu If-Anweisung Java Basics - Anfänger-Themen 7
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
Z Verständnisfrage Anfängerprogramm Java Basics - Anfänger-Themen 0
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
G Methoden Verständnisfrage zur Methoden Java Basics - Anfänger-Themen 7
LionAge Kapselung, Verständnisfrage zur Objekterzeugung Java Basics - Anfänger-Themen 4
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
R OOP / Verständnisfrage zum Konstuktor (siehe code) Java Basics - Anfänger-Themen 7
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
A Verständnisfrage - Koordinatenumrechnung Java Basics - Anfänger-Themen 9
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage Array Java Basics - Anfänger-Themen 2
I Interface Verständnisfrage Interfaces (Bsp.: Enumeration) Java Basics - Anfänger-Themen 2
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
P Verständnisfrage Java Basics - Anfänger-Themen 3
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
D Input/Output Verständnisfrage Verzeichnis-/Dateiliste erstellen & Dateikonvertierung Java Basics - Anfänger-Themen 1
S Verständnisfrage zu Anweisungen und deren Wirkung Java Basics - Anfänger-Themen 7
H Verständnisfrage für oder Anweisung Java Basics - Anfänger-Themen 8
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage zu Java-Ausgabe Java Basics - Anfänger-Themen 3
S Verständnisfrage Java Basics - Anfänger-Themen 2
N Verständnisfrage Code Java Basics - Anfänger-Themen 8
B Verständnisfrage Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Verständnisfrage Codezeile Java Basics - Anfänger-Themen 7
B Verständnisfrage:Beispielprogramm BlueJ Java Basics - Anfänger-Themen 3
M Kurze Verständnisfrage zu einer Java Aufgabe Java Basics - Anfänger-Themen 12
K Erste Schritte Kleine Verständnisfrage Java Basics - Anfänger-Themen 12
R Verständnisfrage Referenzvariablen in array Java Basics - Anfänger-Themen 3
M Verständnisfrage: Objekt erzeugen u. zuweisen Java Basics - Anfänger-Themen 16
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
S Verständnisfrage: Exception Gebrauch Java Basics - Anfänger-Themen 2
R Verständnisfrage NPE Java Basics - Anfänger-Themen 5
M Verständnisfrage zur Zahlenumwandlung (Dezimal-->Dual) Java Basics - Anfänger-Themen 25
P Java Objekte - Verständnisfrage Java Basics - Anfänger-Themen 9
N Verständnisfrage zu folgendem Programm Java Basics - Anfänger-Themen 2
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
S Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 2
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
M Verständnisfrage im Umgang mit Map Java Basics - Anfänger-Themen 10
K Verständnisfrage zu int.length und String.length() Java Basics - Anfänger-Themen 4
G 2D Array gleichsetzen verständnisfrage Java Basics - Anfänger-Themen 2
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
E Verständnisfrage zu Shutdownhook Java Basics - Anfänger-Themen 5
D Verständnisfrage: Java und MySql Java Basics - Anfänger-Themen 3
F Rekursion Verständnisfrage Java Basics - Anfänger-Themen 6
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
D Verständnisfrage zu Funktionen Java Basics - Anfänger-Themen 6
H Verständnisfrage Persistenz Java Basics - Anfänger-Themen 10
neurox Verständnisfrage zu Threads Java Basics - Anfänger-Themen 4
E Verständnisfrage Syntax: frame.getContentPane().add(button) Java Basics - Anfänger-Themen 11
Y Kleine Verständnisfrage zum Thema dynamische Polymorphie Java Basics - Anfänger-Themen 3
F Verständnisfrage Objekt instanzierung / Polymorphie Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben