OOP Mehrere Klassen 'verbinden'?

  • Themenstarter Themenstarter HansiWinter
  • Beginndatum Beginndatum
H

HansiWinter

Gast
Hallo, ich mal wieder. 🙂

Ich lerne weiter JAVA und bin gerade bei einer Aufgabe, wo ich nicht so recht weiß... also ich soll ein Auto Objekt erzeugen, dass verschiedene Sachen kann. Also ich habe hier folgende Klassen angelegt:

1)
Java:
 Das ist meine Autoklasse. Ich arbeite gerade an den Methoden 'ladezu' und 'entlade':
public class Auto{
	
	private String automarke;
	private String autotyp;
	private int pszahl;
	private double verbrauch;
	private double tankgroeße;
	private double tankinhalt;
	private double resttank;
	private double gesamtverbrauch;
	private double restdistanz;
	private double entfernung;
	
	private Ladung ladung;
	private int ladegewicht;
	
	String getautomarke(){
		return automarke;
	}
	
	public void setautomarke(String marke){
		automarke=marke;
	}
	
	String getautotyp(){
		return autotyp;
	}
	
	public void setautotyp(String typ){
		autotyp=typ;
	}
	
	int getpszahl(){
		return pszahl;
	}
	
	public void setpszahl(int ps){
		if (ps >= 0)
		pszahl=ps;
		else
		System.out.println("So lahm kann die Kiste doch gar nicht sein!");
	}
	
	public void fahre (double entfernung, double verbrauch, double tankinhalt){
		
		if (this.tankinhalt >= this.verbrauch/100*entfernung)
			{resttank = this.tankinhalt - this.verbrauch/100*entfernung;
			gesamtverbrauch = this.verbrauch/100*entfernung;
			System.out.println("In meinem Tank sind jetzt noch " +resttank+" Liter drin. Ich habe also "+gesamtverbrauch+" insgesamt verbraucht.");}
	
		else
			{System.out.println("Achtung! Die Tankfuellung reicht nicht aus!");
			restdistanz = this.tankinhalt/this.verbrauch;
			System.out.println("Ich kann nur noch "+restdistanz+" Kilometer fahren, dann bleibt die Schuessel stehen!");}
		
	}
	
	public double getresttank(){
		return resttank;
	}
	
	public double getgesamtverbrauch(){
		return gesamtverbrauch;
	}
	
	public double getrestdistanz(){
		return restdistanz;
	}
	public double getverbrauch(){
		return verbrauch;
	}
	
	public void setverbrauch(double verbrauch){
		this.verbrauch=verbrauch;
	}
		
	public double gettankgroeße(){
		return tankgroeße;
	}
	
	public void settankgroeße(double tankgroeße){
		this.tankgroeße=tankgroeße;
	}
		
	public double gettankinhalt(){
		return tankinhalt;
	}
	
	public void settankinhalt(double tankinhalt){
		this.tankinhalt=tankinhalt;
	}
	
	public void setentfernung(double entfernung){
		this.entfernung=entfernung;
	}
	
	public double getentfernung(){
		return entfernung;
	}
	
	public void ladezu (Ladung eineLadung){
		if (ladung == 'JA')
		{System.out.println("Auf diesem Auto ist bereits etwas geladen. Mehr geht echt nicht mehr drauf!!");}
		else
		{if gewicht <= ladegewicht)
			{ladegewicht = gewicht;
			System.out.println("Auf das Auto wurden nun "+ladgewicht+" drauf geladen.");}
			else
			{System.out.println("Für diese Karre sind "+ladegwicht+" echt zu viel! Schau mal, dass du das woanders draufkriegst!");}
	}
	
	public Ladung entlade(){
		
	}
}

2) Das hier ist die Ladungsklasse, die eigentlich (nach meiner Idee) nur eine Variable hat, die über Getter/Setter gesetzt wird. Ich soll so eine Klasse auf jeden Fall anlegen (über den Inhalt wird aber keine Aussage gemacht..)
Java:
public class Ladung{
	
	int gewicht;
	
	public setgewicht (double gewicht){
		this.gewicht = gewicht;
	}
	
	public double getgewicht (){
		return gewicht;
	}
	
}

3) Hier erzeuge ich ein 'Auto' und mache Dinge damit.
Java:
public class AutoAnwendung{
	
	public static void main (String[]args){
		
		Auto meinauto = new Auto();
		
		meinauto.setautomarke("Audi");
		meinauto.setautotyp("Cabrio");
		meinauto.setpszahl(220);
		meinauto.setverbrauch(1.0);
		meinauto.settankgroeße(50.0);
		meinauto.settankinhalt(34);
				
		String marke = meinauto.getautomarke();
			System.out.println("Sie fahren einen "+marke);
			
		System.out.println("Das ist ein "+meinauto.getautotyp());

		int ps = meinauto.getpszahl();
			System.out.println("Der macht "+ps+" Sachen!");
		
		// Die mittlere Version ist am Besten, weil man da keine neue
		// Variable braucht!
		
		System.out.println("Mein Auto verbraucht "+meinauto.getverbrauch()+" Liter auf 100 Kilometer.");
		System.out.println("In den Tank passen "+meinauto.gettankgroeße()+" Liter.");
		System.out.println("Drin sind aber nur noch "+meinauto.gettankinhalt()+" Liter.");
		
		meinauto.fahre(2900, +meinauto.getverbrauch(), +meinauto.gettankinhalt());
		
		System.out.println("Ich will jetzt "+meinauto.getentfernung()+" Kilometer damit fahren!");		
		
	}
}

Nun will ich folgendes Erreichen:
Und zwar will ich dem Auto ein bestimmtes 'ladegewicht' zuordnen, dass dieses laden kann. Wenn schon etwas auf dem Auto geladen ist, kann man nichts mehr draufladen, wenn nichts drauf ist, kommt es darauf an, ob das 'gewicht' der Ladung nicht zu schwer ist, also gewicht <= ladegewicht soll gelten.

Mein Problem ist jetzt aber, dass die Klasse 'Ladung' ja nicht in Verbindung mit 'Auto' steht. Irgendwo müsste ich also doch jetzt eine Instanz erzeugen, oder? Wie genau mache ich das und wo?
 
Java:
 if (ladung == 'JA')

Zuerst: Du musst
Java:
 if (ladung.equals("JA"))
verwenden. Auch der Unterschied bei den Anführungszeichen ist wichtig! Objekte kann man normal nicht per == vergleichen. Bei String gibt es eine Ausnahme, die man aber nicht nutzen sollte (insbesondere nicht, wenn man sie nicht genau versteht)

Weiter:
Das Beladen findet natürlich in deiner Autoverwaltung statt (momentan deine main-Methode). Dort erzeugst du ein Ladungsobjekt und übergibst es dem Auto. Dort kannst du dann über
Code:
eineLadung.getGewicht()
zB das Gewicht abrufen und somit prüfen.

Methoden schreibt man normal camelCase, also getGewicht, setVerbrauch, etc.

Bitte verbesser in den Methode bei den ifs und elses noch den Klammerstil 😉
 
Mein Problem ist jetzt aber, dass die Klasse 'Ladung' ja nicht in Verbindung mit 'Auto' steht.
doch... private Ladung ladung... dein Auto hat eine Ladung nur die ist halt null

mach zb einen setter und getter wie für die anderen eigenschaften und übergib eine ladung...

Irgendwo müsste ich also doch jetzt eine Instanz erzeugen, oder? Wie genau mache ich das und wo?
wie du es mit auto gemacht hast... Auto meinauto = new Auto();
wo? mhn ja du kannst es in AutoAnwendung machen und der setLadung von auto übergeben, oder du machst in auto eine einfache laden() und machst es da drinnen...
 
Ganz einfach:

Die Klasse Ladung in die Klasse Auto importieren, also wie ein ganz normaler import, wenn sie im selben ordner sind ginge das etwa so:
Java:
import Ladung;

Einfacher wäre wenn du sie alle ins gleiche Package packst: Dazu musst du alle Dateien in denselben Ordner tun und überall in die Klassen folgendes Schreiben:

Java:
package packagenamedenduwillst;

Danach einfach eine Instanz erzeugen wie beim Auto:

Java:
Ladung blabla = new Ladung();

Lg 🙂
 
So ein Hinweis - eine Auto braucht kein Member mit dem Namen "automarke, autogewicht u.ä. sondern nur marke, gewicht - denn die stehen ja im Auto drin.

Ist aber ein Detail.

Mein Vorschlag: (packagebezeichnung musst du allenfalls enfernen oder anpassen)

Java:
package com.javaforum.auto;

public class Ladung {

	private final int gewicht;

	/**
	 * Konstruktor
	 * @param gewicht in kg
	 */
	public Ladung (int gewicht) {
		this.gewicht = gewicht;
	}

	public double getgewicht () {
		return gewicht;
	}

	@Override
	public String toString() {
		return "Ladungsgewicht = " + gewicht;
	}
}

Java:
package com.javaforum.auto;

public class Auto {

	private Ladung ladung;
	private final int maxLadegewicht;

	public Auto(int maxLadung) {
		maxLadegewicht = maxLadung;
	}

	public Ladung entladen() {
		Ladung tmpLadung = ladung;
		ladung = null;
		return tmpLadung;
	}

	public boolean lade(Ladung neueLadung) {
		if (ladung != null) {
			// Das Auto hat schon etwas geladen
			return false;
		}
		if (neueLadung.getgewicht() > maxLadegewicht) {
			// die neue Ladung ist zu schwer
			return false;
		}
		ladung = neueLadung;
		return true;
	}
}

Java:
package com.javaforum.auto;

public class Test {

	public static void main(String[] args) {
		Auto meinAuto = new Auto(1000);
		if (meinAuto.lade(new Ladung(500))) {
			System.out.println("Auto beladen - wie zu erwarten war");
		} else {
			System.out.println("Problem mit beladen - warum? Das müsste gehen.");
		}
		if (meinAuto.lade(new Ladung(500))) {
			System.out.println("Auto beladen - das dürfte nicht gehen");
		} else {
			System.out.println("Problem mit beladen - wie zu erwarten war");
		}
		System.out.println("Entladen " + meinAuto.entladen());
		if (meinAuto.lade(new Ladung(1500))) {
			System.out.println("Auto beladen - das dürfte nicht gehen");
		} else {
			System.out.println("Problem mit beladen - wie zu erwarten war");
		}
		if (meinAuto.lade(new Ladung(1000))) {
			System.out.println("Auto beladen - das muss gehen");
		} else {
			System.out.println("Problem mit beladen - warum? Das müsste gehen.");
		}
	}
}
 

Neue Themen


Zurück
Oben