Unterschied zwischen "final static String" und "static String"? [geschlossen]

8
%Vor%

Bitte zeigen Sie den Unterschied zwischen "final static String" und "static String" in Java. außer der letzte kann nicht geändert werden. Was sind die anderen Unterschiede? Vielen Dank. wenn in komplexeren Umständen wie Multithreading und geerbt, nichts verändert?

    
sigh 07.01.2013, 04:56
quelle

14 Antworten

9

Obwohl unter der Beschreibung von Android doc, aber könnte für diese Java-markierte Frage helfen.

Betrachten Sie die folgende Deklaration am Anfang einer Klasse:

%Vor%

Der Compiler generiert eine Klasseninitialisierungsmethode, die aufgerufen wird, wenn die Klasse zum ersten Mal verwendet wird. Die Methode speichert den Wert 42 in intVal und extrahiert eine Referenz aus der Konstanten-Tabelle für die Klassendatei-Zeichenkette für strVal. Wenn später auf diese Werte verwiesen wird, wird auf sie mit Feldsuchen zugegriffen.

Wir können die Dinge mit dem Schlüsselwort "final" verbessern:

%Vor%

Die Klasse benötigt keine Methode mehr, da die Konstanten in die statische Feldinitialisierung in der Dex-Datei gehen. Code, der sich auf intVal bezieht, verwendet den Ganzzahlwert 42 direkt, und Zugriffe auf strVal verwenden eine relativ kostengünstige "String-Konstanten" -Anweisung anstelle einer Feldsuche.

Hinweis:

  

Diese Optimierung gilt nur für primitive Typen und String   Konstanten, keine willkürlichen Referenztypen. Trotzdem ist es eine gute Übung   Deklarieren Sie, wann immer möglich, Konstanten statisch.

Ich hoffe, das wird klar sein.

Weitere Details finden Sie unter UseFinal

    
Pankaj Kumar 07.01.2013 05:27
quelle
6

Wenn es um die Variable

geht
  • final Static String - Konstante und es ist Klassenvariable
  • static String - Klassenvariable und keine Konstante
user948620 07.01.2013 04:58
quelle
3

hier ist mehr

%Vor%

Zeile 1 kompiliert nicht, Zeile 2 kompiliert

und es gibt mehr für primitive Typen.

%Vor%

Bytecode

%Vor%

bedeutet int y = 2 , weil x eine Konstante ist (obwohl es nicht statisch ist)

wenn wir uns

ändern %Vor%

Bytecode

%Vor%

JVM liest x und berechnet y

    
Evgeniy Dorofeev 07.01.2013 05:02
quelle
1

Nach Wiki

  

Wenn die Variable eine Referenz ist, bedeutet dies, dass die Variable nicht erneut gebunden werden kann, um auf ein anderes Objekt zu verweisen. Aber das Objekt, auf das es verweist, ist immer noch veränderlich, wenn es ursprünglich veränderbar war.

Da String jedoch unveränderlich ist, um mit zu beginnen, ist der Unterschied in diesem Fall irrelevant und nur eine Variable, die nicht geändert werden kann trotzdem .

    
Karthik T 07.01.2013 04:59
quelle
1

Sie haben es selbst gesagt: Das letzte kann nicht zugewiesen werden. Soweit ich weiß, bietet der Modifikator final ein anderes Verhalten als das andere. Das einzige, was ich mir vorstellen kann, ist, dass als Test ist public , static und final , der Compiler wird automatisch alle Vorkommen von Test in Ihrem Code ersetzen und ersetzen sie durch die Zeichenfolge Literal "ABC" , obwohl der String interniert wird, hat er keine Auswirkungen auf den Code. Grundsätzlich verhindert final, dass der String einer anderen Referenz zugewiesen wird, das heißt alle.

    
ApproachingDarknessFish 07.01.2013 05:01
quelle
1

Eine final -Klasse kann nicht unterklassifiziert werden. Es ist wie die sealed -Klasse in C #.

Eine final Methode kann nicht überschrieben werden.

Ein final -Feld kann nur einmal wie eine Konstante initialisiert / zugewiesen werden, ist aber zur Kompilierzeit nicht unbedingt bekannt.

Ein static -Member wird für alle Instanzen einer Klasse freigegeben.

Also, static final ist normalerweise für etwas, das Sie nie wieder ändern, aber nicht unbedingt hart zur Kompilierungszeit codiert.

    
Richard Dong 07.01.2013 05:06
quelle
1

Die kompilierte Java-Klasse führt zu einer schnelleren Leistung, wenn eine Java-Variable als statisch final deklariert wird.

Überprüfen Sie dies

    
Sunil Gulabani 07.01.2013 05:09
quelle
0

Endgültige Variablen sind Instanzvariablen, deren Werte nach der Initialisierung nicht geändert werden können.

Aber statische Variablen gehören zu einer Klasse. Dies wird unter allen Instanzen geteilt. Wenn Sie also den Wert einer statischen Variablen in einer Instanz ändern, wird dies in allen Instanzen berücksichtigt.

    
Prince 07.01.2013 05:03
quelle
0

Sie können die Referenz des Abschlusses nicht wie folgt ändern

%Vor%     
slggamer 07.01.2013 05:17
quelle
0

Hier geht's:

1) final static String : Wenn Sie "final" sagen, ist es eine Konstante und Sie können den Wert während des gesamten Programms nicht ändern. Es ist keine Variable, Sie können den Wert nicht ändern. In Java verwenden wir final keyword, um Konstanten zu deklarieren. Wir sollen alle Großbuchstaben mit Unterstrichen verfolgen, um die Wörter zu trennen und Konstanten zu deklarieren. Zum Beispiel: MAX_INPUT_TIME, CONNECTION_POOL_SIZE, MAX_USER etc.

2) static String : Sie können static für Membervariablen einer Klasse und nicht für lokale Variablen verwenden. Statische Variablen sind statisch und sind auch ohne Erstellen einer Instanz der Klasse zugänglich. Sie können sie also entweder in object.<static_variable_name> oder ClassName.<static_variable_name> verwenden. Sie sind zugänglich und enthalten für alle Instanzen der Klasse denselben Wert.

Zum Beispiel:

%Vor%

Nun, während Sie diese Klasse verwenden:

%Vor%

Hier können Sie beispielsweise statische Variablen verwenden, um die Anzahl der erstellten Objekte nachzuverfolgen, indem Sie im Konstruktor selbst ein Zählerinkrement setzen.

    
deej 07.01.2013 05:32
quelle
0

Eine Zeichenfolge kann sowohl als statisch als auch als endgültig deklariert werden. Die Vorteile des Deklarierens von Zeichenfolgen mit den beiden Zugriffsspezifizierern werden nachstehend erläutert.

Die Vorteile umfassen sowohl die Auswirkungen der endgültigen als auch der statischen.

  1. Eine als final deklarierte Zeichenfolge kann nicht neu zugewiesen werden. Die Zeichenfolge funktioniert als Konstante.

  2. Eine deklarierte Zeichenkette kann ohne Hilfe eines Objekts oder mit dem Klassennamen aufgerufen werden.

  3. Eine statische Variable behält die Kapselung nicht bei. Wenn eine statische Variable als final deklariert wird, kann kein Objekt den Wert ändern, kann aber darauf zugreifen.

    %Vor%

Die erste Anweisung in der main () -Methode gibt einen Fehler, da String str als final deklariert ist.

Die folgende Anweisung löst einen Kompilierungsfehler aus, da String str als final deklariert ist.

%Vor%

Echtzeitbeispiel

statisch final String Wahrheit="Die Sonne geht im Osten auf";

    
Achintya Jha 07.01.2013 05:28
quelle
0

Ich denke, es gibt keinen anderen Unterschied zwischen ihnen im Falle von Strings.

Im Fall von Multithreading sollten wir versuchen, Objekte unveränderlich zu machen, damit es nicht zu unerwünschten Zustandsänderungen in den Zuständen der Objekte kommen kann (wegen einer unsachgemäßen Synchronisation oder zur Vermeidung von Synchronisationsaufwand).

>

final keyword (an verschiedenen Stellen wie Klasse, Felder, Methoden) hilft bei der Verwendung von immutability, wenn es richtig verwendet wird, aber String s sind standardmäßig unveränderlich.

Im Falle der Vererbung können die finalen Methoden nicht überschrieben werden, aber das ist auch hier nicht der Fall.

    
vishal_aim 07.01.2013 05:45
quelle
0

final Static String - constant und es handelt sich um eine Klassenvariable, auf die zugegriffen werden kann, die aber von keiner Klasse geändert werden kann static String - Klassenvariable und keine Konstante, sie kann von jeder Klasse aus aufgerufen und geändert werden

    
Puneet 07.01.2013 06:01
quelle
0

Ich denke, die erste Anweisung wird oft verwendet, um eine String-Konstante zu definieren. Und der konstante Variablenname wird empfohlen, "TEST" statt "Test" zu sein.

%Vor%

Die zweite Aussage wird selten aus einem guten Grund verwendet. Dies kann zu Problemen mit dem gemeinsamen Zugriff im Multi-Thread-Kontext führen. Wir können private Instanz String-Feld in unserer Klasse haben:

%Vor%

Hoffe, das hilft!

    
Jacky 07.01.2013 06:03
quelle

Tags und Links