Methoden Flughafen

pexstar

Mitglied
Hallo erst mal, bin neu hier! :meld:

Ich habe mich hier angemeldet, weil immer mal wieder etwas unklar ist und ich hoffe das mir hier der ein oder andere etwas helfen kann. Ich beschäftige mich jetzt seit knapp 4 Wochen mit JAVA und habe das Ziel das irgendwann mal ganz gut zu beherrschen.

Aktuell versuche ich einen Flughafen zu konstruieren. Ich bin wie gesagt Anfänger und ich möchte das ja jetzt nichts großartiges erschaffen, sondern die Sprache einfach nur Schritt für Schritt verstehen. Der Flughafen dient für mich als Beispiel.

Ich hatte mir überlegt, dass man für einen Flughafen Landebahnen, Personal und natürlich Flugzeuge benötigt. Ich habe dann erst mal drei Klassen erstellt:


Java:
public class Flughafen_Landebahn {
	
	int laenge;
	int breite;

}


Java:
public class Flughafen_Personal {
	
	int gesamtpersonal;
	int kostenProJahr;

}



Java:
public class Flughafen_Flugzeug {
	
	int anzahlPassagiere;
	int kostenProFlug;
	int zustand = 100;
	double geschwindigkeit;
	double gewicht;
	boolean inDerLuft;
	String model;
	
	public void warten() {
		
	}
	
}



Und schließlich der Flughafen mit zwei Flugzeugen:


Java:
public class Flughafen {
	public static void main(String [] args) {
		
		Flughafen_Flugzeug flugzeug_1000 = new Flughafen_Flugzeug();
		Flughafen_Flugzeug flugzeug_2000 = new Flughafen_Flugzeug();
		
		flugzeug_1000.anzahlPassagiere = 220;
		flugzeug_1000.model = "Boeing";
		flugzeug_1000.zustand = 100;
		flugzeug_1000.geschwindigkeit = 300;
		flugzeug_1000.gewicht = 24000.40;
		flugzeug_1000.inDerLuft = true;
		flugzeug_1000.kostenProFlug = 65000;
		
		flugzeug_2000.anzahlPassagiere = 400;
		flugzeug_2000.model = "Airbus";
		flugzeug_2000.zustand = 80;
		flugzeug_2000.geschwindigkeit = 280;
		flugzeug_2000.gewicht = 42000.80;
		flugzeug_2000.inDerLuft = false;
		flugzeug_2000.kostenProFlug = 100000;
		
		
	}
}



Das alles verstehe ich zumindest schon. Das man Klassen anlegen muss (Flugzeug, Personal...) und die dann später ins "Hauptprogramm" schreibt bzw. auf die Klassen zugreift. Womit ich allerdings Probleme habe ist das Ganze zum Laufen zu bekommen, also Methoden anzuwenden.


Zum Beispiel steht bei der Klasse Flughafen_Flugzeug:

public void warten() {

}

Die Methode warten soll ausgeführt werden, dass Flugzeug soll also gewartet werden.

Dafür habe ich mir folgendes überlegt:

Zustand ist immer automatisch 100, wenn ein Flugzeug hinzugefügt wird. Dies habe ich ja quasi schon in der Klasse Flughafen_Flugzeug festgelegt (oder?).

Sobald es einmal geflogen ist, verringert sich der Wert auf 80 und muss gewartet werden. Der Airbaus (flugzeug.2000) hat nur einen Wert von 80 und müsste dementsprechend gewartet werden. Ich weiß aber nicht genau wie ich das jetzt angehen muss.

if zustand <= 80 -> reparieren -> neuer Zustand 100.

Aber wie genau schreibe ich das in die Methode?
 

faetzminator

Gesperrter Benutzer
Hi.
Zuerst mal, halte dich bitte von Anfang an an die Java Conventions. Klassen schreibt man UpperCamelCase. Ich würde da ohnehin nur Landebahn, Personal etc. verwenden.
Dann mach alle Attribute nach belieben private oder protected und erstell dir dazu Setter und Getter-Methoden.

Dann zu deinem Problem:
Implementier die beiden Methoden:
Java:
public void warten() {
    setZustand(100);
    // ...
}

public void fliegen() {
    setZustand(getZustand() - 20);
    // ...
}
Und dann:
Java:
// ...
flugzeug.fliegen();
if (flugzeug.getZustand() <= 80) {
    flugzeug.warten();
}
// ...
 

bananajoe

Mitglied
Sobald es einmal geflogen ist, verringert sich der Wert auf 80 und muss gewartet werden. Der Airbaus (flugzeug.2000) hat nur einen Wert von 80 und müsste dementsprechend gewartet werden. Ich weiß aber nicht genau wie ich das jetzt angehen muss.

if zustand <= 80 -> reparieren -> neuer Zustand 100.

Aber wie genau schreibe ich das in die Methode?

Warum erstellst Du nicht eine Klasse, die eine Wartungsschleife (eine Collection) beinhaltet. Sobald ein Flugzeug einen bestimmten Zustand erreicht, fügt er sich in die Wartungsschleife ein. Abgesehen davon, würde ich diese Variable von der Flugzeit oder Flugkilometern abhängig machen.

Kleiner Tipp: Füge Deiner Klasse einen Konstruktor ein, der die Initialwerte annimmt. So ersparst Du Dir ellenlange Zuweisungen.

Mir ist unklar, wie die ganze Simulation ablaufen soll. Willst Du alle instantierten Flugzeuge starten lassen? Wie lange sollen die fliegen?
 

pexstar

Mitglied
Ah super! Vielen Dank für die schnellen Antworten. :applaus:


faetzminator

Muss mir zwar noch mal genau anschauen, was du mit UpperCamelCase meinst und was es im Detail mit Setter- und Getter-Methoden auf sich hat, sieht aber erstmal schlüssig und vor allem auch einfach aus.



bananajoe

Ich schaue mir das mal mit dem Konstruktor an und auch das mit der "Collection" (habe ich glaube ich auch schon mal in Verbindung mit JAVA gehört).

Dieses Beispiel dient nur dazu, dass ich gewisse Dinge erst Mal leichter verstehen/nachvollziehen kann, dass muss jetzt nicht alles bis ins Detail realistisch ablaufen.



/EDIT:

UpperCamelCase:

Flughafen_Flugzeug = FlughafenFlugzeug

bzw. der Übersicht wegen einfach nur "Flugzeug".
 
Zuletzt bearbeitet:

faetzminator

Gesperrter Benutzer
Flughafen_Flugzeug = FlughafenFlugzeug
Genau, Klassen UpperCamelCase, Variablen und Methode lowerCamelCase, Packages lowercase, final static Felder ggf. UPPER_CASE.
[...] was es im Detail mit Setter- und Getter-Methoden auf sich hat [...]

Java:
public class Foo {

    private String bar;

    public void setBar(String bar) {
        this.bar = bar;
    }

    public String getBar() {
        return bar;
    }
}
So kann man, wo nötig, noch irgendwelchen Code einfügen, z.B.
Java:
public void setBar(String bar) {
    if (bar == null) {
        throw new IllegalArgumentException("bla blubb");
    }
    this.bar = bar;
}
oder
Java:
public void setBar(String bar) {
    this.bar = bar;
    someMagicValidationMethod();
}
 

pexstar

Mitglied
Irgendwie verstehe ich das noch nicht ganz mit set und get.

Folgendermaßen sieht meine Klasse Flugzeug jetzt aus:


Java:
public class Flugzeug {
	
	private int anzahlPassagiere;
	private int kostenProFlug;
	private int zustand = 100;
	private double geschwindigkeit;
	private double gewicht;
	private boolean inDerLuft;
	private String model;
	
	// Konstruktor
	public int getZustand(){
		return zustand;
	}



und jetzt würde ich das Ganze gerne auslesen lassen im Flughafen:


Java:
public class Flughafen {
	public static void main(String [] args) {
		
		Flugzeug flugzeug_1000 = new Flugzeug();
		Flugzeug flugzeug_2000 = new Flugzeug();
		
		flugzeug_1000.anzahlPassagiere = 220;
		flugzeug_1000.model = "Boeing";
		flugzeug_1000.zustand = 100;
		flugzeug_1000.geschwindigkeit = 300;
		flugzeug_1000.gewicht = 24000.40;
		flugzeug_1000.inDerLuft = true;
		flugzeug_1000.kostenProFlug = 65000;
		
		public void getZustand() {
		return zustand;
		
		System.out.println(zustand);
		}
}


Ich habe glaube ich mehr ein Problem mit der Syntax....

Was mache ich falsch? Wie nehme ich eigentlich explizit Bezug auf "flugzeug_1000"?



Andere Möglichkeit:


Java:
		public int getZustand() {
			
			return this.zustand;
		
		System.out.println(zustand);
		}


Geht auch nicht? :/
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Java:
public class Flugzeug {
    ...
    private int zustand = 100;
    ...

    public int getZustand() {
      return zustand;
    }

    public void setZustand(int zustand) {

     this.zustand = zustand;
    }
}

public class MainApp {

   public static void main(String[] args) {

     Flugzeug flugzeug1000 = new Flugzeug() {
     flugzeug1000.setZustand(80);

     System.out.println(flugzeug1000.getZustand());
   }
}
 

pexstar

Mitglied
nillehammer

Muss ich den Zustand denn jedes Mal setzen (set) und kann ich ihn dann erst auslesen? Habe doch den Zustand in der Klasse Flugzeug bereits auf 100 gesetzt. Kann ich diesen Wert nicht auslesen? Gibts da Probleme weil ich die als private eingestuft habe?
 
N

nillehammer

Gast
Muss ich den Zustand denn jedes Mal setzen (set) und kann ich ihn dann erst auslesen? Habe doch den Zustand in der Klasse Flugzeug bereits auf 100 gesetzt. Kann ich diesen Wert nicht auslesen?
Nein natürlich nicht. Wenn der default-Wert passt, musst Du nicht vorher den setter aufrufen. Du hattest aber gesagt, dass Du das mit dem setter nicht verstehst. Deswegen habe ich ein Beispiel programmiert, wo einer benutzt wird.
Gibts da Probleme weil ich die als private eingestuft habe?
Nein. Das macht man i.d.R. so. Dadurch kann man den Wert nur noch über den setter modifizieren und nicht mehr direkt. Das ist aber erwünscht.
 

pexstar

Mitglied
Funktioniert alles, wunderbar, Danke!

Habe noch ein paar Bedingungen eingebaut:


Java:
	// SET-Konstruktor für Zustand
	public void setZustand(int zustand) {
			
		if (zustand >= 100) {
			zustand = 100;																// 100 ist der maximale Zustandswert für ein Flugzeug.
			System.out.println("Das Flugzeug ist im perfekten Zustand.");
		}
			
		else if (zustand >= 90) {
				System.out.println("Das Flugzeug ist im guten Zustand.");
		}
		
		else if (zustand >= 80) {
			System.out.println("Das Flugzeug ist in einem passablen Zustand, sollte aber zur Sicherheit gewartet werden.");
		}
		
		else if (zustand >= 50) {
			System.out.println("Das Flugzeug ist in keinem guten Zustand und sollte dringend gewartet werden.");
		}
		
		else if (zustand >= 1) {
			System.out.println("Das Flugzeug ist in einem sehr schlechten Zustand. Fliegen auf eigene Gefahr.");
		}
			
		else if(zustand <=0) {
				System.out.println("Das Flugzeug hat einen Totalschaden erlitten.");
		}
		
		this.zustand = zustand;
	}
	
	// GET-Konstruktor für Zustand
	public int getZustand(){
		
		return zustand;
	}


Java:
public class Flughafen {
	public static void main(String [] args) {
		
		Flugzeug flugzeug1000 = new Flugzeug();
		
		flugzeug1000.setZustand(85);

		System.out.println("Das Flugzeug hat einen Zustandswert von " + flugzeug1000.getZustand() + ".");
		}


Konsolenausgabe:

Das Flugzeug ist in einem passablen Zustand, sollte aber zur Sicherheit gewartet werden.
Das Flugzeug hat einen Zustandswert von 85.




Jetzt möchte ich dass das Flugzeug automatisch gewartet wird, sobald es einen Zustandswert von <= 50 hat.

Habe dazu Folgendes in die Klasse Flugzeug geschrieben:


Java:
	public void warten () {
		if (zustand > 0 && zustand <= 50)
		setZustand(getZustand() +100);
		
		else if (zustand <= 0) {
			System.out.println("Das Flugzeug kann nicht mehr repariert werden.");
		}
		
		System.out.println("Das Flugzeug wurde erfolgreich gewartet.");
	}


Wie kann ich das jetzt in dem Hauptprogramm aufrufen?



Java:
	public void warten () {
	
	}
 
Zuletzt bearbeitet:
N

nillehammer

Gast
Wie kann ich das jetzt in dem Hauptprogramm aufrufen?
Genauso wie die anderen Methoden auch, also:
Java:
public class MainApp {
 
   public static void main(String[] args) {
 
     Flugzeug flugzeug1000 = new Flugzeug() {
     
     flugzeug1000.setZustand(80);
 
     // hier wird warten aufgerufen.
     flugzeug100.warten();
   }
}
Da hättste aber auch selbst drauf kommen können ;)
 

langhaar!

Bekanntes Mitglied
Java:
	public void warten () {
		if (zustand > 0 && zustand <= 50)
		setZustand(getZustand() +100);
		
		else if (zustand <= 0) {
			System.out.println("Das Flugzeug kann nicht mehr repariert werden.");
		}
		
		System.out.println("Das Flugzeug wurde erfolgreich gewartet.");
	}

Wenn der Zustand 0 ist wird "Das Flugzeug kann nicht mehr repariert werden" und "Das Flugzeug wurde erfolgreich gewartet" ausgegeben.

Das schafft bei den Kunden kein Vertrauen :noe:
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...

Neue Themen


Oben