OOP Objekt in IF erzeugen - funktioniert nicht so richtig

Blah123

Mitglied
Hallo zusammen,

ich programmiere gerade ein kleines Spiel.

Der Nutzer soll eingeben können, ob er Barbar oder Heiler spielt.
Dann wird in der Bedingung einer if überprüft ob Barbar oder Heiler eingegeben wurde.
Abhängig davon wird Heiler h1 = new Heiler() oder Barbar h1 = new Barbar() erstellt.
D.h. das Objekt soll in beiden fällen gleich heissen, aber von unterschiedlichen Klassen abgeleitet sein. Grund: Vererbungshierarchie und im Spiel will ich den Helden immer über h1 ansprechen (egal ob Barbar oder Held).

Problem:
Wenn ich ausserhalb der IF bzw while h1 ansprechen will, gibt der Compiler den Fehler "Cannot find Symbol". (Bei h1.name=...) Komischerweise kann ich h1.XXX ansprechen. D.h. es erscheinen die Attribute und Methoden....


Habe euch auch noch die Dateien Angehängt.

Wäre nett, wenn jemand was weiß.


Java:
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 11.11.2017
  * @author
  */
import java.util.Scanner;
public class Startklasse {
 
  public static void main(String[] args) {
    boolean nochmal=true;
    Scanner tastatur = new Scanner(System.in);
 
 
    Monster m1 = new Monster();
    m1.name="Mooonster";
    m1.lebensenergie=10;
 
 
    //Abfrage, welche Klasser der Spieler spielen will
    while (nochmal) {
   
      System.out.print("Welche Klasse wollen Sie spielen (Heiler oder Barbar)? : ");
      String heldenklasse=tastatur.next();
   
   
      //Heldenobjekt wird erstellt. Entweder Heiler oder Barbar
      if (heldenklasse.equals("Heiler")) {
        Heiler h1 = new Heiler();
     
        h1.lebensenergie=10;
        h1.schlachtruf();
     
     
        nochmal=false;
      } // end of if
      else if (heldenklasse.equals("Barbar")){
        Barbar h1 = new Barbar();
     
        h1.lebensenergie=10;
        h1.schlachtruf();
        nochmal=false;
      } // end of if-else
      else {
        System.out.println("Gebe als Heldenklasse Heiler oder Barbar ein!!!");
      } // end of if-else
   
    } // end of while
 
    System.out.print("Gebe den Namen deines Helden ein: ");
    h1.name=tastatur.nextLine();
 
    System.out.println("Die Lebenenergie des Helden und des Monsters betragen jeweils 10!");
    System.out.println("------------------------------------------");
 
     
    while (nochmal) {
      System.out.println("");
   
      //Held greif Monster an
      int schadenheld=h1.angriff();
   
      //Sonderfähigkeit des Heldes wird abgefragt
      if (heldenklasse.equals("Heiler")) {
        h1.heilen();
      } // end of if
      else if (heldenklasse.equals("Barbar")){
     
      } // end of if-else
   
      //Nach Angriff des Helden wird der Gesundheitscheck für das Monster ausgeführt
      m1.gesundheitsCheck(schadenheld);
   
      //Monster greift Held an
      int schadenmonster=m1.angriff();
   
      //Gesundheitscheck für den Held
      h1.gesundheitsCheck(schadenmonster);
   
      //      if (m1.lebensenergie<=0 || h1.lebensenergie<=0) {
      //        weiterspielen=false;
      //      } // end of if
   
   
    } // end of while
 
     
 
 
 
 
 
 
 
  } // end of main

} // end of class Startklasse
 

Anhänge

  • Java-Dateien.zip
    2,8 KB · Aufrufe: 2
  • Vererbungshierarchie.PNG
    Vererbungshierarchie.PNG
    10,5 KB · Aufrufe: 37

mrBrown

Super-Moderator
Mitarbeiter
Du musst die Variable mit einem passenden Typ vor dem if deklarieren - ansonsten ist die Variable nur innerhalb des if-Blocks bekannt.

in dem if musst du die Variable dann nur noch initialisieren.
 

SchwarzWeiß

Bekanntes Mitglied
Die passende Klasse wäre in dem Fall Held.

Dann kannst du auch anstatt
Java:
if (heldenklasse.equals("Heiler")) {
        h1.heilen();
      } // end of if
else if (heldenklasse.equals("Barbar")){
  
      }

schreiben:
Java:
if (h1 instanceof Heiler) {
        h1.heilen();
      } // end of if
else if (h1 instanceof Barbar){
   
      }
Dadurch könntest du am Anfang z.B. auch Zahlen abfragen, damit der User die Heldenklassen nicht ausschreiben muss. (z.B. 1 für Heiler, 2 für Barbar oder so)

Mit welchem Tool hast du das Klassendiagramm gemacht?
 

Blah123

Mitglied
Du musst die Variable mit einem passenden Typ vor dem if deklarieren - ansonsten ist die Variable nur innerhalb des if-Blocks bekannt.

in dem if musst du die Variable dann nur noch initialisieren.
Sowas habe ich mir schon gedacht. Dann muss ich aber auch schon vor dem IF je ein Objekt für Barbar und ein Objekt für den Heiler erstellen. Die kann ich dann aber nicht gleich bennenen. Was dazu führt, dass ich im Spiel bei jeder Aktion des Spielers abfragen muss, ob es sich um einen Barbaren oder Heiler handelt und dann die Aktion auf das passende Objekt ausführen muss. zB Wenn die Heldenklasse=Heiler, dann führe heilen() auf Heilerobjekt aus, wenn Heldenklasse=Barbar, dann rage() auf Barbarbenobjekt. Genauso bei dem Gesundheitscheck. Da muss ich immer abfragen was für eine Heldenklasse vorliegt und dann den Gesundheitscheck auf das entsprechende Objekt ausführen?!
--> Gibt es da keine elegantere Lösung?


Die passende Klasse wäre in dem Fall Held.

Dann kannst du auch anstatt
Java:
if (heldenklasse.equals("Heiler")) {
        h1.heilen();
      } // end of if
else if (heldenklasse.equals("Barbar")){
 
      }

schreiben:
Java:
if (h1 instanceof Heiler) {
        h1.heilen();
      } // end of if
else if (h1 instanceof Barbar){
  
      }
Dadurch könntest du am Anfang z.B. auch Zahlen abfragen, damit der User die Heldenklassen nicht ausschreiben muss. (z.B. 1 für Heiler, 2 für Barbar oder so)

Mit welchem Tool hast du das Klassendiagramm gemacht?

Das mit dem Instanceof würde doch nur was bringen, wenn ich mehrere Objekte mit Namen h1 verschiedener Klassen erzeugen könnte. Die Objekte dürfen doch nicht gleich heissen?!

Habe das Klassendiagramm mit dem JavaEditor erstellt
 

SchwarzWeiß

Bekanntes Mitglied
mrBrown meinte
Java:
Held h1;
vor der if-Abfrage schreiben. (Deklaration der Variable)
Und dann z.B. im if-Körper die Instanz erzeugen:
Java:
h1 = new Heiler();
Dann dürften sich auch die restlichen Fragen geklärt haben.
 
Zuletzt bearbeitet:

Blah123

Mitglied
mrBrown meinte
Java:
Held h1;
vor der if-Abfrage schreiben. (Deklaration der Variable)
Und dann z.B. im if-Körper die Instanz erzeugen:
Java:
h1 = new Heiler();
Dann dürften sich auch die restlichen Fragen geklärt haben.
Ah. Wusste garnicht, dass man ein Objekt deklarieren kann, ohne den Konstruktor direkt aufzurufen (Held h1 ohne new...). Und dann danach den Konstruktor einer Subklasse drauf anwenden...
 

Blah123

Mitglied
Ich habs aber grad so gemacht, dann findet er ausserhalb der if aber nur die Methoden von Held sowie von Spielfigur, aber vom Heiler und dem Barbaren nicht. Hier zB bringt er einen Fehler bei h1.heilen() bei den Sonderfähigkeiten:
Java:
/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 11.11.2017
  * @author
  */
import java.util.Scanner;
public class Startklasse {
 
  public static void main(String[] args) {
    boolean nochmal=true;
    Scanner tastatur = new Scanner(System.in);
   
   
    Monster m1 = new Monster();
    m1.name="Mooonster";
    m1.lebensenergie=10;
   
    Held h1;
   
    //Abfrage, welche Klasser der Spieler spielen will
    while (nochmal) {
     
      System.out.print("Welche Klasse wollen Sie spielen (Heiler oder Barbar)? : ");
      String heldenklasse=tastatur.next();
     
     
      //Heldenobjekt wird erstellt. Entweder Heiler oder Barbar
      if (heldenklasse.equals("Heiler")) {
        h1 = new Heiler();
       
        h1.lebensenergie=10;
        h1.schlachtruf();
       
       
        nochmal=false;
      } // end of if
      else if (heldenklasse.equals("Barbar")){
        h1 = new Barbar(); 
       
        h1.lebensenergie=10;
        h1.schlachtruf();
        nochmal=false;
      } // end of if-else
      else {
        System.out.println("Gebe als Heldenklasse Heiler oder Barbar ein!!!");
      } // end of if-else
     
    } // end of while
   
    System.out.print("Gebe den Namen deines Helden ein: ");
    h1.name=tastatur.nextLine();
   
    System.out.println("Die Lebenenergie des Helden und des Monsters betragen jeweils 10!");
    System.out.println("------------------------------------------");
   
       
    while (nochmal) {
      System.out.println("");
     
      //Held greif Monster an
      int schadenheld=h1.angriff();
        
      //Sonderfähigkeit des Heldes wird abgefragt
      if (h1 instanceof Heiler) {
        h1.heilen();
      } // end of if
      else if (h1 instanceof Barbar){
             
      } // end of if-else
     
     
      //Nach Angriff des Helden wird der Gesundheitscheck für das Monster ausgeführt
      m1.gesundheitsCheck(schadenheld);
     
      //Monster greift Held an
      int schadenmonster=m1.angriff();
     
      //Gesundheitscheck für den Held
      h1.gesundheitsCheck(schadenmonster);
     
      //      if (m1.lebensenergie<=0 || h1.lebensenergie<=0) {
      //        weiterspielen=false;
      //      } // end of if
     
     
    } // end of while
   
       
   
   
   
   
   
   
   
  } // end of main

} // end of class Startklasse
 

mrBrown

Super-Moderator
Mitarbeiter
Du müsstest das Objekt nach dem instanceof-Check noch zu dem entsprechendem Typ casten, wenn du spezifische Methoden aufrufen willst.
 

SchwarzWeiß

Bekanntes Mitglied
Du hast recht. Eclipse schlägt die spezifischen Methoden innerhalb einer instanceof-if-Bedingung immer vor und castet dann automatisch, daher hab ich das schon länger nicht mehr von Hand gemacht :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
I Object-Oriented Programming, Objekt erzeugen Java Basics - Anfänger-Themen 1
P Objekt aus String-Array erzeugen Java Basics - Anfänger-Themen 104
G Objekt der selben Klasse wie selbst mit Aufrufen des Konstruktors erzeugen Java Basics - Anfänger-Themen 14
P Objekt mit =new in Methode erzeugen Java Basics - Anfänger-Themen 4
N Objekt in Methode einer anderen Klasse erzeugen Java Basics - Anfänger-Themen 9
D Objekt per If erzeugen. Java Basics - Anfänger-Themen 11
J Objekt mit Methodendruchlauf erzeugen Java Basics - Anfänger-Themen 1
P Vererbung Neues Objekt aus Vorlage erzeugen Java Basics - Anfänger-Themen 1
P Kapselung Variable innerhalb einer inneren Klasse ansprechen ohne ein Objekt erzeugen zu müssen? Java Basics - Anfänger-Themen 6
M Neues Objekt erzeugen mit Klassennamen oder ohne Java Basics - Anfänger-Themen 5
X Objekt erzeugen aus einem XML Datei Java Basics - Anfänger-Themen 15
B Warum ein Objekt mit zweimal new erzeugen? Java Basics - Anfänger-Themen 14
J Methode ausgeben(Objekt erzeugen) Java Basics - Anfänger-Themen 13
S Objekt in Objekt erzeugen Java Basics - Anfänger-Themen 2
L Objekt erzeugen mit eigenem typ Java Basics - Anfänger-Themen 5
M Verständnisfrage: Objekt erzeugen u. zuweisen Java Basics - Anfänger-Themen 16
M Kann kein Objekt (AudioFile in diesem Beispiel) für ein leeren String erzeugen Java Basics - Anfänger-Themen 3
S Objekt mehrfach erzeugen Java Basics - Anfänger-Themen 3
P Kann ich ein Objekt vom Typ Interface erzeugen? Java Basics - Anfänger-Themen 4
R String einlesen, Textdatei danach durchsuchen und aus Zeile Objekt erzeugen Java Basics - Anfänger-Themen 5
S objekt erzeugen Java Basics - Anfänger-Themen 6
C Objekt von Klasse im gleichen Paket erzeugen Java Basics - Anfänger-Themen 8
K Objekt erzeugen. Java Basics - Anfänger-Themen 1
B neues Objekt erzeugen Java Basics - Anfänger-Themen 7
G objekt der selben klasse erzeugen Java Basics - Anfänger-Themen 4
F Objekt aus anderem Objekt erzeugen Java Basics - Anfänger-Themen 6
G Date Objekt für aktuelles Datum erzeugen Java Basics - Anfänger-Themen 9
B Array mehrmals als Objekt erzeugen Java Basics - Anfänger-Themen 17
T Möchte ein neues Objekt erzeugen mit Wert von anderem Objekt Java Basics - Anfänger-Themen 9
B Aus gegebenem String Objekt erzeugen Java Basics - Anfänger-Themen 5
S Problem neues Objekt erzeugen Java Basics - Anfänger-Themen 4
N Class-Objekt aus File-Objekt erzeugen? Java Basics - Anfänger-Themen 14
pro_progger Image-Objekt erzeugen ? Java Basics - Anfänger-Themen 7
J Objekt aus anderer Klasse und Package erzeugen Java Basics - Anfänger-Themen 11
R leeres Feld im GridLayout (dummy Objekt erzeugen?) Java Basics - Anfänger-Themen 2
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
Rxiiz Objekt aus ComboBox entfernen Java Basics - Anfänger-Themen 4
I JSON in Objekt umwandeln Java Basics - Anfänger-Themen 3
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
Say Objekt Java Basics - Anfänger-Themen 4
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
K warum kann ich das Objekt nicht erstellen ? Java Basics - Anfänger-Themen 2
K wie kann ich alle Attribute von dem Objekt(pagode) ausgeben lassen ? Java Basics - Anfänger-Themen 3
H Ein übergegebenes Objekt auf null setzen Java Basics - Anfänger-Themen 9
M BlueJ Objekt in Objektliste Java Basics - Anfänger-Themen 2
B Objekt in Klassendiagramm an fremdes Objekt weiterreichen? Java Basics - Anfänger-Themen 6
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
frager2345 Aufgabe Hash Objekt Elemente ausgeben Java Basics - Anfänger-Themen 2
amelie123456 Objekt Farbe Quellcode Java Basics - Anfänger-Themen 4
M Objekt in einem Objekt speichern Java Basics - Anfänger-Themen 9
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
missy72 Klassen Objekt Array NullPointerException Java Basics - Anfänger-Themen 3
J Hinzufügen eines Objektes in ein Objekt-Array Java Basics - Anfänger-Themen 62
O Warum bekommen wir nicht die Referenz vom zurückgegebenen Objekt? Java Basics - Anfänger-Themen 4
K Ein Objekt Auto kennt den Inhalt seines links und rechtsstehenden Autos, wie soll man das ermöglichen Java Basics - Anfänger-Themen 2
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
melaniemueller Fernseher als Objekt Java Basics - Anfänger-Themen 9
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
Nina Pohl Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist Java Basics - Anfänger-Themen 6
B Objekt kopieren und sämtliche Referenzen von diesem Objekt? Java Basics - Anfänger-Themen 3
S JavaFX - Objekt an neue Stage übergeben Java Basics - Anfänger-Themen 12
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
S Aufzurufendes Objekt Java Basics - Anfänger-Themen 3
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
C Konstruktor ab serialisiertem Objekt Java Basics - Anfänger-Themen 4
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
J Input/Output Konstruktor ergänzen, der zur Datei mit einem Objekt passt Java Basics - Anfänger-Themen 0
P Ein Objekt nach einem String durchsuchen? Java Basics - Anfänger-Themen 7
S Objekt aus Arraylist in andere Arraylist kopieren? Java Basics - Anfänger-Themen 2
J Objekt-Array dynamischer Länge aus Benutzereingaben erstellen Java Basics - Anfänger-Themen 6
C Arrays - deklarieren, initialisieren? Ist das ein Objekt? Java Basics - Anfänger-Themen 3
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Objekt von EJB in Controller (CDI) - Klasse füllen? Java Basics - Anfänger-Themen 3
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
N LocalTime einem Objekt zuweisen Java Basics - Anfänger-Themen 2
N Länge eines Arrays in einem Objekt testen Java Basics - Anfänger-Themen 51
M Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
tom.j85 Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt Java Basics - Anfänger-Themen 4
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
M ArrayList - Objekt kopieren und ändern Java Basics - Anfänger-Themen 11
L Objekt an Methode übergeben Java Basics - Anfänger-Themen 4
S Spiel-Programmieren. Wenn ein Objekt den anderen berührt. Java Basics - Anfänger-Themen 6
J Y-Koordinate von GUI-Objekt bestimmen Java Basics - Anfänger-Themen 2
M Auf erstelltes Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 5
H Referenz Objekt aufrufen Java Basics - Anfänger-Themen 12
M Objekt mit eindeutiger ID löschen, das nächste Objekt hat dann diese ID Java Basics - Anfänger-Themen 5
N Mit Objekt der Superklasse auf Methode der Subklasse zugreifen Java Basics - Anfänger-Themen 6
J Objekt bei Auswahl in jList ändern Java Basics - Anfänger-Themen 6
Kirby.exe Generische Objekt Instanz erstellen Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben