Objekte und Klassen

Status
Nicht offen für weitere Antworten.

Dalia1

Mitglied
Hallo,

sorry, ich habe nochmal eine wahrscheinlich etwas bescheuerte Frage. Wäre super, wenn mir trotzdem jemand helfen könnte.

Angenommen ich habe eine Klasse Kuh und erzeuge jetzt in einer anderen Klasse Kuhstall mit Hilfe des Konstruktors ein neues Objekt der Klasse Kuh, dass ich z.B. kuh1 nenne. Die Klasse Kuh hat bestimmte Attribute und Methoden, allerdings will ich für meinem Objekt kuh1 noch Methoden und Atrribute auf der Konsole ausgeben lassen, die in der Klasse Kuh nicht definiert sind. Das geht dann nicht, oder? Das heißt ich müsste wahrscheinlich eine Unterklasse Kuh1 erstellen, die über diese Attribute und Methoden verfügt?

Grüße

Dalia
 
Wenn ich dich richtig verstanden habe: Ja. Auch wenn ich den Sinn (bei deinem "konkreten" Beispiel nicht so ganz verstehe).
 
Also ja heißt, dass es nicht geht oder?

Mein konkretes Beispiel macht auch wenig Sinn, es ist nur das erste, was mir in den Sinn gekommen ist. Das Problem ist eher theoretischer Natur 😉
 
allerdings will ich für meinem Objekt kuh1 noch Methoden und Atrribute auf der Konsole ausgeben lassen, die in der Klasse Kuh nicht definiert sind

Das verstehe ich nicht ganz. kuh1 ist doch eine Instanz der Klasse Kuh. Also hat kuh1 auch genau die gleichen methoden und Attribute, da sie ja ein Vertreter von Kuh ist. Was ich auch nicht ganz verstehe: Warum, bzw. wie willst Du die Methoden auf der Konsole ausgeben lassen?

Wenn Du die Klasse Kuh1 mit mehr Methoden und Attributen ausstatten willst, sie aber immer noch vom Typ Kuh sein soll, dann bietet sich ein extend an.

Java:
public Kuh1 extends Kuh {

Ein typisches Beispiel wäre hier eine "Unterklasse" Kalb zu machen. Ein Kalb ist aber immer noch eine Kuh nur mit extra methoden und Attributen.

Java:
public Kalb extends Kuh {
 
Das verstehe ich nicht ganz. kuh1 ist doch eine Instanz der Klasse Kuh. Also hat kuh1 auch genau die gleichen methoden und Attribute, da sie ja ein Vertreter von Kuh ist. Was ich auch nicht ganz verstehe: Warum, bzw. wie willst Du die Methoden auf der Konsole ausgeben lassen?

Wenn Du die Klasse Kuh1 mit mehr Methoden und Attributen ausstatten willst, sie aber immer noch vom Typ Kuh sein soll, dann bietet sich ein extend an.

Java:
public Kuh1 extends Kuh {

Ein typisches Beispiel wäre hier eine "Unterklasse" Kalb zu machen. Ein Kalb ist aber immer noch eine Kuh nur mit extra methoden und Attributen.

Java:
public Kalb extends Kuh {

Danke schonmal 🙂

ich habe mich wohl etwas unklar ausgedrückt. ich könnte ja zum beispiel eine methode schreiben, die mir das gewicht von kuh1 ausgibt und diesen wert dann auf der konsole ausgeben lassen. aber wenn ich das attribut gewicht in der klasse Kuh nicht eingeführt hätte, kann ich es ja auch nicht ausgeben lassen. meine frage war jetzt, ob ich in der anderen Klasse Kuhstall diese methode und das attribut quasi nachträglich hinzufügen könnte. Das Unterklassen sinnvoller sind, ist mir klar. Mir geht es mehr darum, ob die Möglichkeit überhaupt besteht!
 
Ich geh mal davon aus, dass die Klasse Kuhstall einen Vector, ArrayList o.Ä., enthält, in dem die gnazen Instanzen der Klasse Kuh gespeichert werden?!

Zu Deiner Frage: Wenn die Klasse Kuh kein Attribut für ein Gewicht hat, dann kannst Du es im Kuhstall nicht mehr "hinzufügen", da es Dir ja nur möglich wäre ein Attribut für den Kuhstall zu schreiben. Das wäre zB ein Gesamtgewicht des Kuhstalls 😉

Eine Möglichkeit gibt es aber dennoch, die ist aber sehr unschön:

Wenn Du eine Kuh in den Kuhstall hinzufügst, könntest du das ganze noch mit einem Gewicht versehen.. Dann weiß aber nur der Kuhstall das Gewicht der Kuh und nicht die Kuh selbst. Ich weiß das klingt kompliziert, aber lies es 2 mal oder so 😉

Das geht zB mit einer HashMap (HashMap (Java 2 Platform SE v1.4.2)). Ein Element der HashMap besitzt jew. einen Key und ein Value.. Als Key könntest Du die Kuh verwenden und als Value ihr Gewicht.

Java:
HashMap<Kuh, int> kuhstall = ...
Kuh Marta = new Kuh("Marta");
kuhstall.addKuh(Marta, 80);
 
In dynamischen Sprachen (z.B. Ruby) oder prototypbasierten Sprachen (z.B. JavaScript) ist sowas weitaus üblicher. In Java sind Klassen "stabil", und wenn du ein bestimmtes Attribut haben willst, muss es eben in die Klasse hinein, oder in eine Unterklasse. Man kann natürlich dynamischere Konstrukte basteln (etwa mit Key-Value-Paaren), aber sowas ist eher die Ausnahme, und das wäre für eine Kuh bestimmt weniger geeignet. OO-Programmierung im Java-Sinn soll den Programmierer auch mit sanfter Gewalt dazu bringen, sich vorher zu überlegen, welche Methoden und Attribute er benötigt.
 
Könnte man nicht auch eine anonyme Klasse erweitern? (was natürlich nich speicherbar ist)
D.h.:
Java:
... 
doSomethingWith(new Kuh(){ public void neueMethode()
                         {      /*Something*/     }}
);
...
 
ok daran hatte ich jetzt nicht gedacht , das wird aber auch nicht gerade schön aus sehen.

Funktioniert das mit der Reflection auch wenn das Objekt nur als Parameter einer Funktion übergeben wird ? Weil ohne Referenz auf das Objekt kann ich ja nichts über das Objekt "rausfinden". (zB mit getMethods() die Methoden besorgen)

edit:
Wenn man das per Reflection macht gibt es dann einen besseren Weg als folgenden (abgesehen von der Exception Behandlung):

Java:
Kuh f = new Kuh(){
	public void g(){
		System.out.println("test");
	}
};

Method[] methoden =  f.getClass().getMethods();

for(Method m : methoden) {
	if(m.getName().equals("g")) {
		try {
			m.invoke(f);
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}
 
Zuletzt bearbeitet:
Man hat ja immer irgendein "Object" am Wickel. Mit dessen getClass-Methode erhält man das Class-Object (sowohl bei "normalen" als auch bei anonymen Klassen) - insofern sollte es möglich sein, beliebige Methoden einfach über den Namen zu finden und aufzurufen.
Insgesamt sieht das aber eher "hacky" aus; guter Stil ist anders...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben