Objekte mit Verhalten

Thisor

Bekanntes Mitglied
Hallo,
ich stelle fest das ich immer noch sehr viele defizite habe in Programmieren.
Genaue antworten konnte ich leider nicht im google finden, daher hoffe ich das ihr sie mir erklären könnt:
- Was ist bei Objekten mit "Verhalten" gemeint?
- Was sind "Ist-ein"-Beziehungen?
- Was sind "verhält-sich-wie ein"-Beziehungen?
- Was sind "Hat-ein"-Beziehungen?

Und hier kann ich mir noch so viele Definitionen davon reinlesen, aber das will einfach nicht in mein Kopf/Verständnis :

Was genau ist und macht eine ArrayList, HashMap?
Wozu benötige ich sie? Was sind die Unterschiede bzw wieso/wann bevorzuge ich das eine vor dem anderen?

lg
 
Die Objektorientierung versucht sich analog zur realen Welt zu verhalten.
Ein Objekt hat eben "Verhalten", wenn es methoden besitzt welche ein bestimmtes verhalten verursachen.
"Ist-ein" Ein Hund ist-ein Tier, anders ausgedrückt: die klasse Hund erbt von Tier
"Verhält-sich" entspricht dem implementieren von interfaces. Ein Hund verhält sich wie ein Raubtier
"Hat-ein" sagt aus, das ein objekt ein bestimmtes Attribut besitzt. Der Hund hat beispielsweise ein Fell.

Eine ArrayList ist eben einfach eine List, deren größe veränderbar ist.
Falls du alle Tier auf der Welt speichern möchtest, könntest du natürlich auch für jedes eine eigene Variable anlegen, aber da dass äußerst unpraktisch ist, gibt es Listen. Denen fügst du einfach ein neues Tier hinzu und fertig.
Vorteil von ArrayList gegenüber einfachen Arrays ist es, dass Arrays eine feste größe haben. Die ArrayList hingegen passt ihre interne größe einfach an.

Eine HashMap erzeugt ein mapping von einem Wert auf einen anderen. Ein Beispiel hierfür wäre z.b. ein wörterbuch. Dort wird z.B. das deutsche Wort auf das englische abgebildet. Falls du nun wissen willst was "Hallo" auf englisch heißt, könntest du einfach im Wörterbuch nachschlagen

ArrayList und HashMap sind zwei verschiedene konzepte. Erstes ist einfach nur eine Liste, während das zweite eine Abbildung definiert.
 
Okay, das erklärt so einiges, danke schonmal.

Was ich aber noch nicht begreifen kann oder mag ist das Interface:
Interface ist doch letztendlich wenn nicht nur, bloß eine Schnitstelle.
Wieso kommt dann da oben kein extends oder implements?

Edit:
Sind HashMap und ArrayList quasi Interface Methoden?
 
du bringst hier sehr viel durcheinander.
Interfaces sind schnittstellen. Definiert werden sie eben durch
Java:
interface MyInterface {
  // ...
}
und implementiert werden so eben durch implements.

HashMap und ArrayList sind beides Klassen.
Wobei ArrayList beispielsweise die List schnittstelle implementiert
 
Okay, ich weiß dann womit ich mich heute Abend noch beschäftigen werde.
Bin ich schonmal auf dem richtigen Weg wenn ich sagen würde, dass ArrayList und HashMap Objekte sind, ArrayList ist ein Container und HashMap ist ein Assoziativspeicher?
 
Code (Java):
ArrayList<Integer> list = new ArrayList<>();
// list ist nun ein Objekt

Was ist denn das was in den Klammern <> steht? Eine Klasse? Ein Objekt?
Da könnte ja genauso gut String oder Double oder Auto stehen..
Und dieses "<>" verstehe ich allgemein nicht 🙁. Ist das nur die Schreibweise? Wenn ja, dann zu was? Dass Integer in die list kommt? Ich stoße unteranderem auch auf <?>, versteh ich nicht 🙁
 
Dann heißt <?> soviel wie, das der Typ noch nicht bekannt ist?
Kann ich alle Buchstaben in die spitzen Klammern eingeben oder haben bestimmte Buchstaben eine bestimmte Bedeutung wie T für Typ, c für Collector bzw Container etc?

Was ich aber noch nicht ganz verstehe ist wieso man das macht.
Also eigtl steht da Object drin in den spitzen Klammern aber wenn da Object drinnen steht, kann jeder Typ reinkommen. Und wenn wir das nicht wollen, also bsp wir wollen nur Zahlen haben aber dann kommt ein Wort vor, typisieren wir das, und das was wir es typisieren, also in welchem Datentyp wir es haben wollen, steht dann in den spitzen Klammern? (hui ich hoffe das war jetzt nicht zu kompliziert ausgedrückt.. )
Aber wieso T? Wieso nicht gleich den Datentyp hineingeben, wie z.b. Long, Integer, String, Double etc?


Bsp hier:
Code:
public class Pocket<T>
{
  private T value;
  public Pocket() {}
  public Pocket( T value ) { this.value = value; }
  public void set( T value ) { this.value = value; }
  public T get() { return value; }
  public boolean isEmpty() { return value != null; }
  public void empty() { value = null; }
}
quelle: http://openbook.rheinwerk-verlag.de...tml#dodtp1e5aa8bf-acb7-4f0f-b3cf-176e06f73845



Oh okay...eine Zeile weiter steht wofür T, E usw steht 😀
 
Bei der Implementation ist noch nicht bekannt, was für ein Typ verwendet wird. Und es kann ja viele Instanzen geben.

Also die Entwickler, die die ArrayList entwickelt haben, wissen nicht, wa rein kommt.
Und ich kann mehrere ArrayList haben. Eine ArrayList mit Mitarbeitern, eine mit KFZ, eine mit Assets des Betriebes (zu denen auch die KFZ gehören können), ....

Es ist wichtig, dass die Typen erst mit der Instanzerstellung (oder ggf erst mit einem Aufruf falls der Generic nur dort auftritt) festgelegt wird. Das macht die große Stärke der Generics aus.
 
Also ich versuche mal alles kompakt zu erläutern:

Klassen:
Klassen sind Baupläne für Objekte. Quasi wenn du ein Auto bauen willst, was das Auto ausmacht und kennzeichnet.

Beispiel: (Opel Astra)
Die Klasse heißt Opel Astra und ist eine Unterklasse von der Klasse Auto.
Das heißt, dass der Opel Astra zwar ein Opel Astra ist, ist aber gleichzeitig auch ein Auto.
Dementsprechend kannst du im Programm später auch einfach ein Auto in einer Methode übergeben und das kann dann z.b. auch ein Opel Corsa sein und nicht nur ein Opel Astra.

Dementsprechend gibt es auch Variablen, welche die Eigenschaften einer Klasse (dem bauplan) darstellen.
Also welche Farbe das Auto hat.
Wie viel PS und wie viele Türen das Auto besitzt.

Das Auto soll aber auch fahren können und es sollte sich an -und abschalten lassen können.
Das realisierst du in Methoden oder auch Funktionen.
Das sind dann einfach sogenannte unterprogramme, welche vom Programm ausgeführt werden.
Beispiel:

public void moveForwards(Map map, Auto auto) {
/* Auto wird auf der Map(einfach eine Beispielklasse für eine Landfläche oder sowas) 5 Meter nach vorne bewegt */
map.changePositionForwards(auto, 5);
}

In diesem Beispiel ist es völlig egal, was für ein Auto du wählst.
Es könnte ein Opel Astra oder ein Opel Corsa sein, denn diese sind beide Unterklassen von Auto.
Jetzt noch ein wichtiger Hinweiß.

Interfaces in Java definieren Verhaltensweisen welche implementiert werden sollten.
Das heißt, ein Interface sagt der Klasse inder es implementiert wird, welche Methoden mit welchen Signaturen(X1) es besitzen MUSS.

Folgendes Beispiel eines Interfaces (Name: IMove)

public void moveForwards(Map map, Vehicle vehicle);
public void moveBackwards(Map map, Vehicle vehicle);
public void moveLeft(Map map, Vehicle vehicle);
public void moveRight(Map map, Vehicle vehicle);

Ein Auto könnte dann von der Klasse Vehicle erben, was bedeutet das jedes Auto dann auch ein Vehicle ist. Und in der Klasse Vehicle könnte man nun dieses Interface mit dessen Methoden implementieren.
Da das Vehicle natürlich nicht weiß, wie es sich zu bewegen hat, weil es zu abstrakt ist, bleibt dies hier erstmal offen.
Du kannst aber die Methoden in den Unterklassen überschreiben, weil diese ja immer weitervererbt werden, solange diese nur public oder protected sind.
überschreiben = Unterklasse vergibt neues Verhalten (Neue Abfolgen von Befehlen).

Du könntest natürlich auch direkt in den Unterklassen das Interface implementieren, aber das müsstest du dann für jede Klasse machen, was ich persönlich ziemlich nervig finde, da jedes Vehicle sich sowieso bewegen kann, macht es durchaus Sinn dort das Interface zu Platzieren.

Das ganze könnte man dann natürlich auch direkt in die Klasse Vehicle reinmachen, jedoch könnte man das Interface dann z.b. wenn man dann noch eine Klasse Flugzeuge hat, welches ja kein Fahrzeug (Vehicle) ist, implementieren, was ja nicht mehr ginge, wenn man es nur für Vehicle machen würde.
Deshalb sollte man vor einem Programm immer planen was man eigentlich mit diesem Programm machen will und sich einige Dinge offen lassen und so programmieren, dass man jederzeit etwas auswechseln kann.

Ich hoffe ich konnte helfen.
 
Die Signaturen deiner Interface Methoden sind allerdings nicht optimal.
Den Vehicle Parameter solltest du weglassen. Denn da ein Vehicle diese Methoden implementiert, sollten sich diese auch auf das Vehicle selbst (this) beziehen.
Java:
public void moveForwards(Map map);
public void moveBackwards(Map map);
public void moveLeft(Map map);
public void moveRight(Map map);
 
Danke @Chrisopher25 , war ein gutes Beispiel 🙂
Die nächste Frage wäre:
(1) - zu welcher Methode gehört isValid? Ist das was von ArrayList oder ist das eine Methode wie z.b. length? Also das ich das überall benutzen kann?
(2)Wieso benutze ich nicht stattdessen die equals Methode mit add?
 
(1) - zu welcher Methode gehört isValid? Ist das was von ArrayList oder ist das eine Methode wie z.b. length? Also das ich das überall benutzen kann?

Was ist "isValid"? Hört sich für mich nach einer Methode an und eine Methode gehört zu einer Klasse.
Sofern du ein Objekt einer Klasse hast kannst du alle public Methode dieser Klasse aufrufen (und Kontextabhängig noch protected Methoden).

(2)Wieso benutze ich nicht stattdessen die equals Methode mit add?

Welche Methoden man verwendet kommt ganz darauf an was man erreichen will.
 
Also Klassen haben immer genau die Funktionen, die sie entweder selbst implementieren oder die diese geerbt haben. Es gibt da keine Funktionen, die da "einfach so immer" da sind.

Da alles von Object erbt, sind die Funktionen von Object natürlich in jeder Klasse, also Funktionen wie toString und equals.

Aber es gibt einige typische Funktionen, die man immer wieder antrifft. Das liegt einfach daran, dass oft ähnliche Funktionen vorhanden sind und gleiche Namen es stark vereinfachen, sich die Funktionen und deren Namen zu merken.

Aber generell ist dann wichtig, dass man sich die Dokumentation zu einer Klasse anschaut. Das Java Framework ist gut dokumentiert und beschreibt, welche Funktionen implementiert wurden. Und es zeigt auf, welche Funktionen von welcher Klasse geerbt wurden.

Konrad
 

Neue Themen


Zurück
Oben