# get methoden zugriff und objekt erzeugung



## jimbo1000 (23. Okt 2017)

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:

```
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;
   }
 

}
```


```
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);
   }
}
```
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:

```
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());
   }
}
```


----------



## Xyz1 (23. Okt 2017)

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 (23. Okt 2017)

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 (23. Okt 2017)

```
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 (23. Okt 2017)

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 (23. Okt 2017)

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 (23. Okt 2017)

@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 (23. Okt 2017)

@AndiE ...ja das habe ich mich auch gefragt 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 (23. Okt 2017)

jimbo1000 hat gesagt.:


> und einen Standartkonstruktor, der einen Einwohner mit Einkommen 0 anlegt, enthalten


Das heisst aber nur dass du das einkommen auf 0.0 setzt. Fertig ! Und zwar in Einwohner. Und get und set für Einkommen musst du dann nur in der Klasse Einwohner implementieren. Die anderen Klassen erben dies ja, müssen es also nicht selber implementieren


----------



## JStein52 (23. Okt 2017)

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.


----------



## Xyz1 (23. Okt 2017)

@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?


----------



## JStein52 (23. Okt 2017)

DerWissende hat gesagt.:


> mit Oberklassen geht üblicherweise abstrakte Methoden einher.


Warum ? Im vorliegenden Fall nicht bzw. je nachdem wie die fällige Steuer berechnet werden soll. Wenn sich das nur nach der Höhe des Einkommens richtet kann man es in der Klasse Einwohner implementieren. Oder zahlt Koenig vielleicht gar keine Steuer ? Man weiss es nicht.


----------



## Trjavnamen (24. Okt 2017)

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.


----------



## VfL_Freak (24. Okt 2017)

Moin,


Trjavnamen hat gesagt.:


> Integer k = 10000" ist eine statische Konstruktion d.h. der Wert ist nicht veränderbar


Warum sollte hier 'k' nicht veränderbar sein ??
VG Klaus


----------



## Xyz1 (24. Okt 2017)

@jimbo1000 @Trjavnamen und @VfL_Freak , die Variable 'k = 10000' kommt hier gar nicht vor, auch nach einer Buchempfehlung wurde nicht gefragt. Ich denke das ist eindeutig Spam. @VfL_Freak hätte das erkennen können.


----------



## VfL_Freak (24. Okt 2017)

Moin,


DerWissende hat gesagt.:


> Ich denke das ist eindeutig Spam. @VfL_Freak hätte das erkennen können.


ok, hast vermutlich Recht!
Ich muss zu meiner Schande gestehen, das ganze nur überflogen zu haben ...
Na ja, vlt. meldet sich der TO ja noch wieder ...

VG Klaus


----------



## Trjavnamen (24. Okt 2017)

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


----------



## JStein52 (24. Okt 2017)

Spam ist auch wenn du in einem Thread etwas völlig sinnloses postest. Vielleicht schaust du dir mal das Thema an ...


----------



## Xyz1 (24. Okt 2017)

Trjavnamen hat gesagt.:


> 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.


Das wäre Hijackspam, Phishing oder Spoofing.
Wenn etwas gar nicht zu einem Thema 'passt', dann ists einfach Spam.


----------



## Trjavnamen (25. Okt 2017)

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 (25. Okt 2017)

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 (25. Okt 2017)

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.


----------



## JStein52 (25. Okt 2017)

Hääh ..... ich glaube Schrödinger spinnt. Was soll denn die WindowsController.class sein ? Aber was richtig ist ist das da:
https://stackoverflow.com/questions/5560176/is-integer-immutable


----------



## Xyz1 (26. Okt 2017)

Trjavnamen hat gesagt.:


> 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.  Das hat auch nüsch mit dem Thema zu tun. Das fällt eher negativ auf ! 

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


----------



## jimbo1000 (3. Nov 2017)

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

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:


```
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);
       
       }
   }
}
```


```
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
    */

}
```


```
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;
   }
   
   
   
   
}
```


```
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!");
   }

}
```


```
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
```



```
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);
       
       
   }
}
```


```
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:


```
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:


```
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...


----------



## Meniskusschaden (3. Nov 2017)

Dein Array `einwohnerA` hat nur Platz für neun Elemente, du versuchst aber, zehn Elemente zu benutzen.


----------



## temi (3. Nov 2017)

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


----------



## jimbo1000 (4. Nov 2017)

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 (4. Nov 2017)

@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).



Spoiler: Klasse Einwohner





```
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();

}
```






Spoiler: Klasse Adel





```
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();
    }

}
```






Spoiler: Konsolenausgabe





```
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 */
```


----------



## JStein52 (4. Nov 2017)

temi hat gesagt.:


> Einwohner[] einwohnerA = *new* Einwohner[9];


Die Zahl in den eckigen Klammern gibt die Länge des Arrays an, hier also 0...8 = 9 !!


----------



## Xyz1 (4. Nov 2017)

@jimbo1000 :


jimbo1000 hat gesagt.:


> 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.


----------

