Warum kann ich den Inhalt eines endgültigen Arrays in Java bearbeiten?

Lesezeit: 6 Minuten

Benutzer-Avatar
Löwe

Der folgende Code in Java verwendet a final Anordnung von String.

final public class Main {
  public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};

  public static void main(String[] args) {
    for (int x = 0; x < CONSTANT_ARRAY.length; x++) {
      System.out.print(CONSTANT_ARRAY[x] + " ");
    }
  }
}

Es zeigt die folgende Ausgabe auf der Konsole an.

I can never change

Wenn wir versuchen, die deklarierte neu zuzuweisen final Array des Typs Stringverursachen wir einen Fehler:

final public class Main {
  public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};

  public static void main(String[] args) {
    CONSTANT_ARRAY={"I", "can", "never", "change"}; //Error - can not assign to final variable CONSTANT_ARRAY.
    for (int x = 0; x < CONSTANT_ARRAY.length; x++) {
      System.out.print(CONSTANT_ARRAY[x] + " ");
    }
  }
}

Fehler: Letzte Variable kann nicht zugewiesen werden CONSTANT_ARRAY.

Der folgende Code funktioniert jedoch:

final public class Main {
  public static final String[] CONSTANT_ARRAY = {"I", "can", "never", "change"};

  public static void main(String[] args) {
    CONSTANT_ARRAY[2] = "always";  //Compiles fine.
    for (int x = 0; x < CONSTANT_ARRAY.length; x++) {
      System.out.print(CONSTANT_ARRAY[x] + " ");
    }
  }
}

Es zeigt an

I can always change

Dies bedeutet, dass wir es schaffen könnten, den Wert von zu ändern final Array des Typs String. Können wir das gesamte Array auf diese Weise ändern, ohne die unveränderliche Regel von zu verletzen? final?

  • Technisch gesehen ein Duplikat von stackoverflow.com/questions/13979696/…, aber dies hat mehr Aufrufe/Antworten

    – TylerH

    19. August um 18:28 Uhr

Benutzer-Avatar
Brian Roach

final in Java betrifft die Variablehat es nichts mit dem Objekt zu tun, das Sie ihm zuweisen.

final String[] myArray = { "hi", "there" };
myArray = anotherArray; // Error, you can't do that. myArray is final
myArray[0] = "over";  // perfectly fine, final has nothing to do with it

Bearbeiten, um aus Kommentaren hinzuzufügen: Beachten Sie, dass ich sagte Objekt, das Sie ihm zuweisen. In Java ist ein Array ein Objekt. Dasselbe gilt für jedes andere Objekt:

final List<String> myList = new ArrayList<String>():
myList = anotherList; // error, you can't do that
myList.add("Hi there!"); // perfectly fine. 

  • Du sagtest Objekt, und das ist gut. Dies gilt für alle Objekte, nicht nur für Arrays. Es ist auch in Ordnung, Objekte zu modifizieren, die der Wert von final-Variablen sind. Z.B, final List<String> list = new ArrayList<String>(); list.add("foo");.

    – Josua Taylor

    25. September 2013 um 21:42 Uhr


  • Da ein Array mit einem new-Operator definiert wird, ist es eine Objektreferenz (es spielt keine Rolle, ob es einen primitiven oder einen Objekttyp enthält). Die Objektreferenz kann nicht geändert werden, aber der Inhalt kann geändert werden. Oracle-Dokument sagt: “Ein Array ist ein Containerobjekt, das eine feste Anzahl von Werten eines einzelnen Typs enthält.” [docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html]. Der new-Operator gibt eine Referenz auf das von ihm erstellte Objekt zurück. [docs.oracle.com/javase/tutorial/java/javaOO/…

    – Arpit

    Jul 7, 2020 at 3:18

user avatar
Shehzad

You are misinterpreting the final implementation. final applies to the array object reference, which means once it is initiated, the reference can never change but the array its self can be populated. “Its not violating the rules” you have specified only one rule about the reference change which is working accordingly. If you want the values should also never change you should go for Immutable lists i.e

List<String> items = Collections.unmodifiableList(Arrays.asList("I", "can", "never", "change"));

You can only make it so the array reference can’t be changed. If you want the elements to be unable to be changed, you need to use an unmodifiable collection of some kind.

When you declare an array as final, you can change the elements in the array, however you cannot change the reference of this array.

final only guarantees immutability of primitives. And also guarantees that a variable is assigned only once. If an object is mutable you can change the content of it event it defined as final. You may check immutable collections for your needs. Such as Collections.unmodifiableList()
http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#unmodifiableList(java.util.List)

  • Doesn’t the second sentence imply the first?

    – user395760

    Apr 26, 2012 at 19:26


  • No. a variable can refer to an object reference, not necessarily a primitive.

    – afsina

    Apr 26, 2012 at 19:28

  • Yeah, so what? Variables are variables, no matter if they’re of a primitive type or of a reference type. And in either case, it can’t be reassigned.

    – user395760

    Apr 26, 2012 at 19:33

The reference to the array object is final (can not change e.g. in case you would attempt to associate a different Java array object (instance of String[]) in dieselbe letzte Variable … Sie würden einen Kompilierzeitfehler erhalten).

ABER die Felder des letzten Array-Objekts in Ihrem Beispiel sind nicht endgültig, und Sie können ihren Wert ändern. … während das von Ihnen erstellte Java-Objekt CONSTANT_ARRAY nach Erhalt eines Anfangswerts diesen Wert “für immer” == hat, bis die JVM stoppt. 🙂 Es wird “für immer” dieselbe String-Array-Instanz sein.

Endgültige Variablen in Java sind keine große Sache, nehmen Sie sich einfach etwas Zeit, um das Thema / die Idee sorgfältig zu verdauen. 🙂

Ich empfehle allen, die unsicher sind, über diese Seite nachzudenken, zum Beispiel:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.4

Lassen Sie mich den entsprechenden Teil zitieren:

Eine einmal zugewiesene Endvariable enthält immer den gleichen Wert. Wenn eine letzte Variable einen Verweis auf ein Objekt enthält, kann der Zustand des Objekts durch Operationen auf dem Objekt geändert werden, aber die Variable verweist immer auf dasselbe Objekt.

Dies gilt auch für Arrays, da Arrays Objekte sind; Wenn eine letzte Variable einen Verweis auf ein Array enthält, können die Komponenten des Arrays durch Operationen auf dem Array geändert werden, aber die Variable verweist immer auf dasselbe Array.

  • Bedeutet der zweite Satz nicht den ersten?

    Benutzer395760

    26. April 2012 um 19:26 Uhr


  • Nein. Eine Variable kann auf eine Objektreferenz verweisen, nicht unbedingt auf ein Primitiv.

    – Afsina

    26. April 2012 um 19:28 Uhr

  • Ja, na und? Variablen sind Variablen, egal ob sie vom primitiven Typ oder vom Referenztyp sind. Und in beiden Fällen kann es nicht neu zugewiesen werden.

    Benutzer395760

    26. April 2012 um 19:33 Uhr

Benutzer-Avatar
MyPasswordIsLasercats

Der Wert der Variable CONSTANT_ARRAY kann sich nicht ändern. Diese Variable enthält ein (Verweis auf ein) Array. Allerdings ist die Inhalt des Arrays kann Rückgeld. Dasselbe passiert, wenn Sie eine beliebige finale Variable deklarieren, die kein einfacher Skalartyp ist (z. B. ein Objekt).

Achten Sie darauf, wie Sie Ihre Variablen benennen. 🙂 Wenn Sie es als CONSTANT_ARRAY bezeichnen, wird der Inhalt des Arrays nicht unveränderlich.

Hier ist eine gute Referenz: Das letzte Wort zum Finale

1382280cookie-checkWarum kann ich den Inhalt eines endgültigen Arrays in Java bearbeiten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy