Java Experten-Frage - Muss man bei Java jedes Objekt einzeln manuell bennenen oder kann man sie mit Namen aus einem Array bezeichnen?

6 Antworten

Das, was du da versuchst zu machen, ist nicht möglich. Du willst einem Objekt einen Namen geben, dieser Name darf allerdings nicht berechnet sein. Der Name ist nur für dich als Programmierer gedacht, damit du weißt mit welcher Objektinstanz/mit welchem Pointer du es zu tun hast. Wenn dein Programm erstmal kompiliert ist und läuft, dann existiert der "Name" von deinem Objekt nicht mehr.

Kleines Beispiel:

MeineKlasse k = new MeineKlasse();

'k' existiert hierbei nur in der IDE, damit der Compiler und der Programmierer wissen, wer mit dieser frisch erzeugten Objektinstanz interagiert. Eigentlich ist 'k' nur die Adresse zu dem Byte auf dem Heap, wo das Objekt vom Typ 'MeineKlasse' angelegt wurde. Und das kann bei jedem Programmstart eine völlig andere Adresse sein. Wenn das Programm erstmal läuft gibt es also kein 'k' mehr. Anders sieht es bei deinen Strings aus, die bleiben natürlich bestehen (allerdings erstmal nur als nicht lesbare Bytes im Arbeitsspeicher).

String hallo ="irgendwas",

'hallo' existiert wieder nur in der IDE und representiert die Adresse zum string im Speicher, und "irgendwas" wird bei der Ausführung Byte für Byte als einzelne Buchstaben an genau diese Adresse geschrieben. 'hallo' gibt es dann aber schon nicht mehr.

So wird das nicht gehen. Du kannst den Namen nicht als String wählen. Mach doch in die Vokabelklasse die Variablen rein.

Also so, dass Vokabel die Eigenschaften Englisch und Deutsch hat, die jeweils die einzelnen Übersetzung beinhaltet.

Woher ich das weiß:Berufserfahrung – Softwareentwicklerin

Wie soll ich das jetzt erklären?

-----

Vielleicht geht es mit

array ist schon vorher deklariert worden, wir hätten hier eine Namenskollision. Aus irgendeinem Grund findet der Compiler aber einen anderen Fehler vorher.

Außerdem ist array[] ein String[], kein Vokabel[].

-----

Anscheinend sieht der Compiler zuerst

Variablentyp variablenname = Ausdruck

und der Typ von Ausdruck ist nicht Variablentyp.

Vokabel array[i]

ist eine Formulierung, die der Compiler zulässt (vermutlich, weil zu viele Programmierer an diese -- eigentlich falsch -- Formulierung gewöhnt sind). Vielleicht auch, weil man dem Compiler die eigentlich korrekte Formulierung nicht beigebracht hat.

Korrekt wäre streng genommen

Vokabel[] array

oder, wenn man die Länge mit angeben will,

Vokabel[länge] array

Außerdem werden solche Ausdrücke "auseinandergezogen", bevor sie kompiliert werden.

Was der Compiler hier also sieht, ist (vermutlich)

Vokabel[] array;
array = new Vokabel[i];
array = new Vokabel();

und in dieser letzten Zeile merkt er dann, dass array ein Vokabel[] (Array) und kein Vokabel (Einzelvariable, kein Array) ist und dass ihm nicht beigebracht worden ist, wie man diese Typen automatisch ineinander umwandelt.

-----

Mit

Vokabel array[i]

erzeugst du eine lokale (für den Schleifenkörper lokal!) Variable namens "array" vom Typ Vokabel[] mit der Länge i.

Als was ist die Klasse Vokabel deklariert? Als Subtyp von String? Falls nein, müsstest du die Deklaration und die Initialisierung von array entsprechend anpassen:

Vokabel[] array = new Vokabel[5];
array[0] = new Vokabel("Brot");
array[1] = new Vokabel("Milch");
// usw.

wobei die Klasse Vokabel einen entsprechenden Konstruktor braucht.

Woher ich das weiß:Berufserfahrung – Software-Entwickler
leclerc16 
Fragesteller
 27.06.2018, 22:01

aber in dieser Variante muss man doch alle Objekte einzeln benennen oder nicht?

Das will ich gerade nicht.

0
PWolff  27.06.2018, 22:09
@leclerc16

Nein, die einzelnen Items des Arrays sind ihrerseits Objekte.

Die haben keinen eingenen Namen, sondern werden über das Array adressiert.

0
leclerc16 
Fragesteller
 27.06.2018, 22:15
@PWolff

OK, das verstehe ist, aber ich wil ja mit deutschen Wörtern abgefragt werden. Ich will, dass er mich ein deutsches Wort abfragt und ich muss es auf italienisch und einglisch eingeben.

0
PWolff  27.06.2018, 22:23
@leclerc16

Dann bietet sich ein Dictionary<String, Vokabel> an.

Du kannst auch (oder zusätzlich) ein Feld de neben en und it einbauen und das Array nach Vokabeln mit einem bestimmten Wert dieser Eigenschaft durchsuchen.

0

Vielleicht mal für die ganzen Helfer, was du willst:

public static void main(String args[])

{
   String bezeichner[] = new String [5];
   bezeichner[0] = "Brot";
   bezeichner[1] = "Milch";
   bezeichner[2] = "Kaffee";
   bezeichner[3] = "Ente";
   bezeichner[4] = "Ballon";

   for(int i = 0; i< bezeichner.length; i++)
      {
        if(bezeichner[i].equals("Brot"))
        {
         @SuppressWarnings("unused")
         Vokabel Brot = new Vokabel("bread", "bread");
        }
        if(bezeichner[i].equals("Milch"))
        {
         @SuppressWarnings("unused")
         Vokabel Milch = new Vokabel("milk", "milk");
        }
       (usw)
      }
   }

Also, wie bekomme ich die Bezeichner Brot, Milch usw ohne die "if"-Abfrage???

(Habe für Vokabel einen Konstruktor defineirt, damit ich es bei mir ausprobieren konnte)

leclerc16 
Fragesteller
 28.06.2018, 18:43

Ich will nicht alle Objekte einzeln bezeichnen müssen. Sie sollen die Namen aus einem Array erhalten.

0
verreisterNutzer  28.06.2018, 18:47

Ebend -- wollte nur zeigen, wie es (umständlich) geht, bei 10000 Voakbeln ist das schon schwierig (würde wohl mit switch/case etwas weniger Arbeitsaufwand sein).

0
leclerc16 
Fragesteller
 28.06.2018, 18:49
@verreisterNutzer

Wieso nicht mit einer for-Schleife? Die Namen, womit die Objekte benennen werden sollen, befinden sich in einem Array.

0
leclerc16 
Fragesteller
 28.06.2018, 19:09
@verreisterNutzer

Und das ist eine Schwachstelle.

array[0] sollte doch gleichbedeutend sein mit "Brot", also wieso kann ich ein Objekt nicht array[0] nennen?

0

1) Bitte gewöhne es dir einmal an, die eckigen Klammern bei Arrays hinter den Typ zu schreiben und nicht hinter den Bezeichner. Es ist zwar auch möglich, jedoch entspricht es nicht den gängigen Konventionen.

String[] array = new String[5];

Zudem wäre der Bezeichner natürlich nicht gerade gut gewählt. Statt array wäre ein Name wie germanWords geeigneter.

2) Der Bezeichner einer Referenz lässt sich nicht so einfach einmal umbenennen. Wenn du eine Referenz mit anderen Namen haben möchtest, die auf das Objekt verweist, dann lege eine neue Variable an:

Integer number = new Integer(5);
Integer five = number;

3) Für deinen Fall wäre entweder eine Liste an benutzerdefinierten Objekten geeignet:

class Word {
  private String _wordInGerman;
  
  private String _wordInEnglish;

  private String _wordInSpanish;

  public Word(String germanWord, String englishWord, String spanishWord) {
    // set attributes ...
  }

  // define getter and setter ...
}

// main:
ArrayList<Word> words = new ArrayList<>();
words.add(new Word("irgendein Wort", "some word", "cualquier palabra"));

for (Word word : words) {
  if (word.getWordInEnglish().equals("some word")) {
    System.out.printf("\n'%s' in spanish: '%s', "some word", word.getWordInSpanish());
    return;
  }
}

Oder noch einfacher eine HashMap:

HashMap<String, Translation> words = new HashMap<>();
words.put("some word", new Translation("irgendein Wort", "cualquier palabra"));
Translation word = words.get("some word");
System.out.println(word.getWordInSpanish());

Die Map eignet sich besonders gut, wenn du eine Hauptsprache hast, die hauptsächlich zur Assoziation dient.