Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet?

MaggyMo

Aktives Mitglied
Guten Abend,

ich stehe vor dem Problem, dass ich eine Textdatei auslese und in Abhängigkeit davon Objekte erstellen muss. Es existieren die Klassen Vogel und Fisch.
Die Textdatei ist nach einem bestimmten Muster aufgebaut: Klassenbezeichner; Name; Gewicht
Abhängig von dem Klassenbezeichner muss eine Instanz vom dementsprechenden Objekt erstellt werden.
Beispiel:
Fisch;Hering;300
Vogel: Amsel; 500
Die Textdatei wird zeilenweise ausgelesen und pro Zeile wird ein Objekt erstellt. Ich bin jetzt an dem Punkt, dass ich den ersten Wert, z.B. "Fisch" in einer Variabeln (klassenname) gespeichert habe und aufgrunddessen gerne ein Objekt der Klasse Fisch erstellen möchte.

Dieser Weg funktioniert leider nicht:
klassenname f1 = new klassenname();

Kann mir da vllt jemand helfen?

Liebe Grüße🙂
 
Java:
public Object createInstance(String name) throws Exception {
    Class c = Class.forName(name);
    return c.newInstance();
}

Name sei z.B. "java.util.Vector".

Ich teste es gerade...
 
Für deinen Fall passender:

Java:
switch (klassenbezeichner) {
  case "Fisch":
    ... new Fisch(...);
  case "Vogel":
    ... new Vogel(...);
}



Java:
public Object createInstance(String name) throws Exception {
    Class c = Class.forName(name);
    return c.newInstance();
}

Name sei z.B. "java.util.Vector".

Ich teste es gerade...
"Anfänger-Themen" 😉
 
Ich habe meines getestet. Um If-Statements kommt man nicht herum. Außerdem muss gecastet werden, damit die Begrüßung ausgegeben werden kann.

Java:
public class Hauptprogramm {

    public static void main(String[] args) throws Exception {

        Object a = erstelle("Fisch", "Hering", 300);
        Object b = erstelle("Fisch", "Karpfen", 111);

        if (a instanceof Fisch) {
            System.out.println(((Fisch) a).holeBegruesssung());
            System.out.println("a ist ein Fisch");
        }

        System.out.println("a.getClass(): " + a.getClass());
        System.out.println("a.getClass().getSimpleName(): " + a.getClass().getSimpleName());
    }

    public static Object erstelle(String name, String s, int b) throws Exception {
        Class c = Class.forName(name);
        return c.newInstance();
    }

}
Java:
public class Fisch {

    public String holeBegruesssung() {
        return "blubb";
    }

}
Java:
public class Vogel {

    public String holeBegruesssung() {
        return "Tschirp, tschirp!";
    }

}
Ausgabe:
Code:
blubb
a ist ein Fisch
a.getClass(): class Fisch
a.getClass().getSimpleName(): Fisch
 
Zuletzt bearbeitet:
Hier noch ein Beispiel mit ArrayList (und switch):
Java:
import java.util.ArrayList;

public class Hauptprogramm {

    private static ArrayList<Fisch> fische = new ArrayList<>();
    private static ArrayList<Vogel> voegel = new ArrayList<>();

    public static void main(String[] args) {

        erstelle("Fisch", "Hering", 300);
        erstelle("Fisch", "Karpfen", 111);
        erstelle("Vogel", "Amsel", 4);

        System.out.println("Fische:");
        for (int i = 0; i < fische.size(); i++) {
            System.out.println("" + fische.get(i).art + "; " + fische.get(i).holeBegruesssung());
        }

        System.out.println("\nVögel:");
        for (int i = 0; i < voegel.size(); i++) {
            System.out.println("" + voegel.get(i).art + "; " + voegel.get(i).holeBegruesssung());
        }

    }

    public static void erstelle(String klassenbezeichner, String art, int b) {

        switch (klassenbezeichner) {
        case "Fisch":
            fische.add(new Fisch(art));
            break;
        case "Vogel":
            voegel.add(new Vogel(art));
            break;
        }
    }

}

Java:
public class Fisch {

    public String art;

    public Fisch(String art) {
        this.art = art;
    }

    public String holeBegruesssung() {
        return "blubb";
    }

}

Java:
public class Vogel {

    public String art;

    public Vogel(String art) {
        this.art = art;
    }

    public String holeBegruesssung() {
        return "Tschirp, tschirp!";
    }

}

Ausgabe:
Code:
Fische:
Hering; blubb
Karpfen; blubb

Vögel:
Amsel; Tschirp, tschirp!
 
Guten Abend,

ich stehe vor dem Problem, dass ich eine Textdatei auslese und in Abhängigkeit davon Objekte erstellen muss. Es existieren die Klassen Vogel und Fisch.
Die Textdatei ist nach einem bestimmten Muster aufgebaut: Klassenbezeichner; Name; Gewicht
Abhängig von dem Klassenbezeichner muss eine Instanz vom dementsprechenden Objekt erstellt werden.
Beispiel:
Fisch;Hering;300
Vogel: Amsel; 500
Die Textdatei wird zeilenweise ausgelesen und pro Zeile wird ein Objekt erstellt. Ich bin jetzt an dem Punkt, dass ich den ersten Wert, z.B. "Fisch" in einer Variabeln (klassenname) gespeichert habe und aufgrunddessen gerne ein Objekt der Klasse Fisch erstellen möchte.

Dieser Weg funktioniert leider nicht:
klassenname f1 = new klassenname();

Kann mir da vllt jemand helfen?

Liebe Grüße🙂

Guten Abend.

Ich bin nun mit dieser Aufgabe etwas weiter gekommen, aber stehe nun vor einem weiteren Problem. Quasi eine Erweiterung zu dieser Frage.
Ich habe nun eine Klasse namens Tier, von der die Klassen Fisch und Vogel erben. Die Objekte werden in einer ArrayList<Tier> gespeichert, damit ich die Objekte beider Klassen unter einen Hut bekomme. Leider kann ich an einer Stelle noch nicht auf die genaue Unterklasse referenzieren und erstelle somit erstmal ein Objekt der Klasse Tier und füge dieses meiner ArrayList hinzu. Im nächsten Schritt möchte ich dann dieses Objekt zu der Klasse Fisch casten. Kann mir dabei vllt auch jemand helfen? Oder soll ich dafür lieber eine neue(s) Frage/Thema erstellen?

Liebe Grüße und Danke im Voraus🙂
 
Das geht nicht. Du kannst ein Objekt vom Typ Tier nicht auf einen Fisch casten.

Du kannst ein in einer Variable vom Typ Tier gespeichertes Objekt vom Typ Fisch wieder auf Fisch casten - aber kein Tier.
 

Zurück
Oben