Konstruktoren, verschiedene Klassen, Methoden.

  • Themenstarter Themenstarter sonnenschein
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

sonnenschein

Gast
Nachdem also mein Problem mit der Schleife so wunderbar gelöst wurde - hier mein eigentliches Problem: ich habe zwei Klassen: Auftrag und Auftragsverwaltung. Nun soll ich drei Objekte der Klasse Auftrag in der Klasse Auftragsverwaltung erstellen (bis dahin wunderbar) und dann einige Dinge mit ihnen durchführen. Meine Frage ist jetzt: wenn ich diese Objekte erstellt habe, ich dann die Attribute derselben ausgeben will, zeigt er mir dreimal die Attribute des letzten Objektes an. Ich gehe jetzt mal vom Beispiel print() aus - erstelle ich eine Methode
Code:
public void print()  {
  Auftrag1.print();
  Auftrag2.print();
  Auftrag3.print();
}
gibt er mir 3x Auftrag3 aus, versuche ich, drei verschiedene Methoden print1(), print2(), print3() zu entwickeln und die per Auftrag1.print1() usw. abzurufen, sagt er mir, daß er die Methode print1() in der Klasse Auftrag nicht findet, sehe ich ja auch ein, aber wie komme ich möglichst einfach ans gewünschte Ziel?

Hier die beiden Klassen:

Code:
public class Auftrag  {
  private static int Auftragnummer = 1;
  private static String Auftraggeber = "_";
  private static int Beginn = 1; //geplanter Auftragsbeginn Kalenderwoche
  private static int Ende = 1; //geplantes Auftragende, Kalenderwoche
  private static boolean Status = false; //false = nicht angefangen oder beendet
  private static double Preis = 0.0;
  private static double Rabatt = 0.0; //in Prozent
  private static int RestlicheLaufzeit = 1;
  private static String Auftragsstatus = "_";
  private static double Endpreis = 0.0;
  private static int aktuelleKW = 1;
  
  public Auftrag()  {
  }
  
  /**Konstruktor*/
  public Auftrag(int Auftragnummer, String Auftraggeber, int Beginn, int Ende, boolean Status, double Preis, double Rabatt, int aktuelleKW)  {
    this.Auftragnummer = Auftragnummer;
	this.Auftraggeber = Auftraggeber;
	this.Beginn = Beginn;
	this.Ende = Ende;
	this.Status = Status;
	this.Preis = Preis;
	this.Rabatt = Rabatt;
	this.aktuelleKW = aktuelleKW;
  } //Konstruktor
  
  /**  die folgenden Methoden dienen dem Veraendern und Abrufen der oben festgelegten als private deklarierten Attribute
      *     Methoden: setAttribut(), getAttribut()
      *     @param Attribut
      *     @return this.Atrribut  
      */  
  public void setAuftragnummer(int Auftragnummer)  {
    this.Auftragnummer = Auftragnummer;
  } //getAuftragnummer()
  
  public int getAuftragnummer()  {
    return this.Auftragnummer;
  } //setAuftragnummer()
  
  public void setAuftraggeber(String Auftraggeber)  {
    this.Auftraggeber = Auftraggeber;
  } //getAuftraggeber()
  
  public String getAuftraggeber()  {
    return this.Auftraggeber;
  } //setAuftraggeber()
  
  public void setBeginn(int Beginn)  {
    this.Beginn = Beginn;
  } //getBeginn()
  
  public int getBeginn()  {
    return this.Beginn;
  } //getBeginn()
  
  public void setEnde(int Ende)  {
    this.Ende = Ende;
  } //setEnde()
  
  public int getEnde()  {
    return this.Ende;
  } //getEnde()
  
  public void setStatus(boolean Status)  {
    this.Status = Status;
  } //setStatus()
  
  public boolean getStatus()  {
    return this.Status;
  } //getStatus()
  
  public void setPreis(double Preis)  {
    this.Preis = Preis;
  } //setPreis()
  
  public double getPreis()  {
    return this.Preis;
  } //getPreis()
  
  public void setRabatt(double Rabatt)  {
    this.Rabatt = Rabatt;
  } //setRabatt()
  
  public double getRabatt()  {
    return this.Rabatt;
  } //getRabatt()
  
  public void setAktuelleKW(int aktuelleKW)  {
    this.aktuelleKW = aktuelleKW;
  } //setAktuelleKW()
  
  public int getAktuelleKW()  {
    return this.aktuelleKW;
  } //getAktuelleKW()
  
  public void setRestlicheLaufzeit(int RestlicheLaufzeit)  {
    this.RestlicheLaufzeit = RestlicheLaufzeit;
  } //setRestlicheLaufzeit()
  
  public int getRestlicheLaufzeit()  {
    return this.RestlicheLaufzeit;
  } //getRestlicheLaufzeit()
  
  /** Die Methode gibt die restliche Laufzeit in Wochen zurück
       *   @param int aktuelleKW
       *   @return int RestlicheLaufzeit
       */
  public static int getRestlicheLaufzeit(int aktuelleKW)  { //gibt die restliche Laufzeit in Wochen zurück
    if (Ende - aktuelleKW > 0)  {
	  RestlicheLaufzeit = Ende - aktuelleKW;
	}  //if
	else  {
	  RestlicheLaufzeit = 0;
	} //else
	return RestlicheLaufzeit;
  } //getRestlicheLaufzeit()
  
  public void setAuftragsstatus(String Auftragsstatus)  {
	this.Auftragsstatus = Auftragsstatus;
  } //setPreis()
  
  public String getAuftragsstatus()  {
    return this.Auftragsstatus;
  } //getPreis()
  
  /** Die Methode gibt den Auftragsstatus zurück
       *   Rueckgabewerte: (nicht angefangen, angefangen, beendet, IN VERZUG)
       *   @param int aktuelleKW
       *   @return String Auftragsstatus
       */  
  public static String getAuftragsstatus(int aktuelleKW)  {
    String Auftragsstatus = "_";
	if (Status = true)  { //falls der Status auf angefangen steht
	  if (aktuelleKW - Ende < 0)  { //das Ende ist spaeter als die aktuelle Kalenderwoche
	    Auftragsstatus = "angefangen";
	  } //if
	  else  {
	    Auftragsstatus = "IN VERZUG"; //das geplante Ende ist bereits ueberschritten
	  } //else
	} //if
	else  {
	  if (aktuelleKW - Beginn < 0)  {
	    Auftragsstatus = "nicht angefangen";
	  } //if
	  else  {
	    Auftragsstatus = "beendet";
	  } //else
	} //else
	return Auftragsstatus;
  } //getAuftragsstatus()
  
  public void setEndpreis(double Endpreis)  {
	this.Endpreis = Endpreis;
  } //setPreis()
  
  public double getEndpreis()  {
    return this.Endpreis;
  } //getPreis()
  
  /** Die Methode gibt den Endpreis zurück
       *   er berechnet sich aus dem Preis abzueglich des Rabattes
       *   @param keine
       *   @return double Endpreis
       */
  public static double berechnePreis()  {
    double Endpreis = Preis - (Preis * Rabatt * 0.01);
    return Endpreis;
  } //berechnePreis()
  
  /** Die Methode gibt die Attribute auf die Standardausgabe aus
       *   @param keine
       *   @return void
       */
  public void print()  { 
    Auftragsstatus = Auftrag.getAuftragsstatus(aktuelleKW);
    Endpreis = Auftrag.berechnePreis();
	RestlicheLaufzeit = Auftrag.getRestlicheLaufzeit(aktuelleKW);
    System.out.println("Auftragnummer:      " + Auftragnummer);
	System.out.println("Auftraggeber:       " + Auftraggeber);
	System.out.println("Beginn:             KW " + Beginn);
	System.out.println("geplantes Ende:     KW " + Ende);
	System.out.println("Auftragsstatus:     " + Auftragsstatus);
	System.out.println("Restliche Laufzeit: " + RestlicheLaufzeit + " Wochen");
	System.out.println("Preis:              " + Preis + " Euro");
	System.out.println("Rabatt:             " + Rabatt + "%");
	System.out.printf("Endpreis:           %.2f Euro", Endpreis);
	System.out.println("\n");
  } //print()
} //class Auftrag

und

Code:
public class Auftragsverwaltung  {
  static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); //ein Eingabegeraet wird benoetigt, hier initialisiert
  double Einnahmen = 0.0;
  double neuerRabatt1 = 0.0;
  double neuerRabatt2 = 0.0;
  double neuerRabatt3 = 0.0;
  
  
  Auftrag Auftrag1 = new Auftrag(112244, "Meta Physik", 30, 37, true, 3562.30, 16.7, 35); //mittels Konstruktor aus der Klasse Auftrag.java wird der erste Auftrag erstellt
  
  int Nr1                = Auftrag1.getAuftragnummer();
  String Auftraggeber1   = Auftrag1.getAuftraggeber();
  int Beginn1            = Auftrag1.getBeginn();
  int Ende1              = Auftrag1.getEnde();
  boolean Status1        = Auftrag1.getStatus();
  double Preis1          = Auftrag1.getPreis();
  double Rabatt1         = Auftrag1.getRabatt();
  int RestlicheLaufzeit1 = Auftrag1.getRestlicheLaufzeit();
  String Auftragsstatus1 = Auftrag1.getAuftragsstatus();
  double Endpreis1       = Auftrag1.getEndpreis();
  int aktuelleKW1        = Auftrag1.getAktuelleKW();
  
  Auftrag Auftrag2 = new Auftrag(123456, "Emilie Galgenstreich", 13, 25, false, 376.98, 6.8, 35); //zweiter Auftrag mit Konstruktor der Klasse Auftrag.java

  int Nr2                = Auftrag2.getAuftragnummer();
  String Auftraggeber2   = Auftrag2.getAuftraggeber();
  int Beginn2            = Auftrag2.getBeginn();
  int Ende2              = Auftrag2.getEnde();
  boolean Status2        = Auftrag2.getStatus();
  double Preis2          = Auftrag2.getPreis();
  double Rabatt2         = Auftrag2.getRabatt();
  int RestlicheLaufzeit2 = Auftrag2.getRestlicheLaufzeit();
  String Auftragsstatus2 = Auftrag2.getAuftragsstatus();
  double Endpreis2       = Auftrag2.getEndpreis();
  int aktuelleKW2        = Auftrag2.getAktuelleKW();
  
  
  Auftrag Auftrag3 = new Auftrag(246552, "Carolus Magnus", 12, 32, true, 112873.24, 13.7, 35); //ddritter Auftrag mit Konstruktor der Klasse Auftrag.java
  
  int Nr3                = Auftrag3.getAuftragnummer();
  String Auftraggeber3   = Auftrag3.getAuftraggeber();
  int Beginn3            = Auftrag3.getBeginn();
  int Ende3              = Auftrag3.getEnde();
  boolean Status3        = Auftrag3.getStatus();
  double Preis3          = Auftrag3.getPreis();
  double Rabatt3         = Auftrag3.getRabatt();
  int RestlicheLaufzeit3 = Auftrag3.getRestlicheLaufzeit();
  String Auftragsstatus3 = Auftrag3.getAuftragsstatus();
  double Endpreis3       = Auftrag3.getEndpreis();
  int aktuelleKW3        = Auftrag3.getAktuelleKW();
  
  /** Die Methode rechnet die Einnahmen aus den Preisen aller Auftraege zusammen
       *    @param keine
       *    @return double Einnahmen
       */
  public double berechneEinnahmen()  {
    Einnahmen = Preis1 + Preis2 + Preis3;
	System.out.printf("Die Gesamteinnahmen betragen %.2f Euro", Einnahmen);
	System.out.println("\n");
	return Einnahmen;
  } //berechneEinnahmen()

  /** Die Methode erhoeht den Rabatt aller Auftraege um Prozent Prozent
       *    @param double Prozent
       *    @return void
       */  
  public void erhoeheRabatt(double Prozent) throws IOException {
    Prozent = Double.parseDouble(in.readLine());
	neuerRabatt1 = Rabatt1 + (Rabatt1*Prozent*0.01);
    neuerRabatt1 = neuerRabatt1 * 100;
    neuerRabatt1 = Math.round(neuerRabatt1);
    neuerRabatt1 = neuerRabatt1 / 100;
    
	neuerRabatt2 = Rabatt2 + (Rabatt2*Prozent*0.01);
    neuerRabatt2 = neuerRabatt2 * 100;
    neuerRabatt2 = Math.round(neuerRabatt2);
    neuerRabatt2 = neuerRabatt2 / 100;
	
	neuerRabatt3 = Rabatt3 + (Rabatt3*Prozent*0.01);
    neuerRabatt3 = neuerRabatt3 * 100;
    neuerRabatt3 = Math.round(neuerRabatt3);
    neuerRabatt3 = neuerRabatt3 / 100;

	System.out.println("Der neue Rabatt bei Auftrag "+ Nr1 + " betraegt " + neuerRabatt1 + "%");
	System.out.println("Der neue Rabatt bei Auftrag "+ Nr2 + " betraegt " + neuerRabatt2 + "%");
	System.out.println("Der neue Rabatt bei Auftrag "+ Nr3 + " betraegt " + neuerRabatt3 + "%");
  } //erhoeheRabatt()
  
  //ueberfluessige Mehthoden???
  public void print1()  {
	System.out.println("Auftragnummer:      " + Nr1);
	System.out.println("Auftraggeber:       " + Auftraggeber1);
	System.out.println("Beginn:             KW " + Beginn1);
	System.out.println("geplantes Ende:     KW " + Ende1);
	System.out.println("Auftragsstatus:     " + Auftragsstatus1);
	System.out.println("Restliche Laufzeit: " + RestlicheLaufzeit1 + " Wochen");
	System.out.println("Preis:              " + Preis1 + " Euro");
	System.out.println("Rabatt:             " + Rabatt1 + "%");
	System.out.printf("Endpreis:           %.2f Euro", Endpreis1);
	System.out.println("\n");
  } //print1()
  
  public void print2()  {
	System.out.println("Auftragnummer:      " + Nr2);
	System.out.println("Auftraggeber:       " + Auftraggeber2);
	System.out.println("Beginn:             KW " + Beginn2);
	System.out.println("geplantes Ende:     KW " + Ende2);
	System.out.println("Auftragsstatus:     " + Auftragsstatus2);
	System.out.println("Restliche Laufzeit: " + RestlicheLaufzeit2 + " Wochen");
	System.out.println("Preis:              " + Preis2 + " Euro");
	System.out.println("Rabatt:             " + Rabatt2 + "%");
	System.out.printf("Endpreis:           %.2f Euro", Endpreis2);
	System.out.println("\n");
  } //print2()
  
  public void print3()  {
	System.out.println("Auftragnummer:      " + Nr3);
	System.out.println("Auftraggeber:       " + Auftraggeber3);
	System.out.println("Beginn:             KW " + Beginn3);
	System.out.println("geplantes Ende:     KW " + Ende3);
	System.out.println("Auftragsstatus:     " + Auftragsstatus3);
	System.out.println("Restliche Laufzeit: " + RestlicheLaufzeit3 + " Wochen");
	System.out.println("Preis:              " + Preis3 + " Euro");
	System.out.println("Rabatt:             " + Rabatt3 + "%");
	System.out.printf("Endpreis:           %.2f Euro", Endpreis3);
	System.out.println("\n");
  } //print3()
  
  /** Die Methode gibt die Auftraege auf die Standardausgabe aus
       *    @param keine
       *	   @return void
       */
  public void print()  {
    Auftrag1.print1(); //Das funktioniert leider nicht, da ich mit einem Objekt aus der klasse Auftrag nicht auf die Methode print1 zugreifen kann...
	Auftrag2.print2();
	Auftrag3.print3();
  } //print()

  /** Die Methode liest von der Standardeingabe die Nummer eines Auftrages ein und gibt diesen Auftrag auf die Standardausgabe aus
       *    @param keine
       *	   @return void
       */  
  public void info() throws IOException { 
    int auftrag = Integer.parseInt(in.readLine());
    boolean bedingung = false;
   
    while (bedingung)  {
      System.out.println("Der gewaehlte Auftrag existiert nicht, geben Sie bitte eine andere Nummer ein: ");
      auftrag = Integer.parseInt(in.readLine());
      if (auftrag != Nr1)  {
      bedingung = true;
      } //if
      else {
        if (auftrag != Nr2)  {
          bedingung = true;
         } //if
        else  {
          if (auftrag != Nr3)  {
            bedingung = true;
          } //if
	      else {
	        bedingung = false;
          } //else
        } //else 
      } //else
    } //while
    if (auftrag == Nr1)  {
      Auftrag1.print1();
    } //if
    else  {
      if (auftrag == Nr2)  {
        Auftrag2.print2();
      } //if
      else  {
        if (auftrag == Nr3)  {
          Auftrag3.print3();
        } //if
      } //else
    } //else
  } //info()
  
  /** Main-Methode
       *   enthaelt einen Dialog zum Auswaehlen der Funktionen
       *   wird Wiederholt, bis der Benutzer das Programm explizit beendet
       *  @param keine
       *  @return void
       */
  public static void main(String [] args)  throws IOException {
    
	double Prozent = 0.0;
	int option = 1;
    Auftragsverwaltung neu = new Auftragsverwaltung(); //ein neues Objekt der klasse Auftragsverwaltung wird erzeugt
	
    do  { //hier wird die Schleife begonnen
	  System.out.println("Bitte waehlen Sie eine der folgenden Optionen:"); //die einzelnen Optionen werden angefuehrt
	  System.out.println("1 - Ausgabe der Summe aller Einnahmen");          //Funktionsauswahl durch Eingabe von ganzen Zahlen
	  System.out.println("2 - Erhoehung des Rabattes fuer alle Auftraege");
	  System.out.println("3 - Ausgabe aller Auftraege");
	  System.out.println("4 - Ausgabe eines Auftrages nach Auftragsnummer");
	  System.out.println("0 - Beendigung des Programmes");
	  System.out.print("\n");
	
	  option = Integer.parseInt(in.readLine());
	
	  switch(option)  { //Selektion durch switch()
	    case 1: neu.berechneEinnahmen();
		        break;
	    case 2: System.out.println("Bitte geben Sie die Rabatterhoehung in Prozent ein ");
				neu.erhoeheRabatt(Prozent);
		        System.out.println("\n");
		        break;
	    case 3: neu.print();
		        break;
	    case 4: System.out.println("Bitte geben Sie die Nummer des gewuenschten Auftrags ein: ");
		        System.out.println(neu.Nr1 + " oder " + neu.Nr2 + " oder " + neu.Nr3);
		        neu.info();
		        break;
	  } //switch
	} //do 
	while (option != 0); //hier wird bei der Eingabe '0' die Schleife terminiert
  } //main-Methode
} //class Auftragsverwaltung

danke schonmal 🙂
 
Also erstmal vorab solltest Du ein paar Richtlinien der OOP einhalten:
- static setzt man nur Variablen und Methoden wenn man diese von außen auch ohne Objekt-Instanz aufrufen möchte(Class.Method/Class.Attribute), und privat static ist so oder so quatsch.
- In der Auftragsverwaltung fehlen sämtliche Zugriff-Modifikatoren (private/protected/public)
- Ich weiß es ist geschmackssache und java lässt einem da imho zu viel Freiheit aber verwende für Deine Klasseninternen Objekte das Keyword this, auch da kann man schon etliche Misstände beheben.

Vielleicht löst es ja schon Dein Problem.

Gut Schuß
VuuRWerK 😉
 
danke, hätte nicht gedacht, daß die Kleinigkeiten was ausmachen...
 
Naja Kleinigkeiten? :meld: Wenn man sich gleich dran hält, dann treten solche kleinen Fehler gar nicht erst auf :meld:

🙂

Gut Schuß
VuuRWerK 😉
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben