# Objectorientierung, Array und Vererbung



## Windows10 (21. Mai 2016)

Ich schicke euch jetzt die Fehlermeldung und die Klassen die ihr braucht, denn ich finde leider meinen Fehler nicht!!

Fehlercode in der Firmen-Klasse bei folgendem Code-Teil: Code:
	
	
	
	





```
Out.println(arr[i]=a.print);
```
 Fehlermeldung bei diesem Code: cannot find Symbol-variable print

Sonstige benötigte Hinweise zur Fehlerfindung:


```
public class Arbeiter extends Mitarbeiter
{
    double fixum;
    double stunden;
    double lohnProStunde;
    String firma;
    String status;
    public Arbeiter(String vvname, String nname, int personalnummer, double fixum, double stunden, double lohnProStunde, String firma, String status)
    {
        super(vvname,nname,personalnummer);
        this.fixum=fixum;
        this.stunden=stunden;
        this.lohnProStunde=lohnProStunde;
        this.firma=firma;
        this.status=status;
    }
public void print()
    {
        super.print();
        double gehalt=getMonatslohn();
        Out.println("Monatslohn: "+ gehalt);
        Out.println("Firma: " + firma);
        Out.println("Status: " + status);
    }
```


```
public Mitarbeiter[] personenEinstellen(String vvname, String nname, int personalnummer, double fixum, double praemie, double stunden, double lohnProStunde, String firma, String status)
    {
        Out.println("Wie lange soll das Array sein? Zahl über 5 und unter 10!!");
        int size=In.readInt();
        Mitarbeiter[] arr=new Mitarbeiter[size];
        for (int i=0;i<arr.length;i++)
        {
            Mitarbeiter a=new Arbeiter(vvname,nname,personalnummer,fixum,stunden,lohnProStunde,firma,status);
            if(a instanceof Arbeiter)
            {
                Out.println(arr[i]=a.print);
            }
        }
        return arr;
```
Nur als Hinweis: Es sind nicht die kompletten Klassen, nur die Methoden, die vielleicht zur Fehlerbehebung helfen können!!

Wenn euch noch was abgeht, bitte meldet euch mit euren Fragen!!

Danke!!


----------



## Cromewell (21. Mai 2016)

Windows10 hat gesagt.:


> Out.println(arr[i]=a.print);


Was genau willst du da machen ?


----------



## Windows10 (21. Mai 2016)

Cromewell hat gesagt.:


> Was genau willst du da machen ?


Was in der Methode bei 
	
	
	
	





```
print()
```
in der Arbeiter-Klasse steht in das Array schreiben!! 
	
	
	
	





```
Mitarbeiter a=new Arbeiter(vvname,nname,personalnummer,fixum,stunden,lohnProStunde,firma,status);
```
hab ich ja eine Arbeiterobjekt mit dem Namen a angele!! Von diesem Objekt will ich jetzt die 
	
	
	
	





```
print()
```
-Methode von der Klasse Arbeiter in das Array an die Stelle i schreiben, aber es erzeugt ja den Fehler 
cannot find Symbol-variable print!!


----------



## Cromewell (21. Mai 2016)

Ich würde in das Array nur die Arbeiter packen:


Windows10 hat gesagt.:


> arr[i]=a


Wofür brauchst du die Informationen dadrinne ? Kannst du ja auch nachher in einer for Schleife für jeden Arbeiten ausgeben
for(...;...;...){
   Out.println(arr[i].print);
}


----------



## Windows10 (21. Mai 2016)

Cromewell hat gesagt.:


> Ich würde in das Array nur die Arbeiter packen:
> 
> Wofür brauchst du die Informationen dadrinne ? Kannst du ja auch nachher in einer for Schleife für jeden Arbeiten ausgeben
> for(...;...;...){
> ...


So wie ich es mache ist es aber Teil der Aufgabe, man muss das Array mit den Arbeitern befüllen und dann zurückgeben!!


----------



## Cromewell (21. Mai 2016)

Aber mit 
	
	
	
	





```
arr[i] = a;
```
 befüllst du es doch mit Arbeitern ?


----------



## mrBrown (21. Mai 2016)

Für einen Methodenaufruf müssen Klammern hinterm Namen stehen, also `arr=a.print()`

Edit:
Das `a instanceof Arbeiter` kannst du dir sparen, jeder Mitarbeiter ist zwingend ein Arbeiter. Wäre es nicht so, wäre der Methodenaufruf nicht so  möglich, und es gäbe schon einen Fehler zur Compilezeit.
instanceof braucht man hauptsächlich zum casten - da kann man zur Compilerzeit nicht immer wissen, welchen Types es ist.


----------



## Cromewell (21. Mai 2016)

mrBrown hat gesagt.:


> Für einen Methodenaufruf müssen Klammern hinterm Namen stehen, also arr=a.print()


Es ist aber eine void Methode. Macht also keinen Unterschied


----------



## mrBrown (21. Mai 2016)

Cromewell hat gesagt.:


> Es ist aber eine void Methode. Macht also keinen Unterschied


Doch, zumindest in Java.


----------



## Windows10 (21. Mai 2016)

Cromewell hat gesagt.:


> Aber mit
> 
> 
> 
> ...


Wenn ich es so mache steht im Array  ,es soll aber das drinnen stehen, was in der Methode print() in der Klasse  Arbeiter steht.

Folgendes sollte zum Beispiel drinnen stehen an der Arraystelle i: 
Mitarbeiter 1 : Philipp Baumgartner
Monatslohn: 1000,00
Firma: Microsoft
Status: Manager


----------



## Cromewell (21. Mai 2016)

Seit wann kann man Arrays mit Methoden füllen, die den Rückgabewert void haben ?


----------



## Cromewell (21. Mai 2016)

Windows10 hat gesagt.:


> es soll aber das drinnen stehen, was in der Methode print() in der Klasse Arbeiter steht.


Deswegen musst du es auch noch mal durch die for-Schleife jagen:

```
for(int i = 0; i< arr.length; i++){
    arr[i].print();
}
```

So erhältst du das ausgegeben, was der jeweilige Arbeiter für Werte hat.


----------



## mrBrown (21. Mai 2016)

Cromewell hat gesagt.:


> Seit wann kann man Arrays mit Methoden füllen, die den Rückgabewert void habeen ?


Garnicht, ein Methodenaufruf braucht trotzdem Klammern, auch wenn er void ist.




Windows10 hat gesagt.:


> Wenn ich es so mache steht im Array Anhang anzeigen 8903 ,es soll aber das drinnen stehen, was in der Methode print() in der Klasse  Arbeiter steht.
> 
> Folgendes sollte zum Beispiel drinnen stehen an der Arraystelle i:
> Mitarbeiter 1 : Philipp Baumgartner
> ...



Deine Methode gibt nichts zurück, es kann also auch nichts in das Array geschrieben werden.
Aktuell ist dein Array auch ein Array von Mitarbeitern, du kannst es also auch nur Mitarbeiter füllen.

Um Strings in das Array zu schreiben, müsstest du daraus ein Array von Strings machen, und die print-methode einen String zurückgeben lassen, den du in print() passend füllst.


----------



## Cromewell (21. Mai 2016)

mrBrown hat gesagt.:


> Garnicht, ein Methodenaufruf braucht trotzdem Klammern, auch wenn er void ist.


Ich glaube, du hast mich oben missverstanden ^^
Ich wollte sagen, dass es nicht wichtig ist, weil sowieso nichts reingeschrieben werden kann, da void.


----------



## Windows10 (21. Mai 2016)

Cromewell hat gesagt.:


> Ich glaube, du hast mich oben missverstanden ^^
> Ich wollte sagen, dass es nicht wichtig ist, weil sowieso nichts reingeschrieben werden kann, da void.


Danke, jetzt geht es!!


----------



## Cromewell (21. Mai 2016)

Sehr gut


----------

