Java und die OOP

Zet

Aktives Mitglied
Hallo Leute,

ich scheine mit der OOP auf dem Kriegsfuß zu stehen, bzw. scheine sie einfach nicht zu verstehen.
Einige Diskussionen hier haben mich mal wieder auf das Thema blicken lassen, und alles was man meint richtig verstanden zu haben - scheint wieder falsch gewesen zu sein.

Mein Problem ist die zusammenhänge zu verstehen. Einfaches Beispiel Person:
Ich habe eine Klasse Person, von der die Klassen Mann und Frau erben.
Jetzt kann man:
- Person als normale Klasse erstellen, versorgen, und mann und frau von dieser erben lassen.
- Person als abstrakte Klasse modellieren, um sicherzustellen das die Unterklassen die Methoden ebenfalls implementieren und diese überschreiben. Dann ist es natürlich nichtmehr möglich ein konkretes Objekt der Klasse Person zu erstellen, was aber ja vermutlich (?) nie nötig sein wird. Außerdem wird die Polymorphie ein wenig verhindert?
- Person als Interface einbinden.

Doch anhand welcher Kriterien entscheidet ihr soetwas? Wann benutzt man was, auf welchem Wege und mit welchem Ziel.

Habe das Gefühl nachdem ich im OOP-Wald war, eine Lichtung entdeckt zu haben und anschließend im OOP-Dschungel gelandet zu sein...
 

BRoll

Bekanntes Mitglied
Wieso wird die Polymorphie verhindert wenn Person abstrakt ist?
Sie kann dann immer noch Mann oder Frau sein, bloß nicht eine implementierte Person (was dann aber ja der Sinn von Mann/Frau ist sowas zu geben).
Also wenn ich so bei meinen Projekten schaue, sind solche Superklassen meistens abstract,
da man diese nur als Überklasse verwendet, um mehreren unterklassen gleiche attribute/methoden mitzugeben.
Nicht abstrakt wird benötigt, wenn du eine "ganz normale" klasse hast, aber dann für besondere fälle eine angepasste
Version davon schreibst, die einige Methoden eben überschreibt und/oder erweitert. Dh. die alte Klasse wird immer noch irgendwo im Projekt verwendet, jedoch eine angepasste Version für eben den speziellen Zweck. Erst wenn es häufiger oder viele verschiedene Versionen eines Typs braucht, erstellt man dann normalerweise eine abstrakte Superklasse. Aber es kommt halt echt darauf an was du machen willst :)
 

Zet

Aktives Mitglied
Erstmal danke für deine Antwort!

Du hast recht, ich dachte in dem Sinne das man z. B. folgendes bei einer Abstrakten Oberklasse nicht machen könnte wäre die Polymorphie beeinträchtigt:

Java:
		Person[] personArray = new Person[]{new Mann(), new Frau()};

Ich habe schon etliche Mini-Projekte durch, in der Vererbung mit 1, 2 Klassen vorkam.
Ich glaube ein ordentliches OOP-Projekt, in dem alles vorkommt (Interfaces, Abstract, Vererbung ...) würde mir mal
ein Big-Picture geben.

Ein solches hatte ich leider bisher noch nicht...


Ich weiß, irgendwann macht es durch Übung hoffentlich Click, doch diese Standard Fahrzeug, Personen, ...-Übungen haben es bei meinem Sturkopf scheinbar noch nicht geschafft.

Hast du eine Idee für ein Projekt, oder Coding eines Projekt's, wo das nötig wäre?
Oder meinst du es wäre eine gute Idee sich ein Projekt auszudenken, und evtl das Forum regelmäßg nach Anregungen/Verbesserungen zu befragen? Oder fällt das dann schon unter Spam :bae:

Ich will, und muss das endlich mal auf die Kette kriegen :rtfm:

grüße
Zet
 

BRoll

Bekanntes Mitglied
Es müssen ja nicht unbedingt große Projekte sein, auch mit nur 10 Klassen kann man eine schöne Struktur bauen die viele Aspekte abdeckt.

Java:
Person[] personArray = new Person[]{new Mann(), new Frau()};

Wieso sollte das nicht funktionieren wenn Person abstrakt ist?
Wenn Person abstrakt ist funktioniert nur
Java:
Person person=new Person();
nicht. Wenn man aber ein neues Array anlegt, dann ist das "new Person[]"
ja kein Konstruktur in dem Sinn, sondern legt nur einen Container an,
indem dann eben die implementierten Konstruktoren von Mann und Frau
verwendet werden können.
(das merkt man ja auch daran dass ein objekt array immer mit null initalisiert ist)

Was auch helfen könnte, wären Unterlagen zu Clean Coding zu lesen.
Dort steht auch wann man was am ehesten macht, wie standardisierte
Interfaces, abstrakte Klassen usw. zu schreiben sind.
Vielleicht hilft dir die Beschreibung ja dann, wann etwas sinnvoll einzusetzen ist,
und noch wichtiger was denn am effizientesten wäre.

Obwohl man meistens ja eh nicht so viel Spielraum hat, in vielen Fällen gibt es eben
eine "gescheite" Lösung die im Sinne von OOP ist.
Weil ja auch Superklassen oder Interfaces eine bestimmte modifizierbarkeit und freiheiten bei der anwendung lassen, schon vom system der sprache her.
Daher merkt man eigentlich recht schnell wo ein Interface hingehört und wo nicht.
Weiterhin ist es noch abhängig von der Abstraktionstiefe und der Kapselungstiefe,
die du betreiben willst.
Ich finde man muss einen goldenen Mittelweg zwischen direkt Implementieren und Information Hiding finden.
Im krassesten implementierungs Fall => Alles in einer Klasse, damit ist OOP sowieso für die Katz und Java die falsche Sprache
Das Gegenteil wäre dann eine extrem Tiefe Abstraktionstiefe, bei der man sich erst durch meherer Klassen an Containern und Handlern durchwühlen muss, bis man mal auf ein Stückchen Implementierung stößt.
Allgemein sagt man ja, eine Klasse soll nur das machen, für was sie direkt zuständig und gedacht ist.
Und dann gibts natürlich noch verschiedene Modelle nach denen man sich orientieren kann,
zb. MVC.

Ich hoffe mal ich konte dir ein paar Anregungen geben :)
 

Saheeda

Top Contributor
@Zet

Vielleicht hilft dir das ja zu entscheiden, wann sich was lohnt:

Abstrakte Klassen lohnen sich z.B. wenn eine Methode in allen oder den meisten Kindklassen gleich implementiert sein soll und nur in wenigen Ausnahmefällen anders. Im Ausnahmefall würdest du die Methode dann einfach überschreiben.


Beispiel: Fressen funktioniert bei fast allen Tieren gleich:
Java:
public abstract class Animal{

	private int lifepoints;

	public void eat(Food f){
		this.lifepoints += f.nutritionPoints;	
	}
}

public class Dog extends Animal{ ... }

public class Bird extends Animal { ... }

public class Fish extends Animal { ... }

Hier wäre es ziemlich nervig, das für jedes Tier einzeln zu schreiben. Erst recht, wenn du vielleicht was an der Implementierung ändern möchtest, weil dir ein besserer Weg eingefallen ist oder du mehr machen möchtest.


Hingegen funktioniert das Fortbewegen nicht gleich. Alle Tiere können sich irgendwie bewegen, aber wie ist anders. Du kannst über ein Interface sagen, _dass_ jedes Tier eine solche Funktion braucht, ohne die genaue Implementierung vorzugeben:

Java:
public interface Moveable{
	public void move(int x, int y);	
}

public class Dog extends Animal implements Moveable{

	public void move(int x, int y){
		//rennen
	}
}

public class Bird extends Animal implements Moveable{

	public void move(int x, int y){
		//fliegen
	}
}

public class Dog extends Animal implements Moveable{

	public void move(int x, int y){
		//schwimmen
	}
}
 

Zet

Aktives Mitglied
@Saheeeda, Danke erstmal für die Antwort und das Beispiel :)

In diesem Fall ist es doch egal ob die Klasse Animal Abstract oder nicht ist, oder?
Die erbenden Klassen können in beiden fällen die Methode eat entweder implementieren und somit spezialisieren, oder die der Basisklasse verwenden. Gezwungen werden sie in keinem der beiden Fälle zu etwas, oder?
Oder verstehe ich den Codeschnipsel grade falsch?


Das mit den Interfaces schau ich mir grade am Strategie-Pattern an, auch hier danke für dein Beispiel!

Lg
Zet
 

Saheeda

Top Contributor
Du verstehst das schon richtig. Gezwungen irgendwas zu machen wird niemand. Dog, Fish und Bird benutzen einfach die eat()-Methode der Animal-Klasse. Das ist Sinn & Zweck von Vererbung: Kindklassen dürfen Methoden benutzen, die sie "einfach so" von ihrer Eltern-Klasse mitkriegen.
Jedes (reale) Tier weiß, dass es fressen muss. Nicht, weil es ihm irgendjemand gesagt hat, sondern weil's in seinen Genen verankert ist.
Genauso wie ein Mensch z.B. von seinen Eltern braune Haare erbt, ohne dass er sich selbst nochmal bewusst machen muss "Ich habe braune Haare." Du kannst deine Haare färben (=überschreiben), aber standardmäßig haben sie die geerbte Farbe.


Abstrakt, damit niemand auf die Idee kommt, ein Objekt "Animal" zu erstellen. Abstrakte Klassen lassen sich nicht instanzieren.
Probiers einfach mal:
Java:
Animal a = new Animal();
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Probleme mit drucken aus Java Java Basics - Anfänger-Themen 3
Gokul Java chart library suggestion for web application? Java Basics - Anfänger-Themen 2
D wie kann ich gcc aus einer .java datei heraus aufrufen? Java Basics - Anfänger-Themen 2
S Text Formatierung in Java Java Basics - Anfänger-Themen 2
B Erste Schritte yaml parsen in Java Java Basics - Anfänger-Themen 19
C Methoden Umlaute in Java Java Basics - Anfänger-Themen 18
W Java-PRogramm liest als EXE-File Nicht USB, jedoch aus NetBeans Java Basics - Anfänger-Themen 45
W Methoden java map ersatz für c++map Java Basics - Anfänger-Themen 3
M Erste Schritte Java Primzahltester Java Basics - Anfänger-Themen 4
A csv Reader für Java? Java Basics - Anfänger-Themen 27
K Java - Enums Java Basics - Anfänger-Themen 30
tomzen Java Unterstützung für exel dateien installieren. Java Basics - Anfänger-Themen 2
Rookar java.lang.NoClassDefFoundError: org/json/JSONException Java Basics - Anfänger-Themen 2
Rookar Mit Button andere java öffnen Java Basics - Anfänger-Themen 4
F Java Object to Hashmap ? Java Basics - Anfänger-Themen 6
I Backend in Java und Ansicht von Dateien in statische HTML Seiten? Java Basics - Anfänger-Themen 15
R Input/Output Verwendung des Euro-Zeichens in Java Java Basics - Anfänger-Themen 7
I Push Nachrichten von JAVA EE App an Mobile App Java Basics - Anfänger-Themen 3
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
G Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
G Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
Ostkreuz Java Docs Java Basics - Anfänger-Themen 9
R Java boolean Unterschied " == " und " = " Java Basics - Anfänger-Themen 3
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32

Ähnliche Java Themen


Oben