Konstruktoraufruf mit "variablem" Namen

Nelzon

Mitglied
Grüße,

ich bin neu was Programmiersprachen betrifft, und wühle mich gerade durch allerlei Bücher. Da die letzte halbe Stunde keine Hilfe brachte und ich auch mit der Suche hier nichts fand, eine kurze Frage. Ich hoffe mal ich sehe einfach den Wald vor lauter Bäumen nicht 🙂

Ich möchte meinen Konstruktor (Klasse und Name bspw Test) aufrufen, und als Name einen String oder Int übergeben. Bspw:

String konName = "Kon1";

Test (konName) = new Test(x, y);

ich habe "konName" in Anführungszeichen gesetzt, in Klammern, beides.. keine Chance. Was mache ich falsch? Sobald ich einen festen Namen vergebe funktioniert alles wunderbar, nur einen variablen Namen den ich dann bspw über die Eingabe an der Tastatur übergeben möche, will er partout nicht akzeptieren.
 
Hi,
String konName = "Kon1";
Test (konName) = new Test(x, y);
Nun so funktioniert das nicht.
Die Syntax zum Erstellen von Instanzen ist so:
Java:
// ohne Parameter:
KLASSE instanz0 = new KLASSE();
// oder mit 1 Parameter:
KLASSE instanz1 = new KLASSE(PARAM1_KLASSE param1);
// oder mit 2 Parameter:
KLASSE instanz2 = new KLASSE(PARAM1_KLASSE param1, PARAM2_KLASSE param2 );
// oder mit 3 Parameter:
KLASSE instanz3 = new KLASSE(PARAM1_KLASSE param1, PARAM2_KLASSE param2, PARAM3_KLASSE param3 );
// ... etc
In deinem Fall würde dann so aussehen:
Java:
Test meinTestObjekt = new Test(x, y);
Wenn du beim Erzeugen von einem Objekt unterschiedlich viele Parameter dem Konstruktor mitgeben möchtest, musst du in der Klasse Test auch alle Konstruktoren implementieren, die deiner Meinung nach möglich sind.
Hier mal ein Beispiel.
Java:
public class Test {
    private int x;
    private int y;
    private String name;

    public Test(int x, int y) {
        name = "";
        this.x = x;
        this.y = y;
    }
 
    public Test(String name) {
        this.name = name;
        x = 0;
        y = 0;
    }
 
    public Test(String name, int x, int y) {
        this.name = name;
        this.x = x;
        this.y = y;
    }
     //... getters und setters
}
 
Zuletzt bearbeitet:
Hiho,

erstmal danke für deine Antwort 🙂

Hab mich ein wenig ungünstig ausgedrückt, die Implementierung in der Testklasse klappt so weit, die hab ich hier nur nicht mit aufgeführt gehabt.
Mir geht es primär darum, das ich erst während der Laufzeit weiss wie viele Konstruktoraufrufe ich letztendlich brauche. Daher wollte ich mir eine Funktion schreiben, die jedes mal den Namen von der Tastatur übernimmt, genau so wie die Werte, und damit findet dann der Aufruf statt.
In deinem Beispiel wäre ich ja auf den einen Konstruktor festgeschrieben, der sich "meinTestObjekt" nennt, und nur einmal mit den Parametern aufgerufen werden kann. Wenn ich weiss wie viele ich brauche geht das ja noch (dann erstell ich halt einfach drei Aufrufe die ich dann "meinTestObjekt1", meinTestObjekt2"... nenne), aber bei variablen Aufrufen weiss ich nicht mehr weiter..
 
Mir geht es primär darum, das ich erst während der Laufzeit weiss wie viele Konstruktoraufrufe ich letztendlich brauche.
Meinst du damit, dass nicht klar ist, wie viele Parameter zur Verfügung stehen, um damit Instanzen zu erstellen?
Du kannst natürlich auch so etwas machen:
Code:
public Test(Object ... objects ) {
   // objects ist ein Array  mit instanzen der Oberklasse Objekt.
}
Aber das ist nicht ideal, so hast du keine Kontrolle, wie die Instanzen erstellt werden. Du kannst damit irgend etwas mitgeben, und deine Instanz wird erzeugt (oder das Programm wird mit einer Exception enden, da du damit keine sichere Prüfungen hast, was erlaubt ist und was nicht)
 
Wenn es aber darum geht, dass du nicht weisst, wie viele Instanzen von der Klasse Test erzeugt werden sollen, dann brauchst du einen Container oder vielleicht ein Array, welches deine Instanzen aufnimmt.
Bei einem Array muss eine Grösse definiert werden, bei einem Container (z.B. ArrayList oder LinkedList muss dies nicht vorhanden sein, da sich die Grösse dynamisch ändert)
Mit diesem Beispiel werden 5 Instanzen von Test erzeugt und danach ausgegeben.
Java:
       List<Test> testListe = new ArrayList<>();
       for (int i = 0; i < 5; i++) {
           testListe.add(new Test("test" + i, i, i+1));
       }
    
       for (Test test : testListe) {
           System.out.println(test.getName() + " " + test.getX() + " "+test.getY());
       }
 

Zurück
Oben