Verständnisproblem mit Abstrakten zu Konkreten Klassen

Status
Nicht offen für weitere Antworten.
V

Verwirrter

Gast
Huhu,
ich habe da wohl ein Verständnisproblem. Ich habe bislang immer nur (jedenfalls bewusst *g*) neue Objekte in der Art erzeugt:
Code:
ArrayList liste = new ArrayList();
.

Jetzt habe ich ein paar Fälle gesehen bei denen zb ein

Code:
Flugzeug() f16 = new Kampfflugzeug()

erzeugt wurde. Wenn die Klasse Flugzeug zb. starten(), landen() implementiert hat und Kampfflugzeug waffen() zusätzlich implementiert und den Rest von Flugzeug erbt, welchen Sinn macht es dann f16 wie oben angegeben zu erzeugen?
Ich habe das bislang immer so gelesen, dass dann "f16" eigentlich ein Flugzeug ist, aber als Kampfflugzeug erzeugt wird. Wieso schreibt man das nicht dann als
Code:
Kampfflugzeug f16 = new Kampfflugzeug();
?

Ist das evtl. weil in Kampfflugzeug starten() überschrieben wird, aber ich eine f16 mit starten() von Flugzeug haben will?

Ich hoffe ihr könnt mir ein wenig helfen. Ich programmiere zwar schon ein bissl aber irgendwie ist diese Thematik an mir vorbeigegangen (ich habe wohl unbewusst sowas schon implementiert, aber mir nie genaue Gedanken drüber gemacht). Darauf gestoßen bin ich, als ich mir das Factory Pattern durchgelesen habe, wo diese Art der Objekterzeugung genutzt wird.
 

Wildcard

Top Contributor
Ich erklär's dir besser anhand der Liste:
Code:
ArrayList liste = new ArrayList();
Das ist unsauber. Besser wäre
Code:
List liste = new ArrayList();
oder
Code:
Collection liste = new ArrayList();
Der Grund dafür ist die Fexibilität der Anwendung.
Du versuchst so wenig Informationen wie möglich preiszugeben um insgesamt flexibler zu bleiben.
Wenn eine Methode eigentlich nur eine Collection braucht, warum soll sie dann wissen das es sich um eine ArrayList Implementierung handelt?
Was ist wenn du plötzlich feststellst das es auch ein HashSet tut?
Schlagwort Information Hiding.
 
G

Gast

Gast
noch besser wäre

List<Type> list = new ArrayList<Type>();

;-)
 

Illuvatar

Top Contributor
Mir fallen auf Anhieb 2 Gründe ein, wo so ein Code Sinn macht:

a) Im Zusammenhang mit Collections/Arrays. Stell dir zum Beispiel ein Flugzeug[] vor. Da können dann unterschiedliche Flugzeuge, z.B. auch Kampfflugzeuge drin sein - der Aufrufer kann dann zum Beispiel auf jedem Flugzeug aus dem Array starten() aufrufen, ohne dass es ihn interessiert, was das eigentlich für Objekte sind.

b) Zur Eerweiterbarkeit deines Programms - wenn du weißt, du brauchst an einer Stelle nur die Funktion eines Flugzeugs, willst aber ein Kampfflugzeug verwenden. Wenn du dann später noch eine Klasse Zivilflugzeug baust, das an dieser Stelle besser passt, kannst du das ganz leicht austauschen. Richtig deutlich wird das bei den Collection-Klassen aus java.util:
Statt
Code:
ArrayList list = new ArrayList();
sollte man schreiben:
Code:
List list = new ArrayList();
da man so gar nicht auf die Idee kommen kann, ArrayList-spezifische Methoden zu verwenden, dann hat man es einfacher, wenn man z.B. bemerkt, dass eine LinkedList viel performanter wäre. Da muss man dann sicher nur die Zeile ändern:
Code:
List list = new LinkedList();

Edit: Wuaahh, viel zu langsam. Man sollte während dem Schreiben hier nicht noch was anderes machen :D
 
V

Verwirrter

Gast
Huhu, danke für die Antworten.

D.h. heisst also, wenn ich weiss das ich mit dem Kampfflugzeug eh nur rumfliege und die Waffen nicht benötige, reicht Flugzeug f16 = new Kampfflugzeug()?

Dann hab ich ein Kampfflugzeug "f16" welches aber nur wie ein Flugzeug zu benutzen ist (da die speziellen Kampfflugzeugfunktionen nicht nutzbar sind?)
Wenn ich jedoch "rumballern" will, dann sollte ich mich auf Kampfflugzeug f16 = new Kampfflugzeug() festlegen?

Und wenn ich ein Flugzeug-Array mit Passagier-,Segel-,Sportflugzeug (usw) Objekten habe, die mit Flugzeug xx = new SpeziellesFlugzeug() erzeugt wurden, dann kann ich mit allen Objekten in dem Array die Funktionen (=Methoden) aus der allgemeinen Flugzeugklasse nutzen (jedoch nicht die speziellen Methoden der einzelnen Unterklassen)?

Wobei, wenn ja Flugzeug ein Interface ist, oder als Oberklasse abstrakte Methoden hat, dann kann ich auch diese "speziellen" Methoden der konkreten Flieger nutzen. Kommt das hin oder bin ich da auf dem Holzweg? :)

Cu
 

Wildcard

Top Contributor
Wobei, wenn ja Flugzeug ein Interface ist, oder als Oberklasse abstrakte Methoden hat, dann kann ich auch diese "speziellen" Methoden der konkreten Flieger nutzen.
Keine Ahnung was du damit sagen willst, aber der Rest passt soweit.
Für den Variablen Typ gilt immer folgendes:
So allgemein wie möglich, so spezifisch wie nötig.
 
V

Verwirrter

Gast
Huhu,
ich versteh mich manchmal selber net :)

Ich meinte zwei Sachen. Zum einen, wenn ich zb ein Flugzeuginterface habe und andere Klassen dieses eine Interface implementieren, müssen diese Klassen die im interface genannten Methoden auch implementiert haben und von daher müsste ich auch darauf zugreifen können.

Und zum zweiten habe ich mich auf eine Flugzeugklasse bezogen, die abstrakte Methoden enthält. Diese Methoden müssen ja von den Subklassen "ausprogrammiert" werden und von daher weiß das Flugzeug-Objekt bereits das seine Subklassen diese Methode enthalten müssen.

Da in beiden Fällen jedoch die Methoden schon in der Flugzeug"ober"klass bzw im Flugzeuginterface auftauchen, ist es ganz normal das ich dort schon auf diese Methoden zugreifen kann...

Aber ich verwirr euch nur und während ich das hier schreibe, hab ich die Zusammenhänge verstanden. Danke :)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Verständnisproblem bei Server/Client Java Basics - Anfänger-Themen 3
nonickatall Grundsätzliches Verständnisproblem des Aufbaus eines Programms Java Basics - Anfänger-Themen 19
X Verständnisproblem Call-By-Reference Java Basics - Anfänger-Themen 5
P JavaFX: Verständnisproblem bei ComboBox/ChoiceBox etc. Java Basics - Anfänger-Themen 9
T Verständnisproblem mit Assoziationen Java Basics - Anfänger-Themen 7
M Verständnisproblem der Rekursion bei Arrays Java Basics - Anfänger-Themen 8
A Erste Schritte Verständnisproblem Java Basics - Anfänger-Themen 5
S Verständnisproblem Aufgabe Java Basics - Anfänger-Themen 9
S Model View Controller: Verständnisproblem Java Basics - Anfänger-Themen 13
temi Verständnisproblem Class.forName() Java Basics - Anfänger-Themen 3
2 Verständnisproblem bei Anwendung von Lower Bounded Wildcards Java Basics - Anfänger-Themen 5
V Verständnisproblem Java Basics - Anfänger-Themen 22
L [Verständnisproblem] Array wird trotz void rückgabe verändert. Java Basics - Anfänger-Themen 5
A Verständnisproblem Ausgabe Do-While-Schleife Java Basics - Anfänger-Themen 3
J Verständnisproblem einer Methode Java Basics - Anfänger-Themen 20
M Konstruktur - Verständnisproblem Java Basics - Anfänger-Themen 4
C Postinkrement und println - Verständnisproblem Java Basics - Anfänger-Themen 8
T Verständnisproblem beim Vigenere-Verfahren Java Basics - Anfänger-Themen 2
Q MVC Verständnisproblem: Controller vs model.modelChanged() Java Basics - Anfänger-Themen 0
N Verständnisproblem InsertionSort. Java Basics - Anfänger-Themen 2
D Verständnisproblem Java Basics - Anfänger-Themen 2
B VerständnisProblem mit Beispielaufgabe aus Buch Java Basics - Anfänger-Themen 1
H Polymorphie Verständnisproblem Vererbung/Polymorphie Java Basics - Anfänger-Themen 4
FrankR2 Grundsätzliches Verständnisproblem: Java 32/64-bit; Windows 7/8, 32/64-bit-System Java Basics - Anfänger-Themen 5
S Verständnisproblem bei Interfaces Java Basics - Anfänger-Themen 6
V Verständnisproblem Java Basics - Anfänger-Themen 5
V Arrays-verständnisproblem Java Basics - Anfänger-Themen 4
M Collections HashSet verständnisproblem Java Basics - Anfänger-Themen 9
S Verständnisproblem einer Übungsaufgabe Java Basics - Anfänger-Themen 6
H Abstrakte Basisklasse Verständnisproblem! Java Basics - Anfänger-Themen 8
G Verständnisproblem mit swing Java Basics - Anfänger-Themen 6
F Methoden Cannot refer to a non-final variable.. verständnisproblem. Java Basics - Anfänger-Themen 7
P Verständnisproblem main Methode Java Basics - Anfänger-Themen 9
S Klassen Verständnisproblem Konstruktor Java Basics - Anfänger-Themen 7
I e.getMessage(); - Verständnisproblem Java Basics - Anfänger-Themen 6
lesni Vererbung Vererbung - Verständnisproblem Java Basics - Anfänger-Themen 2
M OOP Polymorphie/Vererbung Verständnisproblem Java Basics - Anfänger-Themen 2
J Verständnisproblem Methoden-Kettung Java Basics - Anfänger-Themen 3
A Vererbung Verständnisproblem bei Übung Java Basics - Anfänger-Themen 5
E Verständnisproblem Typkonvertierung Java Basics - Anfänger-Themen 4
S OOP Verständnisproblem Umsteiger Java Basics - Anfänger-Themen 22
C Array Verständnisproblem Java Basics - Anfänger-Themen 3
P White-Box-Test Verständnisproblem Java Basics - Anfänger-Themen 11
D : ? Operator -Verständnisproblem Java Basics - Anfänger-Themen 24
G Verständnisproblem: Exceptions Java Basics - Anfänger-Themen 17
L Eclipse verlangt "{" nach ";"... Verständnisproblem Java Basics - Anfänger-Themen 5
D charAt(i) verständnisproblem Java Basics - Anfänger-Themen 4
D Verständnisproblem Marken und Schleifen Java Basics - Anfänger-Themen 19
M Verständnisproblem bei Ternären Operanten bzw. Bedingungsoperator Java Basics - Anfänger-Themen 8
T Datentypen Verständnisproblem mit main Methode Java Basics - Anfänger-Themen 3
M Verständnisproblem Threads Java Basics - Anfänger-Themen 7
X Threads und synchronized - Verständnisproblem Java Basics - Anfänger-Themen 3
W ArrayLists: Verständnisproblem bei remove() Java Basics - Anfänger-Themen 2
B Verständnisproblem zu Swing und Methoden Java Basics - Anfänger-Themen 8
A Postinkrement-Verständnisproblem Java Basics - Anfänger-Themen 12
R Iterator Liste, Verständnisproblem Java Basics - Anfänger-Themen 4
1 Verständnisproblem mit Foreach Java Basics - Anfänger-Themen 4
B Verständnisproblem bei Vererbung Java Basics - Anfänger-Themen 3
W generisches Programmieren - Verständnisproblem Java Basics - Anfänger-Themen 4
A Verständnisproblem Nr 2 Java Basics - Anfänger-Themen 14
A Verständnisproblem Java Basics - Anfänger-Themen 6
A Array Verständnisproblem Java Basics - Anfänger-Themen 8
G Verständnisproblem --> JTree Java Basics - Anfänger-Themen 6
M Verständnisproblem mit der Klasse Thread Java Basics - Anfänger-Themen 10
N BufferedReader Verständnisproblem Java Basics - Anfänger-Themen 12
G Verständnisproblem: Code kompelieren und interpretieren Java Basics - Anfänger-Themen 3
S Polymorphie Verständnisproblem Java Basics - Anfänger-Themen 4
G Verständnisproblem Türme von Hanoi Java Basics - Anfänger-Themen 4
G Verständnisproblem Serverinput einlesen. Java Basics - Anfänger-Themen 4
J Array und Schleifen Verständnisproblem Java Basics - Anfänger-Themen 25
G Verständnisproblem Java Basics - Anfänger-Themen 4
N Verständnisproblem: Mehrere Objekte einer Klasse erstellen Java Basics - Anfänger-Themen 2
S SelectionListener + repaint().Verständnisproblem ;) Java Basics - Anfänger-Themen 7
A Problem mit der Stringgrösse, bzw Verständnisproblem? Java Basics - Anfänger-Themen 14
A Verständnisproblem mit ScrollPanel Java Basics - Anfänger-Themen 3
R Verständnisproblem mit Hibernate Java Basics - Anfänger-Themen 2
T Verständnisproblem mit equals() Java Basics - Anfänger-Themen 4
N datei byte für byte auslesen (verständnisproblem) Java Basics - Anfänger-Themen 2
T Verständnisproblem packages/import Java Basics - Anfänger-Themen 9
Chucky Lineare Listen Programm Verständnisproblem Java Basics - Anfänger-Themen 38
D Verständnisproblem Java Basics - Anfänger-Themen 6
S for Schleifen: Verständnisproblem Java Basics - Anfänger-Themen 15
T Vererbung von Attributen und Methoden, Verständnisproblem Java Basics - Anfänger-Themen 4
bernd while-Schleife: Verständnisproblem Java Basics - Anfänger-Themen 7
S verständnisproblem drucken Java Basics - Anfänger-Themen 11
G GridBagLayout: Verständnisproblem Java Basics - Anfänger-Themen 5
U Funktionale Interfaces mit mehreren abstrakten Methoden? Java Basics - Anfänger-Themen 8
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
M Methoden Overloading in abstrakten Klassen Java Basics - Anfänger-Themen 26
F Probleme mit privaten Klassen (abstrakten Klassen) Java Basics - Anfänger-Themen 1
P OOP Sinn von abstrakten Klassen Java Basics - Anfänger-Themen 2
B in einem abstrakten Set ,Elemente einer einfache verkettete List epeichern Java Basics - Anfänger-Themen 13
G Methode einer Abstrakten Klasse aufrufen Java Basics - Anfänger-Themen 1
C Konstruktor in Abstrakten Klassen Java Basics - Anfänger-Themen 4
O Javadoc bei abstrakten Methoden Java Basics - Anfänger-Themen 1
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
G Auf einen bestimmten Konstruktor in der abstrakten Superklasse zugreifen? Java Basics - Anfänger-Themen 2
T Interface implementieren mit Abstrakten Typen? Java Basics - Anfänger-Themen 4
F Interface Unterschied von Attributen und Methoden bei abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
T fenster schliesen und mouse events in einer nicht abstrakten klasse Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben