Java >> Java tutorial >  >> Tag >> static

Hvorfor kan vi ikke få adgang til statisk indhold via ikke-initialiseret lokal variabel?

§15.11. Feltadgangsudtryk :

Hvis feltet er statisk :

Det primære udtryk evalueres, og resultatet kasseres . Hvis evalueringen af ​​det primære udtryk afsluttes brat, fuldføres feltadgangsudtrykket brat af samme årsag.

Hvor det tidligere står, at feltadgang er identificeret med Primary.Identifier .

Dette viser, at selvom det ikke ser ud til at bruge Primary , bliver det stadig evalueret, og resultatet kasseres derefter, hvorfor det skal initialiseres. Dette kan gøre en forskel, når evalueringen stopper adgangen som angivet i citatet.

EDIT:

Her er et kort eksempel blot for at vise visuelt, at Primary evalueres, selvom resultatet kasseres:

class Foo {
    public static int x = 1;
    
    public static Foo dummyFoo() throws InterruptedException {
        Thread.sleep(5000);
        return null;
    }
    
    public static void main(String[] args) throws InterruptedException {
        System.out.println(dummyFoo().x);
        System.out.println(Foo.x);
    }
}

Her kan du se den dummyFoo() evalueres stadig, fordi print er forsinket med de 5 sekunder Thread.sleep() selvom det altid returnerer en null værdi, som kasseres.

Hvis udtrykket ikke blev evalueret, er print vises med det samme, hvilket kan ses, når klassen Foo bruges direkte til at få adgang til x med Foo.x .

Bemærk: Metodekald betragtes også som en Primary vist i §15.8 Primære udtryk.


Kapitel 16. Definite Assignment

Hver lokal variabel (§14.4) og hvert tomt sidste felt (§4.12.4, §8.3.1.2) skal have en bestemt tildelt værdi, når der sker adgang til dens værdi.

Det er lige meget hvad du forsøger at få adgang via en lokal variabel. Reglen er, at det bestemt skal tildeles før det.

For at evaluere et feltadgangsudtryk foo.x , primary en del af det (foo ) skal evalueres først. Det betyder, at adgang til foo vil forekomme, hvilket vil resultere i en kompileringsfejl.

For hver adgang til en lokal variabel eller tomt sidste felt x skal x tildeles definitivt før adgangen, eller der opstår en kompileringsfejl.


Der er værdi i at holde reglerne så enkle som muligt, og "brug ikke en variabel, der måske ikke er blevet initialiseret" er så enkelt, som det bliver.

Mere til sagen er der en etableret måde at kalde statiske metoder - brug altid klassenavnet, ikke en variabel.

System.out.println(Foo.x);

Variablen "foo" er uønsket overhead, der bør fjernes, og kompilatorfejl og advarsler kunne ses som medvirkende til at føre til det.


Java tag