# Klasse extends HashMap



## StefanG (13. Jan 2011)

Hallo,

ich möchte gerne eine Klasse programmieren die von der Klasse HashMap erbt.

D.h. wenn ich eine Instanz von "meineKlasse" erzeuge, soll das eine HashMap<String, String> sein.
Wie muss ich den Konstruktor aufbauen, damit das funktioniert?



```
public class meineklasse extends HashMap {

public meineklasse() {
 ???
}


}
```

Vielen Dank für eure Hilfe!


----------



## DerEisteeTrinker (13. Jan 2011)

Aus welchem Grund möchtest du denn von HashMap erben?


----------



## StefanG (13. Jan 2011)

In der Klasse "meineklasse" ist eine Methode "public HashMap xy" die als "return" eine hashMap zurück gibt. 

Ich möchte von meinem Hauptprogramm eine Instanz der Klasse "meineklasse" aufrufen, die Methode "public HashMap xy" ausführen, und die soll dann die HashMap füllen.


Oder habe ich micht verzettelt? Macht das so Sinn?

Ergänzung: Dann kann ich in der Hauptklasse die "meineKlasse" mit dem Rückgabewert der Methode füllen und ausgeben.


----------



## swp (13. Jan 2011)

Habe ich das richtig verstanden, dass du
- ein Objekt einer Klasse erstellen willst
- davon eine Methode aufrufen willst
- und dir die dann eine HashMap<String, String> zurück gibt
- und dann diese HashMap in eine andere Methode der MeineKlasse einsetzen?

Wieso willst du sowas machen?


----------



## maki (13. Jan 2011)

Du musst nicht von HashMap erben, wenn du eine verwenden willst, nutze ein Attribut des Typs.

Merke: Komposition ist Vererbung vorzuziehen!


----------



## Landei (13. Jan 2011)

Vererbung ist nur für "A *ist* ein B" Bezeihungen, hier wird doch aber die HashMap nur ganz normal verwendet. Von einer HashMap würde ich nur ableiten, wenn ich ihr Verhalten ändern müsste (also z.B. wenn ich alle Zugriffe loggen müsste, oder Listener benachrichtigen, wenn etwas hineinpackt wird).


----------



## StefanG (13. Jan 2011)

swp hat gesagt.:


> Habe ich das richtig verstanden, dass du
> - ein Objekt einer Klasse erstellen willst
> - davon eine Methode aufrufen willst
> - und dir die dann eine HashMap<String, String> zurück gibt
> ...



Jaein, der Rückgabewert (HashMap) der Methode setze ich mit der Instanz der UnterKlasse (ebenfalls HashMap) in der Hauptklasse gleich und arbeite dann damit weiter. Somit kann ich mir dann mehrere Instanzen der Unterklasse aufrufen...


----------



## swp (13. Jan 2011)

Mh, liest sich ziemlich unverständlich. Erkläre doch bitte mal etwas konkreter, was du genau möchtest.


----------



## StefanG (13. Jan 2011)

Stimmt, ist ein bisschen unübersichtlich.

Hauptklasse: - Unterklasse instanzUnterklasse = new Unterklasse() 
                           -> Ist eine Hashmap mit den Atrributen <String, String>

                  - instanzUnterklasse.Methode gibt als Rückgabewert eine HashMap
                            -> instanzUnterklasse = Rückgabe HashMap aus der Unterklass

Unterklasse: - Konstruktor, HashMap <String, String>
                  - verschiene Methoden mit return HashMap<String, String>


Hilft das weiter?


----------



## timbeau (13. Jan 2011)

Dazu musst du doch nicht von HashMap erben. 

Jede Klasse kann eine HashMap zurückgeben. 


```
class meineKlassse{

private HashMap<S,S> .....;

public meineKlasse{


//HashMap befüllen


}

//MEthode um die Map zu returnen

}
```


----------



## swp (13. Jan 2011)

Du möchtest unterm Strich HashMaps haben und mit denen rechnen / irgendwas anstellen, richtig?


----------



## StefanG (13. Jan 2011)

Ich brauche einfach verschiedene HashMaps in meiner Hauptklasse, da ich bei dem Methodenaufruf der Unterklasse 10 Parameter übergebe, die den Rückgabewert der Methode beeinflussen.


----------



## timbeau (13. Jan 2011)

Mir ist immernoch nicht klar warum du dafür von HM erben willst. 

Programmier die Methode doch einfach aus, dass sie mit den 10 Parametern was anfangen kann.


----------



## StefanG (13. Jan 2011)

timbeau hat gesagt.:


> Mir ist immernoch nicht klar warum du dafür von HM erben willst.
> 
> Programmier die Methode doch einfach aus, dass sie mit den 10 Parametern was anfangen kann.




Soll ich das extends HashMap einfach rausnehmen und in dem Konstruktor die neue HashMap erzeugen?

Wie würde der Konstruktor dann aussehen?


----------



## fastjack (13. Jan 2011)

Schreib Dir doch eine Helper-Klasse, z.B. MeinHashMapBefuellerXYZ mit speziellen Methoden.


----------



## Tobias (13. Jan 2011)

> Wie würde der Konstruktor dann aussehen?




```
class MeineKlasse {

    private HashMap<String, String> hashMap;

    public MeineKlasse() {
        hashMap = new HashMap<String, String>();
        hashMap.put("Hallo", "Welt");
    }

    // Getter, Setter, irgendwelche Methoden, die mit hashMap arbeiten

}
```


----------



## StefanG (14. Jan 2011)

Erstmal Danke an alle für die Unterstützung!

Bin inzwischen weg von der HashMap, denn ein StringArray[2] reicht mir als Rückgabewert auch. Ich glaube Die HashMap ist doch ein bisschen überdimensioniert.


```
import com.sun.xml.internal.fastinfoset.util.StringArray;

public class start {
	public static void main(String[] args) {

            Testklasse test = new Testklasse();      -> Soll ein StringArray[2] sein

	test = Testklasse.getResult("param1", "param2", "param3", "param4", "param5");  

            -> Methode hat als Rückgabewert ein StringArray[2], wird gleichgesetzt mit test
		
	}
}
```

Wie muss dann der Konstruktor in der Klasse Testklasse aussehen, damit eine Instanz der Testklasse ein StringArray[2] ist?


```
public class Testklasse {
	
	public StringArray[] strArray;

	public Testklasse() {
		super();
		strArray = new StringArray[2];
	}

             public StringArray[] getResult()
            {
                    Berechnung...
    
                    return this.strArray
            }
```

So habe ich es bislang aufgebaut. Doch leider ist die Instanz der Testklasse kein StringArray.


----------



## Gast2 (14. Jan 2011)

> Testklasse test = new Testklasse();      -> Soll ein StringArray[2] sein


Das macht keinen sinn, test ist vom Typ Testklasse und kein String Array. Wozu legst du hier na instanz an wenn du die später nichtmehr verwenden willst?



> test = Testklasse.getResult("param1", "param2", "param3", "param4", "param5");


Und somit geht das auch nicht. getResult liefert dir ein String Array. Außerdem kannst du die instanzmethode so nicht aufrufen.

So würde das ganze schon etwas(!) mehr sinn machen:


```
public class Start {
    public static void main(String[] args) {
            Testklasse test = new Testklasse();
            String[] result = test.getResult(...);        
    }
}
```

Was willst du eigentlich mit der Klasse StringArray?

PS:
Klassennamen schreibt man groß


----------



## StefanG (14. Jan 2011)

Ich möchte einfach das die Instanz der Klasse Testklasse ein Objekt vom Typ StringArray ist.

Dann kann ich in das Objekt der Instanz Testklasse, den Rückgabewert der Methode reinschreiben und damit arbeiten.


----------



## Gast2 (14. Jan 2011)

So macht man das in der Regel aber nicht :noe:

Wofür brauchst du überhaupt die StringArray Klasse? Tuts nicht auch nen String[]?


----------



## StefanG (14. Jan 2011)

EikeB hat gesagt.:


> So macht man das in der Regel aber nicht :noe:
> 
> Wofür brauchst du überhaupt die StringArray Klasse? Tuts nicht auch nen String[]?



Ja du hast Recht, habe ich gerade auch gemerkt. Habe es in String[] geändert, aber trotzdem Danke für den Hinweis.

Habe jetzt in meinem Aufruf eine Instanz der Testklasse, ein Objekt vom Typ String[], und dann den Methodenaufruf der Testklasse dessen Ergebnis in das Objekt resultSet vom typ String[] reingeschrieben wird.

Ich dachte einfach, wenn ich meiner Instanz der testklasse sage, du bist ein String[], das ich mir das String[] sparen kann. Aber scheinbar ist das nicht üblich.

Danke an alle!


----------

