Klassenhirarchien zur Implementierung von Fahrzegen

coldstone

Bekanntes Mitglied
Hallo liebe Freunde,

hätte einige Ansatzschwierigkeiten mit der folgenden Aufgabe.

"Entwerfen Sie eine Klassenhierarchie zur Implementierung von Fahrzeugen.
Es soll eine abstrakte Oberklasse Fahrzeug geben. Davon abgeleitet sind die konkreten Klassen
Auto, Fahrrad, Schiff und Segler.
Ihre Klassen sollen von folgendem Java-Code ohne Modifikationen verwendet werden k¨onnen:
Java:
Fahrzeug[] fahrzeuge = { new Auto(), new Fahrrad(), new Schiff(),new Segler() };
for (int i = 0; i < fahrzeuge.length; i++) {
Fahrzeug fz = fahrzeuge[i];
System.out.println(fz + " wird angetrieben von: " + fz.antrieb()
+ "; " + fz + " " + fz.bewegung());
}
Dabei sollen die folgenden Ausgaben produziert werden:
Java:
Auto wird angetrieben von: Motor; Auto faehrt
Fahrrad wird angetrieben von: Mensch; Fahrrad faehrt
Schiff wird angetrieben von: Motor; Schiff schwimmt
Segler wird angetrieben von: Wind; Segler schwimmt
Entwerfen Sie für dieses Szenario eine sinnvolle Klassenhierarchie mit allen ben¨otigten Methoden."

Meine überlegung wäre:

Java:
Fahrzeug[] fahrzeuge = { new Auto(), new Fahrrad(), new Schiff(),
new Segler() };

Auto(), Fahrrad(), Schiff() und Segler() als Klassen zu erzeugen. (Zumindest zwingt mich eclipse dazu) :bahnhof:

Meine Hauptklasse sehe dann so aus:

Java:
public abstract class Fahrzeug {
	
	
	

	public static void main (String[] args) {
		
		Fahrzeug[] fahrzeuge = { new Auto(), new Fahrrad(), new Schiff(),new Segler() };
				for (int i = 0; i < fahrzeuge.length; i++) {
				Fahrzeug fz = fahrzeuge[i];
				System.out.println(fz + " wird angetrieben von: " + fz.antrieb()
				+ "; " + fz + " " + fz.bewegung());
				}
			}

	public Fahrzeug bewegung() {


		// TODO Auto-generated method stub
		return null;
	}

	public Fahrzeug antrieb() {
		// TODO Auto-generated method stub
		return null;
	}
}

Meine Klasse Auto:

Java:
public class Auto extends Fahrzeug {
	
	
public static void main(String[] args) {
		
		System.out.println("Auto");
	}

}

Zumindest bekomme ich jetzt in der Ausgabe:

Java:
Auto@45bab50a wird angetrieben von: null; Auto@45bab50a null

Woher kommen diese buchstaben und zahlen nach "Auto"? ICh kriege sie nicht weg.
 

HimBromBeere

Top Contributor
Deine abstrakte Klasse hat mit der static main nichts zu tun (genau wie die ableitenden Klassen), deshalb raus damit. Die static main darf im Programm nur einmal auftauchen und fungiert als Eintrittspunkt für dein Programm. Die solltest du also in eine neue Klasse auslagern und von da aus deine ganzen Fahrzeuge erstellen.

Die beiden in der Klasse Fahrzeug deklarierten Funktionen antrieb() und bewegung() müssen abstrakt sein und in den ableitenden Klassen überschrieben werden. Darin wird dann die Ausgabe gemacht (z.B.
Code:
return "Motor"
oder
Code:
return "fährt"
 
Zuletzt bearbeitet:
G

Gonzo17

Gast
Du hast da grundlegende Prinzipien der Vererbung nicht verstanden.

Ziel ist es doch, dass die Methoden antrieb() und bewegung() einen Text zurückgeben, der abhängig davon ist, welches Objekt du gerade fragst. Also erstellst du die abstrakte Oberklasse Fahrzeug mit zwei abstrakten Methoden, sodass jede Unterklasse gezwungen wird, die Methoden zu implementieren.

Was du machst, ist folgendes. Du hast eine Klasse Fahrzeug, die NICHT abstrakt ist (erste Anforderung, die du umsetzen sollst laut Aufgabe) und in dieser die beiden Methoden (auch nicht abstrakt). In der Unterklasse Auto überschreibst du die Methoden nicht, weshalb sie, wie zuvor definiert, null liefern. Stattdessen (und das ist auch fehlendes Verständnis) hast du eine main-Methode, die effektiv aber nie aufgerufen wird und das soll sie auch nicht, weil sie einfach falsch ist.

Du solltest vielleicht mal ein paar einfache Tutorials machen, die genau solche einfache OOP zeigen.
 

coldstone

Bekanntes Mitglied
Mich irritiert nur in der aufgabenstellung dieser Satz: "Es soll eine abstrakte Oberklasse Fahrzeug geben. Davon abgeleitet sind die konkreten Klassen"! Deswegen bin ich davon ausgegangen das es eine abstrakte Klasse sen muss.
 

HimBromBeere

Top Contributor
Was du machst, ist folgendes. Du hast eine Klasse Fahrzeug, die NICHT abstrakt ist (erste Anforderung, die du umsetzen sollst laut Aufgabe) und in dieser die beiden Methoden (auch nicht abstrakt)
Ööööööhm, also meines Verständnisses nach IST die Klasse Fahrzeug die abstrakte Oberklasse mit den abstrakten Methoden antrieb() und bewegung()

EDIT: Oooh, tschuldigung, hab den Satz falsch interpretiert... ignorier meinen Beitrag einfach

EDIT:mad:coldstone
Davon abgeleitet sind die konkreten Klassen"! Deswegen bin ich davon ausgegangen das es eine abstrakte Klasse sen muss.
Das hast du auch richtig angenommen, nur machst du es in deinem bisherigen Code einfach noch nicht ^^
 
Zuletzt bearbeitet:

coldstone

Bekanntes Mitglied
In der Unterklasse Auto überschreibst du die Methoden nicht, weshalb sie, wie zuvor definiert, null liefern.

Zu diesen methoden bin ich noch nicht gekommen. Was mich :autsch: macht ist diese Zeile:

Java:
Fahrzeug[] fahrzeuge = { new Auto(), new Fahrrad(), new Schiff(),new Segler() };

Was ist Auto() in diesem Fall? Objekt, Methode oder keine ahnung was. Ich hätte jetzt gedacht das sind methoden.
 

HimBromBeere

Top Contributor
Nennt sich Konstruktor und ist weder Methode noch Variable. Das, was da drin steht, wird ausgeführt, wenn eine neue Instanz dieser Klasse erstellt wird. Im Konstruktor wird dieses Objekt dann gewissermaßen zusammengebaut, wobei die meisten Zustände (Instanzvariablen) gesetzt werden.
Ist den Methoden aber nicht völlig unähnlich, hat nur keinen Rückgabewert (auch nicht void) und wird nur ein einziges Mal pro Instanz ausgeführt.

EDIT: Im Fall Auto() könntest du z.B. eine Art Standardauto definieren, welches z.B. rot ist und einen Heckspoiler hat.
 
G

Gonzo17

Gast
Sorry. Es ist wohl heute nicht mein Tag. Natürlich ist die Klasse abstrakt. Aber die Methoden sind es nicht.
 

coldstone

Bekanntes Mitglied
Also ist dies schonmal der richtige weg oder:

Java:
public class FahrzeugTest {
    
    public static void main (String[] args) {
        
        Fahrzeug[] fahrzeuge = { new Auto(), new Fahrrad(), new Schiff(),new Segler() };
                for (int i = 0; i < fahrzeuge.length; i++) {
                Fahrzeug fz = fahrzeuge[i];
                System.out.println(fz + " wird angetrieben von: " + fz.antrieb()
                + "; " + fz + " " + fz.bewegung());
                }
            }
}


Und als nächstes eine abstrakte Klasse Fahrzeug mit den Methoden antrieb() und bewegung() zu erzeugen.
Also:

Java:
public abstract class Fahrzeug {
	
	public static void antrieb() {
		
		??????????????
	}
	
	
	public static void bewegung() {
		
		??????????????
	}
	
}

Richtig???
 
G

Gonzo17

Gast
Falsch. Ersetze bei den Methoden static durch abstract. Und schau dir am besten nochmal genau an, was abstract und static bedeuten.
 

coldstone

Bekanntes Mitglied
Java:
public abstract class Fahrzeug {
	
	public  void antrieb() {
			
		
	}	
	
	public void bewegung() {
		
		
	}
	
}

Korrekt???
 

HimBromBeere

Top Contributor
du musst die beiden Methoden in der Klasse Fahrzeug abtsrakt gestalten, womit du alle ableitenden Klasse (Auto, Segler, ...) zwingst, diese Methode zu implementieren.
 
B

Beni

Gast
Besser, aber nicht richtig.

1. Erstmal brauchen "antrieb" und "bewegung" einen Rückgabetyp, sonst werden Codes wie
Code:
wird angetrieben von: " + fz.antrieb()
nicht kompilieren. Du kannst nicht einen String mit "nichts" (nichts = void) kombinieren. In deinem Fall würde sich "String" als Rückgabetyp anbieten.

2. Was genau sollen "antrieb" und "bewegung" in Fahrzeug machen? Du kannst es drehen und wenden wie du willst, es gibt keine sinnvolle Aufgabe für die Methoden in Fahrzeug (sehr wohl aber in Auto, Schiff, etc...). Mit anderen Worten, den Body (das "{...}") musst du weglassen, und die Methode als "abstract" deklarieren. Schau mal in deinen Unterlagen nach, wohin das "abstract" genau gehört.
 

coldstone

Bekanntes Mitglied
Also ich glaube so ist es richtig:

Java:
public abstract class Fahrzeug {
	
	public abstract String antrieb();	
	
	public abstract String bewegung();
		

}

Ich verstehe aber immer nocht nicht was dieses abstract bewirkt und wie ich jetzt die methode antrieb oder bewegung bearbeiten kann?

Meine überlegung wäre um es logisch zu erklären:

antrieb() ---> wenn fahrzeug[0] || fahrzeug [2] dann gebe "Motor" zurück
wenn fahrzeug[1] dann gebe "Mensch" zurück
wenn fahrzeug[3] dann gebe "Wind" zurück.

bewegung() -----> wenn fahrzeug[0] || fahrzeug[1] dann gebe "faehrt" zurück
wenn fahrzeug[2] || fahrzeug[3] dann gebe "schwimmt" zurück

Dies hätte ich jetzt mit if schleife versucht, aber ich weis nicht wie ich dies anwenden muss?
 
G

guest637

Gast
Ich halte ehrlich gesagt abstrakte Methoden für so eine Pillepalle-Aufgabe für ziemlichen Overkill, denn das Verhalten dieser Methoden ist schlicht und ergreifend 2 einmalig gesetzte Strings zurückzugeben. Da wird nix berechnet, kein anderer Algorithmus implementiert, keine ifs, einfach nur ein schlichtes "return irgendeinString;". Abstrakte Methoden sind für so ein Szenario unnötige Code-Duplizierung. Oder soll bei 10 Unterklassen dann 10 mal die gleiche Methode implementiert werden?

Sowas hier ist doch viel einfacher:
Java:
public abstract class Fahrzeug {

	private final String antrieb;
	private final String bewegung;

	public Fahrzeug(final String antrieb, final String bewegung) {
		this.antrieb = antrieb;
		this.bewegung = bewegung;
	}

	public String antrieb() {
		return antrieb;
	}

	public String bewegung() {
		return bewegung;
	}

}
Und dann einfach nur in jeder Klasse den Konstruktor aufrufen:
Java:
public class Auto extends Fahrzeug {

	public Auto() {
		super("Motor", "faehrt");
	}

}
 

coldstone

Bekanntes Mitglied
Vielen dank an alle für die nette hilfe. Mir geht es darum nachzuvolliehen zu können wie mann auf diese Lösungswege kommt. Gibt es da bestimmte Strukturen wie man an so eine Aufgabe ranngeht, oder ist es nur lesen, lesen, lesen, üben, üben, üben????
 

HimBromBeere

Top Contributor
Erstens lieber Gast steht in der Aufgabenstellung schonmal der Hinweis, dass die Oberklasse abstrakt sein soll. OK, das würde tendentiell auch ohne auch nur eine einztige abstrakte Methode gehen, aber wozu dann die Klasse abstrakt gestalten?!
Zweitens geht es hier weniger um eine kurze Formulierung sondern eher um die Grundzüge von OOP, Polymorphie und so, jedenfalls hab ich das mal so rausgelesen und da kommt man um Interfaces und Abstraktion nicht drumrum...
 

Kiri

Bekanntes Mitglied
Also ich glaube so ist es richtig:

Java:
public abstract class Fahrzeug {
	
	public abstract String antrieb();	
	
	public abstract String bewegung();
}

Ich verstehe aber immer nocht nicht was dieses abstract bewirkt und wie ich jetzt die methode antrieb oder bewegung bearbeiten kann?

OK, jetzt hast du deine abstrakte Klasse Fahrzeug, fehlen noch die konkreten Klassen Auto, Fahrrad, Schiff und Segler, die jeweils von Fahrzeug erben (Schlüsselwort "extends"). Jede dieser Klassen haben die Methoden antrieb und bewegung, die wiederum jeweils einen passenden String zurückgeben!

Kriegst du das hin?
 

coldstone

Bekanntes Mitglied
OK, jetzt hast du deine abstrakte Klasse Fahrzeug, fehlen noch die konkreten Klassen Auto, Fahrrad, Schiff und Segler, die jeweils von Fahrzeug erben (Schlüsselwort "extends"). Jede dieser Klassen haben die Methoden antrieb und bewegung, die wiederum jeweils einen passenden String zurückgeben!

Kriegst du das hin?


Java:
public class Auto extends Fahrzeug {
 
    public Auto() {
        super(antrieb("Motor");
        super(bewegung("faehrt");
    }
 
}

Ich weis nicht ob der Syntax korrekt ist für "super(antrieb("Motor");" Bitte nicht köpfen! :oops:
 

Kiri

Bekanntes Mitglied
Java:
public class Auto extends Fahrzeug {
 
    public Auto() {
        super(antrieb("Motor");
        super(bewegung("faehrt");
    }
 
}

Ich weis nicht ob der Syntax korrekt ist für "super(antrieb("Motor");" Bitte nicht köpfen! :oops:

Da hat dich guest... glaub ich auf die falsche Fährte geführt.

In der Konkreten Klassen, müssen sich ja die abstrakten Methoden der abstrakten Klasse wiederfinden.

Also so:

Java:
public class Auto extends Fahrzeug{
    public String antrieb(){  //String ist der Rückgabetyp
        return "Motor";  //"Motor" ist der String der zurückgegeben wird
    }
}

So, da fehlt noch eine Methode, diese bitte einfügen, dasselbe dann für die drei fehlenden Klassen! Das wäre es dann schon ;)
 

HimBromBeere

Top Contributor
Probier´s aus...

EDIT: Verdammt, zu spät... jetzt muss ich doch noch was Konstruktives schreiben, mal überlegen. Achja, die beiden Methoden antrieb und bewegen müssen in deinen Klassen Auto, Segler, ... überschrieben werden (müssen dort also definiert werden).
Du musst jetzt nur noch überlegen: was soll denn die Funktion antrieb bei einem Auto ZURÜCKGEBEn (return)?
 
Zuletzt bearbeitet:

coldstone

Bekanntes Mitglied
OK korrektur:

Java:
public  class Autos extends Fahrzeug {
 
   public  String antrieb() {
	return "Motor";

   } 
   
   public String bewegung()  {
	return "faehrt";
   }
}
 

Kiri

Bekanntes Mitglied
OK korrektur:

Java:
public  class Autos extends Fahrzeug {
 
   public  String antrieb() {
	return "Motor";

   } 
   
   public String bewegung()  {
	return "faehrt";
   }
}

mach aus Autos Auto dann passt das. :toll: Nun noch für die anderen drei (Fahrrad, Schiff und Segeln), dann kannst es ausprobieren. Das kriegst du aber hin - bin dann mal weg.
 

HimBromBeere

Top Contributor
Naja, du musst dir überlegen, welche Beziehungen zwischen deinen Objekten bestehen sollen /das läuft meistens auf sowas hinaus wie ein Auto IST ein Fahrzeug und HAT Räder).

Ein IST heißt hierbei immer, dass eine allgemeine Klasse (Fahrzeug) irgendwie spezifiziert wird (Auto), ein
HAT bedeutet eine Eigenschaft, die das Objekt besitzen soll (z.B. HAT ein Auto als Antrieb einen Motor).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu JRE-/JDK-unabhängige PBKDF2WithHmacSHA512-Implementierung Java Basics - Anfänger-Themen 16
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
K Fehler bei der Implementierung Java Basics - Anfänger-Themen 6
J Implementierung gcd();square() Java Basics - Anfänger-Themen 98
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
A Implementierung von String toString methode() Java Basics - Anfänger-Themen 4
G Projekt architektur (implementierung) Java Basics - Anfänger-Themen 3
M Implementierung einer getNextId Methode Java Basics - Anfänger-Themen 5
J Implementierung Listen-ADT Java Basics - Anfänger-Themen 131
J Implementierung eines Zustandsdiagramms Java Basics - Anfänger-Themen 19
I GenericQueue / Implementierung als Ringspeicher Java Basics - Anfänger-Themen 4
MiMa Log4j2 implementierung Java Basics - Anfänger-Themen 4
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
G Array implementierung Java Basics - Anfänger-Themen 23
J ANTLR Installierung und Implementierung Java Basics - Anfänger-Themen 2
E Hilfe bei Implementierung von Methoden Java Basics - Anfänger-Themen 10
S SkipList Implementierung Java Basics - Anfänger-Themen 1
J Methoden Suche effiziente Implementierung für eine Methode Java Basics - Anfänger-Themen 3
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
E hashCode implementierung Java Basics - Anfänger-Themen 9
S Implementierung der Klasse Konto und Nutzung bereits vorhandener Klassen Java Basics - Anfänger-Themen 7
H Implementierung eines Interfaces erweitern Java Basics - Anfänger-Themen 13
O Generics - Implementierung Java Basics - Anfänger-Themen 7
A Hilfestellung zur Implementierung des Gaußsches Eliminationsverfahren Java Basics - Anfänger-Themen 4
B OOP Implementierung eines Heaps Java Basics - Anfänger-Themen 13
K Bucketsort Implementierung Java Basics - Anfänger-Themen 0
K Mergesort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
K Quicksort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
S Klassen Klassendiagramm Implementierung? Java Basics - Anfänger-Themen 5
J Bucketsort Implementierung Java Basics - Anfänger-Themen 0
C Stack - listenbasierte Implementierung Java Basics - Anfänger-Themen 4
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
T Collections LinkedList<LinkedList<T>> - Implementierung Java Basics - Anfänger-Themen 10
F Implementierung von Interfaces -> Problem mit main Java Basics - Anfänger-Themen 12
D Resourcebundle implementierung Java Basics - Anfänger-Themen 2
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
Q Implementierung von Listenern Java Basics - Anfänger-Themen 4
B Klassen Hilfe bei Implementierung Java Basics - Anfänger-Themen 5
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Binärbaums Java Basics - Anfänger-Themen 3
I Erste Schritte Implementierung der API Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Adressbuches Java Basics - Anfänger-Themen 20
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
G Implementierung eines Kontos Java Basics - Anfänger-Themen 11
M Quicksort implementierung Java Basics - Anfänger-Themen 23
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
U Doppelte Interfcae Implementierung Java Basics - Anfänger-Themen 10
K Kleiner Fehler bei Methoden Implementierung Java Basics - Anfänger-Themen 6
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
S OOP Implementierung Komposition, Aggregation, Assoziation und Generalisierung Java Basics - Anfänger-Themen 2
BinaryLogic Datentypen Statistik Interface - untersch. Implementierung Java Basics - Anfänger-Themen 5
E Performante Implementierung eines "Hintergrundprogramms" Java Basics - Anfänger-Themen 10
S Saubere Implementierung Java Basics - Anfänger-Themen 2
K Dijkstra implementierung 2.0 Java Basics - Anfänger-Themen 19
K dijskral implementierung Java Basics - Anfänger-Themen 14
U Probleme mit Server-Client implementierung Java Basics - Anfänger-Themen 5
K Game of Life Implementierung Java Basics - Anfänger-Themen 30
B OOP Problem bei Implementierung von Interface Java Basics - Anfänger-Themen 6
J HashSet Implementierung Java Basics - Anfänger-Themen 16
R NullPointerException in Queue-Implementierung Java Basics - Anfänger-Themen 11
X Frage zur Implementierung von equals() Java Basics - Anfänger-Themen 2
B Effektive Implementierung für Darstellung großer Datenmengen in Jogl Java Basics - Anfänger-Themen 5
D Datentypen Implementierung eines Binärbaumes Java Basics - Anfänger-Themen 7
B Implementierung Java Basics - Anfänger-Themen 2
N Implementierung Tic tac toc Java Basics - Anfänger-Themen 25
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
Y Implementierung einer Potenzturm Funktion Java Basics - Anfänger-Themen 4
S Implementierung gegen Interfaces / List, ArrayList, LinkedList Java Basics - Anfänger-Themen 11
J Quicksort Implementierung-- Exception ArrayOutOfBounds Java Basics - Anfänger-Themen 6
U Implementierung Constructor Java Basics - Anfänger-Themen 7
T Problem mit Implementierung von einer HashMap aufgabe Java Basics - Anfänger-Themen 2
G Implementierung des Observer/Observable Patterns - Gut so? Java Basics - Anfänger-Themen 3
I Zugriff auf Implementierung verhindern Java Basics - Anfänger-Themen 8
D Implementierung nach MVC Java Basics - Anfänger-Themen 6
B Theoretische Frage zum Programmbau (nun zur Implementierung) Java Basics - Anfänger-Themen 8
H Implementierung von Interfaces Java Basics - Anfänger-Themen 4
G Implementierung von Bäumen Java Basics - Anfänger-Themen 2
N Probleme mit paint() bei Implementierung in ein Panel Java Basics - Anfänger-Themen 4
B Wie funktioniert die implementierung von c code in Java? Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben