# Objekte in Array ablegen - Vererbung



## reichi (2. Jan 2010)

Hi, 

bin derzeit dabei mich für die Klausur im ersten Semster vorzubereiten und habe bei folgender Übungsaufgabe ein kleines Problem. 
Man soll zwei Klassen entwerfen, Konto und Sparkonto, wobei Sparkonto die Subklasse von Konto ist. In der Klasse Sparkonto soll man eine Main-Methode schreiben, bei der in ein Array von beiden Klassen jeweils ein Objekt erstellt wird. Vererbung funktioniert wunderbar, will ich jedoch die zustätzliche Methode von Sparkonto über das Array aufrufen



> k[1].setHabenzinssatz();



kennt er mir diese nicht.


```
class Konto
{

 protected int Kontonummer;
 protected int Kontostand;

 public Konto()
 {
 }

 public void setKontonummer()
 {
 this.Kontonummer = StdInput.readInt("Kontonummer eingeben");
 }
 public void Einzahlung()
 {
 this.Kontostand = this.Kontostand + StdInput.readInt("Betrag zur Einzahlung eingeben");
 }
 public void printKonto()
 {
 System.out.println("Kontonummer: "+Kontonummer);
 System.out.println("Kontostand: "+Kontostand);

 }

}

public class Sparkonto extends Konto
{

 private int Habenzinssatz;

 public Sparkonto (int hzs)

 {
	 this.Habenzinssatz = hzs;

 }

 public void printKonto()
  {
   super.printKonto();
  System.out.println("HZS: "+Habenzinssatz);

  }
  public void setHabenzinssatz()
  {
  this.Habenzinssatz = StdInput.readInt("HZS eingeben");
  }


 public static void main(String [] args)
 {

Konto [] k = new Konto [2];
 k [0] = new Konto();
 k [1] = new Sparkonto(0);
/*
 Sparkonto sk = new Sparkonto();
 sk.setHabenzinssatz();
 sk.printKonto();
*/

 for(int i=0; i<k.length; i++)
 {
  k[i].setKontonummer();
  k[i].Einzahlung();
 }

k[1].setHabenzinssatz();

 for(int i=0; i<k.length; i++)
 {
  k[i].printKonto();

 }


 }




}
```


Ich vermute, dass ich bei der Initialisierung der Objekte im Array irgendetwas falsch mache. 
Wäre für jegliche Hilfe dankbar. 

Martin

Hier noch zusätzlich die Klasse StdInput die wir für den Input verwenden. 
Dürfte aber nicht die Ursache des Problems sein. 


```
// package util;

import java.io.*;

public class StdInput
{
	 public static char readChar() ////////////////////////////////////////////////
	 {
	  BufferedReader br;
	  String inputString;
	  char value = 0;

	  br = new BufferedReader(new InputStreamReader(System.in));

	  try
	  {
	   inputString = br.readLine();
	   value = inputString.charAt(0);
	  }
	  catch(IOException _uh)
	  {
	   System.out.println("Lesefehler !");
	  }
	  catch(NumberFormatException ex)
	  {
	    System.out.println("Sie haben keinen int-Wert eingegeben !");
	  }
	  return value;
	 }

	 public static char readChar(String value)////////////////////////////////////
	 {
	  System.out.println(value);
	  return readChar();
	 }
 public static double readDouble() ///////////////////////////////////////////////
 {
  BufferedReader br;
  String inputString;
  double value = 0.0;

  br = new BufferedReader(new InputStreamReader(System.in));

  try
  {
   inputString = br.readLine();
   value = Double.parseDouble(inputString);
  }
  catch(IOException _uh)
  {
   System.out.println("Lesefehler !");
  }
  catch(NumberFormatException ex)
  {
    System.out.println("Sie haben keinen double-Wert eingegeben !");
  }
  return value;
 }

 public static double readDouble(String value) ////////////////////////////////////
 {
  System.out.println(value);
  return readDouble();
 }

 public static int readInt() //////////////////////////////////////////////////////
 {
  BufferedReader br;
  String inputString;
  int value = 0;

  br = new BufferedReader(new InputStreamReader(System.in));

  try
  {
   inputString = br.readLine();
   value = Integer.parseInt(inputString);
  }
  catch(IOException _uh)
  {
   System.out.println("Lesefehler !");
  }
  catch(NumberFormatException ex)
  {
    System.out.println("Sie haben keinen int-Wert eingegeben !");
  }
  return value;
 }

 public static int readInt(String value) //////////////////////////////////////////
 {
  System.out.println(value);
  return readInt();
 }

 public static String readString() /////////////////////////////////////////////////
 {
  BufferedReader br;
  String inputString = "";

  br = new BufferedReader(new InputStreamReader(System.in));

  try
  {
   inputString = br.readLine();
  }
  catch(IOException _uh)
  {
   System.out.println("Lesefehler !");
  }
  return inputString;
 }

 public static String readString(String value) /////////////////////////////////////
 {
  System.out.println(value);
  return readString();
 }
}
```


----------



## sambalmueslie (2. Jan 2010)

ja weil "habezinssatz" eine Eigenschaft von Sparkonto ist, aber du ein "Konto"-Array hast.

Du musst also entweder überprüfen und casten,
oder dir was anderes schlaues einfallen lassen  Interface z.b.  

btw.


```
for(int i=0; i<k.length; i++)
 {
  k[i].setKontonummer();
  k[i].Einzahlung();
 }
```

sieht so viel schöner aus (finde ich)

```
Konto [] konten = new Konto [2];


for(Konto k : konten){
k.setKontonummer();
k.Einzahlung();
}
```

und wenn du dann Methoden noch am Anfang klein schreibst, dann sieht es noch schöner aus  

Gruß Oli


----------



## javimka (2. Jan 2010)

Die Elemente deines Arrays sind von der Klasse Konto. Die Klasse Konto verfügt über keine Methode setHabenzinssatz(). Wenn du wisst, dass ein Element von der Klasse Sparkonto ist und du diese Methode aufrufen willst, musst du es zuerst in ein Sparkonto konvertieren: [c]((Sparkonto) k[1]).setHabenzins();[/c]


----------



## eRaaaa (2. Jan 2010)

==>


```
for (Konto konto : k) {
	    konto.setKontonummer();
	    konto.Einzahlung();
	    if (konto instanceof Sparkonto) {
		((Sparkonto)konto).setHabenzinssatz();
	    }
	}
```

/edit: ich lahme ente ;(


----------



## faetzminator (2. Jan 2010)

Es wär wohl schöner wenn du eine Methode überschreiben würdest. musst zu z.B. nach jeder [c]einzahlung()[/c] [c]setHabenZinssatz()[/c] aufrufen solltest, solltest du das so machen:

```
@Override
public void einzahlung() {
    super.einzahlung();
    setHabenZinssatz();
}
```
Gross- und Kleinschreibung angepasst


----------



## reichi (2. Jan 2010)

hey, danke für die schnelle Antwort und die Tipps am Rande. Das for-Schleifen Konstrukt war mir bis heute noch unbekannt... 


```
for(Konto k : konten)
{...}
```


----------

