Diferența dintre „final static String” și „static String”? [închis] (Programare, Java)

sigh a intrebat.
a intrebat.
public static final String Test = "ABC";
public static String Test = "ABC";

Vă rog să arătați diferența dintre „final static String” și „static String” în java. cu excepția celui final care nu poate fi schimbat, Care sunt celelalte diferențe? Mulțumesc.când în circumstanțe mai complexe, cum ar fi multithreading și moștenire, nu s-a schimbat nimic?

Comentarii

  • Asta este ceea ce înseamnă. Sfârșit de poveste. –  > Por Ignacio Vazquez-Abrams.
  • Da, nimic mai mult. Cu excepția faptului că sporește lizibilitatea codului. –  > Por Vamsi Mohan Jayanti.
  • @VamsiMohanJayanti Ce? Folosind final produce un comportament diferit. Ce are de-a face cu lizibilitatea? –  > Por ApproachingDarknessFish.
  • atunci când în circumstanțe mai complexe, cum ar fi multithreading și moștenirea ….. –  > Por suspine.
  • @ValekHalfHeart. Da, puteți să vă dați seama cu ușurință de referințele numai pentru citire și să vă concentrați pe restul. Există câteva fire de discuție în care se discută deja. stackoverflow.com/questions/4279420/… , stackoverflow.com/questions/500508/… , programmers.stackexchange.com/questions/108349/… -.  > Por Vamsi Mohan Jayanti.
14 răspunsuri
Pankaj Kumar

Deși descrierea de mai jos luată din documentul Android, dar ar putea ajuta pentru această întrebare cu etichete Java.

Luați în considerare următoarea declarație în partea de sus a unei clase:

static int intVal = 42;
static String strVal = "Hello, world!";

Compilatorul generează o metodă de inițializare a clasei, numită , care este executată atunci când clasa este utilizată pentru prima dată. Metoda stochează valoarea 42 în intVal și extrage o referință din tabelul de constante de șiruri de caractere din fișierul de clasă pentru strVal. Atunci când aceste valori sunt menționate ulterior, ele sunt accesate cu ajutorul căutărilor de câmpuri.

Putem îmbunătăți situația cu ajutorul cuvântului cheie „final”:

static final int intVal = 42;
static final String strVal = "Hello, world!";

Clasa nu mai are nevoie de o metodă, deoarece constantele sunt introduse în inițializatoarele de câmp static din fișierul dex. Codul care se referă la intVal va utiliza direct valoarea întreagă 42, iar accesarea strVal va utiliza o instrucțiune relativ ieftină „string constant” în loc de o căutare de câmp.

Notă:

Această optimizare se aplică numai tipurilor primitive și constantelor String, nu și tipurilor de referință arbitrare. Cu toate acestea, este o bună practică să declarați constantele static finale ori de câte ori este posibil.

Sper că acest lucru va fi clar.

Mai multe detalii la UseFinal

user948620

Când vine vorba de variabilele

  • final Static String – constantă și este o variabilă de clasă
  • static String – variabilă de clasă și nu o constantă

Evgeniy Dorofeev

aici este mai mult

static final String s1;
static String s2;

linia 1 nu se compilează, linia 2 se compilează

și mai sunt și altele pentru tipurile primitive.

final int x = 1;

void x() {
    int y = x + 1;
}

bytecode

ICONST_2
ISTORE 1

înseamnă int y = 2 deoarece x este o constantă (deși nu este statică)

dacă schimbăm

int x = 1;

bytecode

ALOAD 0
GETFIELD Test1.x : I
ICONST_1
IADD
ISTORE 1

JVM citește x și calculează y

Comentarii

  • Linia s1 nu compilează doar pentru că ați declarat-o constantă, dar nu i-ați stabilit o valoare nici direct, nici printr-un inițializator static. –  > Por Charlie.
  • Da, aceasta a fost pentru a arăta diferența dintre „final static String” și „static String” –  > Por Evgeniy Dorofeev.
  • când în circumstanțe mai complexe, cum ar fi multithreading și moștenire, nu s-a schimbat nimic? –  > Por sigh.
  • final este doar pentru compilatorul Java, nu afectează timpul de execuție –  > Por Evgeniy Dorofeev.
Karthik T

În conformitate cu wiki

Dacă variabila este o referință, aceasta înseamnă că variabila nu poate fi legată din nou pentru a face referire la un alt obiect. Dar obiectul la care face referință este încă mutabil, dacă a fost inițial mutabil.

Cu toate acestea, deoarece String este imuabilă la început, , variabila diferența este irelevantă. în acest caz, și este doar o variabilă care nu poate fi modificată în niciun fel.

Peștele care se apropie de întuneric

Ai spus-o chiar tu: cea finală nu poate fi atribuită. Din câte știu eu, nu se poate folosi final modificator nu oferă un alt comportament în afară de acesta. Singurul lucru la care mă pot gândi este că, în timp ce Test este public, , static, , și final, , compilatorul va înlocui automat toate aparițiile lui Test în codul dvs. și le va înlocui cu String Literal "ABC", , deși, deoarece String-ul va fi internalizat, nu va avea niciun efect asupra codului. Practic, final împiedică atribuirea String-ului la o referință diferită, asta este tot.

Comentarii

  • La fel și în multithreading? –  > Por sigh.
  • Nu am prea multă experiență cu multithreading, dar final este final (cel puțin în java). Nu-mi pot imagina că are importanță; să mă corecteze cineva dacă mă înșel. –  > Por ApproachingDarknessFish.
Richard Dong

A final clasă nu poate fi subclasată. Este ca și cum ar fi sealed clasa din C#.

A final metodă nu poate fi suprascrisă.

A final câmp poate fi inițializat/atribuit doar o singură dată, ca o constantă, dar poate să nu fie neapărat cunoscut în momentul compilării.

A static membru este partajat pentru toate instanțele unei clase.

Așadar, static final este, de obicei, pentru ceva ce nu se mai modifică niciodată, dar nu este neapărat codificat în momentul compilării.

Sunil Gulabani

Clasa java compilată are ca rezultat o performanță mai rapidă atunci când se declară o variabilă java ca fiind statică finală.

Verificați acest lucru

Comentarii

  • când în circumstanțe mai complexe, cum ar fi multithreading și moștenire, nu s-a schimbat nimic? –  > Por sigh.
  • Performanța contează întotdeauna în ceea ce privește inițializarea în timp de compilare și inițializarea în timp de execuție. –  > Por Sunil Gulabani.
Prince

Variabilele finale sunt variabile de instanță, ale căror valori nu pot fi modificate după ce au fost inițializate.

Dar variabilele statice aparțin unei clase. Aceasta ‘va fi partajată între toate instanțele. Astfel, atunci când modificați valoarea unei variabile statice într-o instanță, aceasta se reflectă în toate instanțele.

slggamer

Nu puteți modifica referința finală ca mai jos

public static final String Test1 = "ABC";
public static String Test2 = "ABC";
public static void testFinal()
{
    Test2 = Test1; //ok
    Test1 = Test2; //fail
}

Comentarii

  • Știam asta de mult timp… dar mulțumesc oricum. –  > Por sigh.
deej

Poftim:

1) final static String: Când spui final este o constantă și nu-i poți modifica valoarea pe tot parcursul programului. Nu este o variabilă, nu-i poți modifica valoarea. În Java folosim cuvântul cheie final pentru a declara constante. Trebuie să folosim majuscule și sublinieri pentru a separa cuvintele în timpul declarării constantelor. De exemplu: MAX_INPUT_TIME, CONNECTION_POOL_SIZE, MAX_USER etc.

2) static String: Puteți utiliza static pentru variabilele membre ale unei clase și nu pentru variabilele locale. Variabilele statice sunt statice și sunt accesibile chiar și fără a crea o instanță a clasei. Prin urmare, le puteți utiliza fie prin object.<static_variable_name> fie ClassName.<static_variable_name>. Ele sunt accesibile și păstrează aceeași valoare pentru toate instanțele clasei.

De exemplu:

Class A {
  static int counter;  // it will be default to 0
}

Acum, în timp ce utilizați această clasă:

System.out.println(A.counter);  // output: 0
A.counter++;
System.out.println(A.counter);  // output: 1
// Declare an instance of class A
A o1 = new A();
o1.counter++;
System.out.println(o1.counter);  // output: 1
// Declare another instance of class A
A o2 = new A();
System.out.println(o1.counter);  // output: 1  
# You still get it one and not 0, if it was non-static you would get it as 0;

Aici, de exemplu, puteți utiliza variabilele statice pentru a ține evidența numărului de obiecte create prin introducerea unui contor de incrementare în constructorul propriu-zis.

Comentarii

  • Nu am compilat acest cod, dar ar trebui să vă dea o idee despre diferența și conceptul ambelor clase. –  > Por deej.
Achintya Jha

Un șir de caractere poate fi declarat atât static, cât și final. Avantajele declarării unui șir de caractere cu ambii specificatori de acces sunt prezentate mai jos.

Avantajele includ ambele efecte ale definiției finale și statice.

  1. Un șir de caractere declarat final nu poate fi realocat. Șirul funcționează ca o constantă.

  2. Un șir de caractere declarat static poate fi apelat fără ajutorul unui obiect sau cu numele clasei…

  3. O variabilă statică nu menține încapsularea. Declarând o variabilă statică ca fiind finală, niciun obiect nu îi poate modifica valoarea, dar o poate accesa.

    public class Demo {
    
    static final String str = "Hello";
    
    public static void main(String args[]) {
    // str = "world"; // gives error
    System.out.println(str); // called without the help of an object
    System.out.println(Demo.str);// called with class name
    
    }
    }
    

Prima instrucțiune din metoda main() dă eroare deoarece șirul de caractere str este declarat ca final.

Următoarea instrucțiune generează o eroare de compilare deoarece string str este declarat ca final.

Demo d1 = new Demo();
d1.str =  "World";

Exemplu în timp real

static final String truth = „Soarele răsare în est”;

vishal_aim

Cred că nu există alt diferență între ele în cazul șirurilor de caractere.

În cazul multithreading-ului, ceea ce se sugerează este că ar trebui să încercăm să facem obiectele imuabile, astfel încât să nu existe riscul unor schimbări de stare nedorite în stările obiectelor (din cauza unei sincronizări necorespunzătoare sau pentru a evita cheltuielile de sincronizare).

final Cuvântul cheie (în diferite locuri, cum ar fi clasa, câmpurile, metodele) ajută la obținerea imutabilității dacă este utilizat în mod corespunzător, dar Strings sunt implicit imuabile.

În cazul moștenirii, metodele finale nu pot fi suprascrise, dar, din nou, acest lucru nu este cazul aici.

Puneet

final Static String – constantă și este o variabilă de clasă poate fi accesată, dar nu poate fi modificată din orice clasăstatic String – variabilă de clasă și nu o constantă, poate fi accesată și modificată din orice clasă.

Comentarii

  • În cazul clasei String, pentru a face clasa String imuabilă, aceasta este implicit finală, dacă vă gândiți la nivel de arhitectură, menținem un grup de String și multe referințe se referă la un singur obiect String, atunci când trebuie să modificăm valoarea oricăruia dintre ele, JVM creează un nou obiect cu o nouă referință, iar restul referințelor se referă la același obiect.  > Por Puneet.
Jacky

Cred că prima afirmație este adesea utilizată pentru a defini o constantă String. Iar numele variabilei constante este recomandat să fie „TEST” în loc de „Test”.

public static final String TEST = "ABC";

A doua afirmație este rareori folosită dintr-un motiv întemeiat. Poate cauza probleme de concurență în context multi-thread. În clasa noastră putem avea un câmp String ca instanță privată:

private String test = "ABC";

Sper că acest lucru vă ajută!

Tags: