get methoden zugriff und objekt erzeugung

jimbo1000

Mitglied
Hallo,

fuer die uni muss ich ein programm fertig machen. Hierzu muss ich mich an folgende klassenhierarchie halten.
Einwohner ist die oberklasse, davon sollen erben Koenig, Adel, Bauer. Danach soll die KLasse Leibeigener von Bauer erben. Als naechstes soll ich in die Klasse Einwohner einen konstruktor Einwohner() implementieren der das einkommen uebergeben bekommt mit der variable int einkommen und der sichbarkeit public. Dann soll ein Konstruktor erfolgen der nichts uebergeben bekommt und einen neuen Einwohner erzeugt und diesem ein einkommen von 0 zuweist. In die anderen klassen soll genau das selbe passieren und die konstruktoren sollen das gleiche schema verfolgen. Außerdem soll ich noch 2 get-methoden setzen innerhlab in der Klassen hierarchie einmal getZuVersteuerndesEinkommen() und setZuVersetuerndes einkommen. Dies habe ich wei folgt gemacht:
Java:
public class Einwohner {
 
   public int einkommen;
 
   public double steuer;
 
   public Einwohner(int einkommen){
     
       this.einkommen = einkommen;
     
     
   }
 
   public Einwohner(){
     
       Einwohner einwohner1 = new Einwohner();
     
       einwohner1.einkommen = 0;
     
   }
 
   public int getZuVersteuerndesEinkommen(){
     
       return einkommen;
   }
 
   public double getSteuer(){
     
       return steuer;
   }
 

}
Java:
public class Koenig extends Einwohner {
 
public Koenig(int einkommen){
     
   this.einkommen = einkommen;
     
   }
 
   public Koenig(){
     
       Koenig koenig1 = new Koenig();
     
       koenig1.einkommen = 0;
     
   }
 
   public void setZuVersteuerndesEinkommen(int einkommen){
     
       this.einkommen = einkommen;
     
   }
 
   public void setSteuer(double steuer){
     
       this.steuer = einkommen * 0.20;
     
       System.out.println("S"+steuer);
   }


}
Java:
public class Adel extends Einwohner {
 
public Adel(int einkommen){
   this.einkommen = einkommen;
     
     
   }
 
   public Adel(){
     
       //Adel adel1 = new Adel();
     
       //adel1.einkommen = 0;
     
   }


public void setZuVersteuerndesEinkommen(int einkommen){
     
       this.einkommen = einkommen;
     
   }
 
   public void setSteuer(int steuer){
     
       einkommen = (int) (einkommen *0.20);
   }
}
Java:
public Bauer(int einkommen){
 
   this.einkommen = einkommen;
     
     
   }
 
   public Bauer(){
     
       Bauer bauer1 = new Bauer();
     
       bauer1.einkommen = 0;
     
   }
 
public void setZuVersteuerndesEinkommen(int einkommen){
     
       this.einkommen = einkommen;
     
   }
 
   public void setSteuer(int steuer){
     
       einkommen = (int) (einkommen *0.20);
   }


}
Java:
public class Leibeigener extends Bauer {
 
public Leibeigener(int einkommen){
 
   this.einkommen = einkommen;
     
     
   }
 
   public Leibeigener(){
     
       Leibeigener leibeigener1 = new Leibeigener();
     
       leibeigener1.einkommen = 0;
     
   }


public void setZuVersteuerndesEinkommen(int einkommen){
     
       this.einkommen = einkommen;
     
   }
 
   public void setSteuer(int steuer){
     
       einkommen = (int) (einkommen *0.20);
   }
}
wenn ich versuche in der setMethode den wert fuer das einkommen anzupassen funktioniert es nicht. Meine ausgabe ist einfach 0.0? Ausserdem bekomme ich eibnen stackOverflow bei der erzeugung eines Einwohner in der klassse Einwohner. Falls ich diesen auskommentiere und bekomme ich den anechsten bei erzuegung in der Klasse Bauer. Fuer jeden rat bin ich sehr dankbar:)

hier noch meine main methode mit der ich testen will:
Java:
public class Koenigreich {
 
   public static void main(String[] args) {
       steuerbescheid(new Koenig(2));
       steuerbescheid(new Adel(20));
       steuerbescheid(new Bauer(20));
       steuerbescheid(new Leibeigener(20));
   }


   static void steuerbescheid(Einwohner einwohner) {
     
       System.out.println(einwohner.getClass().getSimpleName() +
               ": Einkommen " + einwohner.einkommen +
               ", zu versteuerndes Einkommen " + einwohner.getZuVersteuerndesEinkommen() +
               ", Steuer " + einwohner.getSteuer());
   }
}
 
Zuletzt bearbeitet von einem Moderator:
X

Xyz1

Gast
Wie wärs wenn du Code-Tags verwendest? Wie das geht, steht in meiner Sig.

Bearbeitung:
Keine Horizontals einfügen,
Code-Tags verwenden,
Beitrag kann innerhalb 30 Minuten geändert werden,
Frage(n) sichtlich machen
 

jimbo1000

Mitglied
hmm ok bin mir jetzt nicht ganz sicher wie du das meinst^^. Mein problem liegt dabei das ich versuche mit den set-Methoden die werte in der Klasse Einwohner zu veraendern. Jedoch funktioniert das beim testen nicht. Meine ausgabe bleibt 0.0 . Ausserdem bekomme ich ein stackoverflow. Der fehler scheint in der Klasse Einwohner zu sitzen bei der erzeugung von einwohner1.
 

jimbo1000

Mitglied
Java:
public Einwohner(){

Einwohner einwohner1 = new Einwohner();

einwohner1.einkommen = 0;

}

public int getZuVersteuerndesEinkommen(){

return einkommen;
}

public double getSteuer(){

return steuer;
}


}
-----------------------------------------------------------------------------------------------

public class Koenig extends Einwohner {

public Koenig(int einkommen){

this.einkommen = einkommen;

}

public Koenig(){

Koenig koenig1 = new Koenig();

koenig1.einkommen = 0;

}

public void setZuVersteuerndesEinkommen(int einkommen){

this.einkommen = einkommen;

}

public void setSteuer(double steuer){

this.steuer = einkommen * 0.20;

System.out.println("S"+steuer);
}


}
-------------------------------------------------------------
public class Adel extends Einwohner {

public Adel(int einkommen){
this.einkommen = einkommen;


}

public Adel(){

//Adel adel1 = new Adel();

//adel1.einkommen = 0;

}


public void setZuVersteuerndesEinkommen(int einkommen){

this.einkommen = einkommen;

}

public void setSteuer(int steuer){

einkommen = (int) (einkommen *0.20);
}
}
----------------------------------------------------------------


public Bauer(int einkommen){

this.einkommen = einkommen;


}

public Bauer(){

Bauer bauer1 = new Bauer();

bauer1.einkommen = 0;

}

public void setZuVersteuerndesEinkommen(int einkommen){

this.einkommen = einkommen;

}

public void setSteuer(int steuer){

einkommen = (int) (einkommen *0.20);
}


}
----------------------------------------------------------------------------------------
public class Leibeigener extends Bauer {

public Leibeigener(int einkommen){

this.einkommen = einkommen;


}

public Leibeigener(){

Leibeigener leibeigener1 = new Leibeigener();

leibeigener1.einkommen = 0;

}


public void setZuVersteuerndesEinkommen(int einkommen){

this.einkommen = einkommen;

}

public void setSteuer(int steuer){

einkommen = (int) (einkommen *0.20);
}
}
 

AndiE

Top Contributor
Ich habe die gesamte Eingabe in die Java-Tags gesetzt. So kann man sich das erstmal ansehen. Hast du dich schon mal gefragt, wieso die Klassen von Einwohner erben? Wie ist dein Programm mit dem Grundsatz zu vereinbaren, dass ein Code möglichst nicht wiederholt werden soll?
 

JStein52

Top Contributor
Dein Stackoverflow kommt daher dass du in jeder Klasse (z.B. Koenig, Einwohner etc.) im parameterlosen Konstruktor wiederum ein Objekt der gleichen Klasse mit new .... anlegst. Das ruft wieder den Konstruktor auf der ein Objekt der Klasse anlegt, was den Kosntruktor aufruft ........ bis der Stack überläuft
 

jimbo1000

Mitglied
@JStein52 das habe ich bereits vermutet...die aufgaben stellung heist ich zitiere: "Programmieren sie zunaechst die Klasse Einwohner. Diese soll einen Konstruktor der das Einkommen uebergeben bekommt und einen Standartkonstruktor, der einen Einwohner mit Einkommen 0 anlegt, enthalten".

Dann heist es weiter das man die selben Konstruktoren in allen anderen klassen der hirarchie implementieren soll.
 

jimbo1000

Mitglied
@AndiE ...ja das habe ich mich auch gefragt:D ich denke das durch verfassen der get-methoden in der klasse einwohner es wie eine art dummy gehalten wird und der rest der spezifischer ist in den anderen klassen stattfindet. Damit meine ich das ich in der Klasse einwohner eben nur die get.metthoden implementiere obwohl ich meine das dass nciht so ganz funktioniert....
 

JStein52

Top Contributor
Der Hinweis "public" bezieht sich auf die Konstruktoren, nicht auf das Attribut einkommen. Dies bleibt natürlich private.
Und die Konstruktoren in den abgeleiteten Klassen rufen dann einfach super(einkommen) oder super() auf.
 
X

Xyz1

Gast
@jimbo1000
Ich kann damit nüsch anfangen. Das ist unformatiert und alles innerhalb eines Code-Blocks. Was studierst du denn? Geographie oder ähnliches? Hast du schonmal programmiert?
----
Ein paar Tipps kann ich natürlich schon geben, Konstruktoren sollten sich nicht selbst aufrufen und mit Oberklassen geht üblicherweise abstrakte Methoden einher. Ob du mit den Tipps etwas anfangen kannst? o_O
 

Trjavnamen

Bekanntes Mitglied
Ich habe mir das Buch aller Bücher gekauft:Schrödinger programmiert Java. Ein ungewöhnlich tolles Buch mit Regeln die in keiner WEB Seite so deutlich zu finden sind. Die Variable: "Integer k = 10000" ist eine statische Konstruktion d.h. der Wert ist nicht veränderbar.Die Konstruktion "Integer k = new Integer " ist ein veränderbarer Wert.
 

Trjavnamen

Bekanntes Mitglied
sorry ich bin Leser dieses Buches und nicht ein Verkäufer. Eine Spam ist ein link der zu einer Seite führt die dich zu etwas überreden will ohne das man zu dem gewünschten Ergebnis kommt. Von diesen Links gibt es in diesem Forum jede Menge
 

Trjavnamen

Bekanntes Mitglied
Hallo @Der Wissende wenn ich auf das Schraubenschlüssel Symbol klicke verändert sich das Fenster(Firevox)und wenn ich auf den Nicht Richttext unten links drücke erscheint mein erstes Eingabefenster wieder . In beiden Fenstern eingefügter Text sieht bei mir gleich aus. Wie mache ich dieses Code/quelltextgeschichte nun
 

JStein52

Top Contributor
Nein, du klickst auf das "Einfügen"-Icon und danach auf Code ..... oder du schaust in der Signatur von @DerWissende , da steht wie du es per Hand machen kannst

Edit: wenn du es einmal über "Einfügen" (links von der Diskette) gemacht hast und dir das Ergebnis anschaust das erzeugt wurde dann wird dir auch der Rest klar.
 

Trjavnamen

Bekanntes Mitglied
In einer Objektorientierten programmierung heißt es das "Integer b12 = 5" ein statischer Wert ist der dur eine OnAktion Medthode nicht verändert werden kann(also durch das exeption OnAktion {ausfürung eines Codes innerhalb dieser klammer} im WindowsController.class keine Veränderung von b12 zulässt.
 
X

Xyz1

Gast
In einer Objektorientierten programmierung heißt es das "Integer b12 = 5" ein statischer Wert ist der dur eine OnAktion Medthode nicht verändert werden kann
Nun reiß dich mal zusammen. :D Das hat auch nüsch mit dem Thema zu tun. Das fällt eher negativ auf ! o_O

Also es kann einfacher sein, den Quelltext manuell einzufügen usw.
 

jimbo1000

Mitglied
Servus Meddl Leude,

das Programm habe ich seit einiger Zeit fertig. Daher moechte ich euch mal die genaue Aufgabenstellung zeigen und die dazu folgende Loesung. Vllt hat ihrgendwann ihrgendwo genaui das selbe Problem und findet den Beitrag:D

Los gehts mit der Aufgabenstellung:

"In einem mittelalterlichen Königreich soll das Finanz- und Steuerwesen auf EDV umgestellt werden. Die verschiedenen Bevölkerungsgruppen werden durch die folgende Klassenhierarchie modelliert. Dabei gibt die Objektvariable einkommen das tatsächliche Jahreseinkommen des Einwohners in Talern an.

//Klassenhierarchie nach Hierachie lautet nach Bild(Nicht im Internet)(Attribute und Zugriffsmodifikatoren in Klammer Entschuldigt^^)
Einwohner(+ einkommen : int)

diese Klasse vererbt an folgende Klassen: Koenig, Adel,Bauer

Bauer vererbt dann nochmahl an Klasse Leibeigener."

weiter AufgabenStellung:


"b) Programmieren Sie zunächst die Klasse Einwohner. Diese soll einen Konstruktor, der das Einkommen übergeben bekommt und einen Standardkonstruktor, der einen Einwohner mit Einkommen 0 anlegt, enthalten. Achtung: die Konstruktoren und die weiteren zu programmierenden Methoden sind nicht im Klassendiagramm oben abgebildet!
c) Bauen Sie die nun Klassenhierarchie auf. Programmieren Sie also die Klassen Koenig, Adel, Bauer und Leibeigener entsprechend der oben abgebildeten Hierarchie. Programmieren Sie in diesen Klassen dieselben Konstruktoren wie für Einwohner.
d) Entwickeln Sie die beiden Objektmethoden getZuVersteuerndesEinkommen() und getSteuer(), die für jeden Einwohner des Königreiches korrekte Werte gemäß den folgenden Vorschriften liefern sollen

a. An welcher Stelle der Klassenhierarchie sind diese Methoden idealerweise zu implementieren? Nutzen Sie die beste Stelle in Ihrer Klassenhierarchie.
b. Sofern nicht anders definiert hat jeder Einwohner sein gesamtes Jahreseinkommen zu versteuern.
c. Jeder Einwohner hat 20% seines zu versteuernden Einkommens als Steuer zu entrichten. Der Steuerbetrag wird auf ganze Taler gerundet. Die Steuer beträgt für jeden Einwohner aber mindestens 2 Taler.
d. Entwickeln Sie nun noch eine JUnit-Testklasse mit zwei Testmethoden, die die beiden Methoden getSteuer() und getZuVersteuerndesEinkommen() auf Korrektheit prüft.
Hinweise: i. Es empfiehlt sich die Nutzung von assertEquals in den beiden Testmethoden. ii. Nutzen Sie die Methode setUp() um einen Einwohner genau einmal anzulegen und dann in beiden Testmethoden zu verwenden. iii. Sie können die bereitgestellte Datei TestKoenigreich1.jar zur Überprüfung verwenden (analog zu Übungsblatt 1, Aufgabe 3). Diese implementiert die Tests, die Sie programmieren müssen.

Aufgabe 2: Fallstudie Königreich – Sonderregeln
a) Implementieren Sie die folgenden Sonderregeln an geeigneten Stellen:
a. Der König zahlt auch für sein steuerpflichtiges Einkommen keine Steuern.
b. Für Angehörige des Adels beträgt die Steuer mindestens 15 Taler.
c. Für Bauern gibt es keine speziellen Regeln.
d. Bei Leibeigenen sind 12 Taler des Jahreseinkommens steuerfrei. Bei einem Jahreseinkommen von weniger als 12 Talern werden 0 Taler versteuert.

b) Entwickeln Sie für die Sonderregeln der 4 Klassen (Koenig, Adel, Bauer, Leibeigener) jeweils JUnit-Tests zur Überprüfung der Methode getZuVersteuerndesEinkommen() in der in Aufgabe 1 programmierten Klasse TestKoenigreich (also 4 Testmethoden). Hinweise:
a. Es empfiehlt sich die Nutzung von assertEquals in den Testmethoden.
b. Nutzen Sie die Methode setUp() um jeweils einen Koenig, Adel, Bauer und Leibeigener genau einmal anzulegen und dann in beiden Testmethoden zu verwenden.
c. Sie können die bereitgestellte Datei TestKoenigreich2.jar zur Überprüfung verwenden (analog zu Übungsblatt 1, Aufgabe 3).
d. Zusätzlich können Sie zum Testen die Klasse Koenigreich nutzen. Wenn Sie diese Applikation ausführen sollte folgende Ausgabe erzeugt werden:
Koenig: Einkommen 20, zu versteuerndes Einkommen 20, Steuer 0
Adel: Einkommen 20, zu versteuerndes Einkommen 20, Steuer 15
Bauer: Einkommen 20, zu versteuerndes Einkommen 20, Steuer 4
Leibeigener: Einkommen 20, zu versteuerndes Einkommen 8, Steuer 2

Aufgabe 3: Fallstudie Königreich – Objektarray
Wir möchten nun das gesamte Königreich in einem Array in der Klasse Koenigreich speichern und uns die Summe der Steuern in diesem Königreich anzeigen lassen.
a) Erweitern Sie die Klasse Koenigreich um ein Attribut koenigreichA wie folgt: public static Einwohner[] einwohnerA; Hinweis: dies ist ein statisches Attribut. Wir werden das static-Schlüsselwort in der Vorlesung noch behandeln. Hier ist nur wichtig zu wissen, dass Sie in den statischen Methoden aus Koenigreich auf dieses Attribut wie gewohnt zugreifen können.
b) Erweitern Sie die Klasse Koenigreich um eine statische Methode koenigreichAnlegen() (ohne Rückgabewert).1 Rufen Sie diese Methode am Ende der main-Methode in Koenigreich auf.
c) Erzeugen Sie in koenigreichAnlegen() ein Array von 10 Einwohnern (nutzen Sie dabei das Attribut einwohnerA ) und befüllen Sie dieses wie folgt: a. 1 König mit einem Einkommen von 200 Talern. b. 3 Adelige mit jeweils einem Einkommen von 80 Talern. c. 4 Bauern mit jeweils einem Einkommen von 30 Talern. d. 2 Leibeigene mit jeweils einem Einkommen von 10 Talern.
d) Erweitern Sie die Klasse Koenigreich um eine statische Methode steuernImKoenigreich() (Rückgabewert int).2 Die Methode soll die Gesamtsumme der Steuern aller Einwohner aus dem Attribut-Array einwohnerA berechnen und zurückgeben. Rufen Sie diese Methode am Ende der main-Methode auf. Die Ausgabe auf der Konsole soll in folgendem Format sein: „Gesamtsumme der Steuern im Königreich: <summe>“ a. Hinweis: Sie können die bereitgestellte Datei TestKoenigreich3.jar zur Überprüfung verwenden (analog zu Übungsblatt 1, Aufgabe 3).

Aufgabe 4: Fallstudie Königreich – Casting
Wir möchten nun, dass für jeden Einwohner des Königreichs aus dem in Aufgabe 3 befüllten Array einwohnerA der jeweilige Stand (also ob er Koenig, Adel, Bauer oder Leibeigener ist) auf der Konsole ausgegeben wird. Das Besondere ist, dass bevor dies für den König geschieht, auf der Konsole „Hier kommt der König“ ausgegeben werden soll. Gehen Sie dazu wie folgt vor:
a) Erweitern Sie die Klasse Koenig um eine Methode druckDich(), die auf der Konsole ausgibt: „Hier kommt der König“.

1 Also: static void koenigreichAnlegen() { … } 2 Also: static int steuernImKoenigreich() { … }

b) Erweitern Sie die Klasse Koenigreich um eine statische Methode staendeAusgeben()(ohne Rückgabewert) und rufen Sie diese am Ende der mainMethode auf. Die Funktion soll wie oben beschrieben für jeden Einwohner aus dem Attribut-Array einwohnerA dessen Stand ausgeben. Hinweis: nutzen Sie zur Ermittlung des Stands eines Einwohners die Methoden getClass() und getSimpleName().
c) Erweitern Sie die Methode staendeAusgeben() so, dass bevor der Stand des Königs ausgegeben wird die Methode druckDich() aus der Klasse Koenig aufgerufen wird. Hinweis: Sie sollten das Schlüsselwort instanceof dazu verwenden und müssen ein Casting durchführen.

Jetzt der dazugehoerige Code:

Java:
public Adel(int einkommen){
       
       
       this.einkommen = einkommen;
       
   }
   
   public Adel(){
       
       this.einkommen = 0;
       
   }
   
   /**
    * 2b) Angehoerige des Adels zahlen mindestens 15 taler, implementierung durch ueberladen der methoden
    */
   
   public int getSteuer(){
       
       //wenn die errechneten Steuern kleiner als 15 der gesamten steuern sind wird der wert auf 15 gelegt
       
       if((int) (this.getZuVersteuerndesEinkommen()*0.20) <= 15) {
           
           return this.einkommen = 15;
       }
       
       //falls errechnete Steuern groesser 15 sind wird die normale berechnung verwendet fuer den steuersatz
       else{
       
       return this.einkommen = (int)(einkommen * 0.2);
       
       }
   }
}

Java:
public class Bauer extends Einwohner {
   
public Bauer(int einkommen){
       
       
       this.einkommen = einkommen;
       
   }
   
   public Bauer(){
       
       this.einkommen = 0;
   }
   
   /**
    * 2c) fuer Bauer gibt es keine Speziellen regeln
    */

}

Java:
public class Einwohner {

   public int einkommen;
   
   
   
   /**
    * b) Konstruktor der Einkommen uebergeben bekommt
    * @param einkommen
    */
   public Einwohner(int einkommen){
       
       
       this.einkommen = einkommen;
       
   }
   
    /**
     * b) Standart Kosntruktor und einwohner mit Einkommen 0 anlegen
     */
   
   public Einwohner(){
       
       this.einkommen = 0;
   }
   
   /**
    * d) Objektmethoden   
    * @return
    */
   public int getZuVersteuerndesEinkommen(){
       
       return this.einkommen;
   }
   
   public int setZuVersteuerndesEinkommen(){
       
       return this.einkommen;
   }
   
   public int getSteuer(){
       
       
       /**
        * setzte die Steuer auf 20% des einkommen
        */
       this.einkommen = (int)(einkommen * 0.2);
       
       /**
        * Steuer betraegt mindestens 2 Taler
        */
       if(this.einkommen<=2){
           this.einkommen = 2;
       }
       return this.einkommen;
   }
   
   public int setSteuer(){
       
       return this.einkommen;
   }
   
   
   
   
}

Java:
public class Koenig extends Einwohner {
   
public Koenig(int einkommen){
       
       
       this.einkommen = einkommen;
       
   }
   
   public Koenig(){
       
       this.einkommen = 0;
   }
   
   /**
    * 2a) Koenig zahlt auf sein Einkommen keine Steuer
    */
   public int getSteuer(){
       
       return this.einkommen = 0;
   }
   
   /**
    * 4a)Erweitern der der klasse koenig mit druckdich()
    */
   public void druckDich(){
       System.out.println("Hier kommt der Koenig!");
   }

}

Java:
public class Koenigreich {
   
   /**
    * 3a)Erweitern der Klassse um Attribut
    */
   public static Einwohner[]einwohnerA;
   
   /**
    * 3b) Erweitern der Klasse
    */
   public static void koenigreichAnlegen(){
       
       /**
        * 3c) Array mit große 10 anlegen und befuellen
        */
       einwohnerA = new Einwohner[10];   
       //befuellen
       einwohnerA[0] = new Koenig(200);
       einwohnerA[1] = new Adel(80);
       einwohnerA[2] = new Adel(80);
       einwohnerA[3] = new Adel(80);
       einwohnerA[4] = new Bauer(30);
       einwohnerA[5] = new Bauer(30);
       einwohnerA[6] = new Bauer(30);
       einwohnerA[7] = new Bauer(30);
       einwohnerA[8] = new Leibeigener(10);
       einwohnerA[9] = new Leibeigener(10);
               
   }//void koenigreichAnlegen()
   
   /**
    * 3d)Erweitern der Klasse Koenigreich um eine statische methode zur ausgabe der gesamtsumme mit hilfe von 3c
    * @return
    */
   public static int steuernImKoenigreich(){
       
       int gSteuern = 0;//hilfsvariable
       
       //Sumierung beim durchlaufen des array einwohnerA
       for(int i = 0; i < einwohnerA.length;i++){
           gSteuern += einwohnerA[i].getSteuer();
       }//for
       
       
       return gSteuern;
   }//static int steuernImKoenigreich()
   
   /**
    * 4b)Erweitern der Klasse Koenigreich um staische methode ohne rueckgabewert, ermittelt stand
    */
   public static void staendeAusgeben(){
       for(int i = 0; i< einwohnerA.length;i++){
           if(einwohnerA[i] instanceof Koenig){
               Koenig koenig = (Koenig) einwohnerA[i];
               //4c) druckdich() Koenig
               koenig.druckDich();
           }//if
               System.out.println(einwohnerA[i].getClass().getSimpleName());
       }//for
   }//void staendeAusgeben()
   
   /**
    * Legt vier Einwohner unterschiedlichen Standes mit jeweils
    * 20 Talern Einkommen an.
    * @param args
    */
   public static void main(String[] args) {
       steuerbescheid(new Koenig(20));
       steuerbescheid(new Adel(20));
       steuerbescheid(new Bauer(20));
       steuerbescheid(new Leibeigener(20));
       //3c)
       koenigreichAnlegen();
       
       //3d)
       System.out.println("Gesamtsumme der Steuern im Koenigreich:<" + steuernImKoenigreich()+">");
       //4b
       staendeAusgeben();
           
   }//main

   /**
    * Gibt das zu versteuernde Einkommen f�r einen Einwohner aus
    * @param einwohner Der Einwohner
    * @param einkommen Das Jahreseinkommen des Einwohners
    */
   static void steuerbescheid(Einwohner einwohner){
               
       System.out.println(einwohner.getClass().getSimpleName() +
               ": Einkommen " + einwohner.einkommen +
               ", zu versteuerndes Einkommen " + einwohner.getZuVersteuerndesEinkommen() +
               ", Steuer " + einwohner.getSteuer());
       
   }//static void steuerbescheid(Einwohner einwohner)
}//class Koenigreich


Java:
public class Leibeigener extends Bauer {
   
public Leibeigener(int einkommen){
       
       
       this.einkommen = einkommen;
       
   }
   
   public Leibeigener(){
       
       this.einkommen = 0;
   }
   

   /**
    * 2d) implementierung der Regel durch ueberladen der methode
    */
   public int getZuVersteuerndesEinkommen(){
       
       //Sonderregel 12 taler des gesamten einkommen sind steuerfrei
       if(this.einkommen>12){
           
           return this.einkommen -12;
       }
       //Sonderregel wenn einkommen kleiner 12 wird keine steuer erhoben
       if(this.einkommen<=12){
           
           return this.einkommen = 0;
       }
       return this.einkommen;
   }
   /**
    * Steuer nach abzug der ersten regel, aufrunden von 1.6 und cast fuer verwendetes vorgehen(Math.ceil/double)
    */
   public int getSteuer(){
       
       return (int)Math.ceil(this.getZuVersteuerndesEinkommen()*0.20);
       
       
   }
}

Java:
import junit.framework.TestCase;

public class TestKoenigreich extends TestCase {
   
   Einwohner einwohner1, einwohner2,einwohner3,einwohner4,einwohner5;
   
   public void setUp(){
       
       einwohner1 = new Einwohner(20);   
       einwohner2 = new Koenig(20);
       einwohner3 = new Adel(20);
       einwohner4 = new Bauer(20);
       einwohner5 = new Leibeigener(20);
       
   }
   
   public void testGetSteuer(){
       
       assertEquals(einwohner1.getSteuer(),4);
       
   }
   
   public void testGetzuVersteuerndesEinkommen(){
       
       assertEquals(einwohner1.getZuVersteuerndesEinkommen(),20);
   
       
   }
   

   
   public void testGetSteuerKoenig(){
   
       assertEquals(einwohner2.getSteuer(),0);
           
           
       }
       
   
   //public void testGetSteuerAdel(){
       
   //   assertEquals(einwohner3.getZuVersteuerndesEinkommen(),15);
   //}
   
   public void testGetSteuerBauer(){
       
       assertEquals(einwohner4.getSteuer(),4);
   }
   
   //public void testGetSteuerLeibeigener(){
       
   //   assertEquals(einwohner5.getSteuer(),2);
       
       
     // }
   
   /**
    * Sonderregeln
    */
   
   public void testGetZuVersteuerndesIenkommenSonderKoenig(){
       
       assertEquals(einwohner2.getZuVersteuerndesEinkommen(), 20);
   }
   
    public void testGetZuVersteuerndesIenkommenSonderAdel(){
       
       assertEquals(einwohner3.getZuVersteuerndesEinkommen(), 20);
   }
   
    public void testGetZuVersteuerndesIenkommenSonderBauer(){
       
       assertEquals(einwohner4.getZuVersteuerndesEinkommen(), 20);
   }
   
    public void testGetZuVersteuerndesIenkommenSonderLeibeigener(){
       
       assertEquals(einwohner5.getZuVersteuerndesEinkommen(), 8);
   }
   }

Ueber Optimierungsvorschlage wuerde ich mich freuen. Eine Frage habe ich noch:

Java:
public static void koenigreichAnlegen(){
       
       /**
        * 3c) Array mit große 10 anlegen und befuellen
        */
       Einwohner[] einwohnerA = new Einwohner[9];   
       //befuellen
       einwohnerA[0] = new Koenig(200);
       einwohnerA[1] = new Adel(80);
       einwohnerA[2] = new Adel(80);
       einwohnerA[3] = new Adel(80);
       einwohnerA[4] = new Bauer(30);
       einwohnerA[5] = new Bauer(30);
       einwohnerA[6] = new Bauer(30);
       einwohnerA[7] = new Bauer(30);
       einwohnerA[8] = new Leibeigener(10);
       einwohnerA[9] = new Leibeigener(10);
               
   }//void koenigreichAnlegen()

Fehlerausgabe:

Java:
Koenig: Einkommen 20, zu versteuerndes Einkommen 20, Steuer 0
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
Adel: Einkommen 20, zu versteuerndes Einkommen 20, Steuer 15
Bauer: Einkommen 20, zu versteuerndes Einkommen 20, Steuer 4
Leibeigener: Einkommen 20, zu versteuerndes Einkommen 8, Steuer 2
   at de.hs_lu.o2s.ueb.ue3.mittelalter.Koenigreich.koenigreichAnlegen(Koenigreich.java:29)
   at de.hs_lu.o2s.ueb.ue3.mittelalter.Koenigreich.main(Koenigreich.java:75)

Warum bekomme ich diesen Fehler? Die Meldung erscheint mir nicht ganz schluessig...
 

temi

Top Contributor
Java:
/**
         * 3c) Array mit große 10 anlegen und befuellen
         */
        Einwohner[] einwohnerA = new Einwohner[9];
Hat dieses Array wirklich 10 Elemente?
 

jimbo1000

Mitglied
wieso? 0-9 = 10 und ich versuche 10 elemente zu benutzen also befuelle ich ihn mit 10 elementen dafuer muss er ja nicht "10" also 11 groß sein sondern halt nur 10 also 9...
 

Javinner

Top Contributor
@jimbo1000
Ich hätte die Klasse Einwohner als abstrakt deklariert.
In dieser hätte ich ebenso alle Infos bezüglich der Steuer- bzw. Einkommen als Klassenvariablen abgelegt. Das hätte den Vorteil, dass alles nur an einer Stelle hätte geändert werden müssen, für den Fall. Zudem deklarierst du in jeder Klasse ein Konstruktor. Bei einer abstrakten Klasse würde dies entfallen und nur ein Konstruktor für alle gelten. Die Sichtbarkeit der Variablen ist oft unnötig. (Aber ich denke, dass kommt noch im weiteren Verlauf des Studiums).

Java:
package koenigreich;

abstract class Einwohner
{

    final static double ALLGEMEIN_STEUER = 0.20;
    final static int MINDEST_STEUER_ALLE = 2;
    final static int MINDEST_STEUER_ADEL = 15;
    final static int STEUERFREI_LEIBEIGENE = 12;
    private double einkommen;

    Einwohner(double einkommen)
    {
        this.einkommen = einkommen;
    }

    protected double getEinkommen()
    {
        return this.einkommen;
    }

    protected void setEinkommen(double summe)
    {
        this.einkommen = summe;
    }

    protected void addToEinkommen(double summe)
    {
        this.einkommen += summe;
    }

    protected void removeFromEinkommen(double summe)
    {
        this.einkommen -= summe;
    }

    protected abstract double getSteuer();

    protected abstract double getZuVersteuerndesEinkommen();

}
Java:
package koenigreich;

class Adel extends Einwohner
{

    Adel(double einkommen)
    {
        super(einkommen);
    }

    @Override
    protected double getEinkommen()
    {
        return super.getEinkommen();
    }

    @Override
    protected void setEinkommen(double summe)
    {
        super.setEinkommen(summe);
    }

    @Override
    protected void addToEinkommen(double summe)
    {
        super.addToEinkommen(summe);
    }

    @Override
    protected void removeFromEinkommen(double summe)
    {
        super.removeFromEinkommen(summe);
    }

    @Override
    protected double getSteuer()
    {
        if ((this.getEinkommen() * Einwohner.ALLGEMEIN_STEUER) < Einwohner.MINDEST_STEUER_ADEL) {
            return Einwohner.MINDEST_STEUER_ADEL;
        } else {
            return (this.getEinkommen() * Einwohner.ALLGEMEIN_STEUER);
        }
    }

    @Override
    protected double getZuVersteuerndesEinkommen()
    {
        return this.getEinkommen();
    }

}
Java:
protected void koenigreichAnlegen()
    {
        einwohners[0] = new Koenig(200);
        einwohners[1] = new Adel(80);
        einwohners[2] = new Adel(80);
        einwohners[3] = new Adel(80);
        einwohners[4] = new Bauer(30);
        einwohners[5] = new Bauer(30);
        einwohners[6] = new Bauer(30);
        einwohners[7] = new Bauer(30);
        einwohners[8] = new Leibeigener(10);
        einwohners[9] = new Leibeigener(10);
    }
/** Steuer: 72.0 */
 
X

Xyz1

Gast
@jimbo1000 :
weiter AufgabenStellung:
Wie viel Zeit hast du eigentlich für diese Aufgaben? Das lesen würd bei mir schon lange dauern. Schreibe doch mal etwas, woher diese Aufgaben stammen.

Wenn man Listen Container nimmt erübrigt sich das mit der länge. Zuvor sollte man aber Arrays verstanden haben.

Die Länge ist die Anzahl der Elemente der Folge/Sequenz (a_i)_i=0,...,n = n+1.
CodeCogsEqn.gif
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N OOP Zugriff auf eine Objekt innerhalb einer Klasse aus statischen Methoden Java Basics - Anfänger-Themen 9
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
L Methoden Zugriff <identifier> expected Java Basics - Anfänger-Themen 13
R Methoden Methode der GUI-Klasse Zugriff auf Methoden der Hauptklasse Java Basics - Anfänger-Themen 9
Z Zugriff auf andere Methoden Java Basics - Anfänger-Themen 12
B Vererbung Probleme bei Zugriff auf protected-Methoden in einer Unterklasse Java Basics - Anfänger-Themen 27
J In actionPerformed Zugriff auf öffentlich Methoden der Klasse Java Basics - Anfänger-Themen 4
S Zugriff auf Klasse/Methoden außerhalb eines Projektordners einschränken Java Basics - Anfänger-Themen 5
P Zugriff auf methoden Java Basics - Anfänger-Themen 5
T Vererbung und Zugriff auf Methoden von abgeleiteten Klassen Java Basics - Anfänger-Themen 2
I Bm3nrc - Zugriff auf Methoden in Subklasse Java Basics - Anfänger-Themen 6
M OOP Synchronized Methoden, zugriff aus Threads Java Basics - Anfänger-Themen 4
M Zugriff auf Attribute über Methoden Java Basics - Anfänger-Themen 6
G Zugriff auf Methoden, wenn man nur "Object" hat? Java Basics - Anfänger-Themen 3
X Zugriff auf Klassenvariablen NUR mit get/set Methoden? Java Basics - Anfänger-Themen 8
G Zugriff auf Methoden in der Eltern Klasse Java Basics - Anfänger-Themen 3
M Zugriff auf Klassen/Methoden im Hauptverzeichnis Java Basics - Anfänger-Themen 2
emreiu Methoden Rekursive Methoden Runter- & Hochzählen Java Basics - Anfänger-Themen 2
U Funktionale Interfaces mit mehreren abstrakten Methoden? Java Basics - Anfänger-Themen 8
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
J Argumente in Methoden übergeben Java Basics - Anfänger-Themen 1
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
Say Class scope und Instance scope und Getter nur selbstgeschrieben Methoden Java Basics - Anfänger-Themen 11
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
Renjiroo Java Bmi Rechner mit Methoden Java Basics - Anfänger-Themen 4
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
M Designentscheidung von Attributen/Methoden im Falle von Vererbung Java Basics - Anfänger-Themen 8
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
Alen123 Erstes Arbeiten mit Methoden. Java Basics - Anfänger-Themen 5
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Gerade oder ungerade Zahl mittels Methoden Java Basics - Anfänger-Themen 13
M Erklärung von Ausnahmebehandlung in Methoden Java Basics - Anfänger-Themen 13
S Methoden 2 non-static Methoden, trotzdem Fehler "non static method can not be referenced from a static context" Java Basics - Anfänger-Themen 9
L Rekursive Methoden Java Basics - Anfänger-Themen 14
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
W Verschiedene Methoden in einer Klasse in der Main aufrufen? Java Basics - Anfänger-Themen 8
W Methoden aufrufen - auch klassenübergreifend? Java Basics - Anfänger-Themen 9
Kotelettklopfer Methoden nicht aufrufbar Java Basics - Anfänger-Themen 34
R Schulaufgabe, Bruache Hilfe mit non-static Methoden Java Basics - Anfänger-Themen 2
S Vererbung Abstrakte Methoden: Wozu das Ganze?! Java Basics - Anfänger-Themen 7
S abstrakte methoden in subclass? Java Basics - Anfänger-Themen 7
S Methoden - Warum int wenn auch void? Java Basics - Anfänger-Themen 3
H Kann man Methoden öfter aufrufen? Java Basics - Anfänger-Themen 2
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
M Aufruf von statischen Methoden einer anderen Klasse Java Basics - Anfänger-Themen 15
lougoldi Verkettung von Methoden und Konstruktoren Java Basics - Anfänger-Themen 4
Zeppi OOP Methoden mit einander Verknüpfen Java Basics - Anfänger-Themen 6
A Löschen von Leerzeichen in einem char array ohne methoden Java Basics - Anfänger-Themen 6
A Parametar übergabe zwischen Methoden Java Basics - Anfänger-Themen 26
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
O Attribute die Methoden zählen Java Basics - Anfänger-Themen 5
M Bräuchte Hilfe bei diesen Methoden Java Basics - Anfänger-Themen 4
G Methoden Methoden mit versch. Datentypen Java Basics - Anfänger-Themen 1
T Ich habe eine Variabel die nicht Methoden übergreifend ist. Kann mir jemand Helfen :) Java Basics - Anfänger-Themen 5
Junger_Basileus Celsius -> Fahrenheit / Strukturierung in statischen Methoden Java Basics - Anfänger-Themen 7
J Verschachtelte Methoden Java Basics - Anfänger-Themen 9
H Methoden in anderen Methoden aufrufen Java Basics - Anfänger-Themen 6
Kawastori Hilfe bei Methoden Übung Java Basics - Anfänger-Themen 6
veryck Methoden Rekursive Methoden mit Rückgabeparameter Java Basics - Anfänger-Themen 9
C Methoden können nicht auf Instanzvariable der Klasse zugreifen Java Basics - Anfänger-Themen 3
P Methoden aufrufen - Fehler Java Basics - Anfänger-Themen 20
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
C eigene Methoden erstellen (Instanzmethoden) Java Basics - Anfänger-Themen 7
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
C Taschenrechner (switch) in Taschenrechner mit Methoden umwandeln Java Basics - Anfänger-Themen 115
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Generics Methoden Java Basics - Anfänger-Themen 7
L Test-Methoden schreiben Java Basics - Anfänger-Themen 13
S throws bei Methoden Java Basics - Anfänger-Themen 4
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
I Greedy Methode Methoden nutzen Java Basics - Anfänger-Themen 3
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
S Übergabe von Arrays an Methoden Java Basics - Anfänger-Themen 20
L Methoden Wie Löse ich ext Methoden Aufruf Fehler? Java Basics - Anfänger-Themen 3
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
B Methoden Ausgeben Aufgabe Java Basics - Anfänger-Themen 15
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
T Methoden Verständnis Java Basics - Anfänger-Themen 14
M Feste Reihenfolge von dem Ablauf von Methoden Java Basics - Anfänger-Themen 7
G Java Abstrakte Methoden Java Basics - Anfänger-Themen 2
N Klassen Warum kann meine Klasse nicht auf Methoden der anderen Klasse zugreifen? Java Basics - Anfänger-Themen 6
Ich lerne Java. Methoden Mehrere Methoden mit Punkt Java Basics - Anfänger-Themen 45
Kirby.exe Methoden Aufrufe Java Basics - Anfänger-Themen 4
G Objekte in Methoden? Java Basics - Anfänger-Themen 13
W OOP Warenlager mit Array(Konstruktor, Methoden) Java Basics - Anfänger-Themen 39
B Variablen von Methoden übertragen Java Basics - Anfänger-Themen 2
M Unterklasse soll nicht alle Methoden erben Java Basics - Anfänger-Themen 3
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
H Aufruf von Methoden durch Methoden Java Basics - Anfänger-Themen 3
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben