2014-06-17 13 views
9
class construct{ 
     public construct(){ 
     System.out.println("no args constructer"); 
     } 
     //other methods 
} 
class two{ 
     static construct d = new construct();// this is legal 
     public static void main(String[] args){ 
     static int c =0;//but why this is not-----showing illegal start of expression 
     } 
} 

Quindi, perché non è possibile dichiarare una variabile statica all'interno di una funzione?perché non possiamo dichiarare variabili statiche all'interno di un corpo di una funzione anche quando la funzione è statica?

+5

Perché farlo avrebbe senso? Quando si parla di variabili che sono solo nell'ambito del corpo del metodo, non ha senso dire che sono "di classe". – awksp

+0

Perché non è sensato e/o ridondante al meglio. –

+1

@ user3580294 Sto cercando di dichiarare una variabile (questo codice non reale) all'interno di un ciclo statico in modo che il suo valore non cambi mai con l'iterazione successiva. – YakRangi

risposta

3

Dichiarare la variabile come finale, non come statica.

Statico indica che ce n'è uno per classe e non uno per istanza della classe. Finale significa che non può essere modificato dopo la creazione. (Sebbene si noti che fare un riferimento finale non rende la classe a cui fa riferimento immutabile).

In altre parole se si dispone di un

final String[] array = new String[3]; 

non è più possibile modificare quella variabile, ad esempio, se si voleva assegnare ad essa un nuovo array con dimensioni diverse non si poteva. Tuttavia è possibile modificare il contenuto dell'array.

array[0] = "test"; 

Perché questo modifica i contenuti, non la matrice stessa.

La stessa cosa vale per qualsiasi oggetto mutabile.

+0

ma array [0] è anche un riferimento alla stringa "test", e l'abbiamo riprogrammata anche se la matrice è definitiva, quindi è per questo che hai menzionato questa riga in(). – YakRangi

+0

@Bayant_singh 'final String [] array' significa che è il * riferimento * che è' final', non l'oggetto a cui punta. – awksp

+0

@Bayant_singh Penso che tu abbia ragione, tuttavia la tua formulazione è un po 'vaga. Pensalo come un armadio. Rendendo finale l'armadio lo stai costruendo nel muro. Non puoi più muovere la credenza ma puoi ancora mettere le cose dentro e tirarne fuori le cose. –

13

È necessario rendere statico final static o rimuovere static.

In Java, static significa che è una variabile/metodo di una classe, appartiene all'intera classe ma non a uno dei suoi determinati oggetti. Ciò significa che la parola chiave static può essere utilizzata solo in un "scope di classe".

Generalmente, in C, è possibile disporre di variabili con ambito locale allocate in modo statico. Sfortunatamente questo non è direttamente supportato in Java. Ma puoi ottenere lo stesso effetto usando le classi annidate.

Ad esempio, è consentito quanto segue, ma è una cattiva progettazione, poiché l'ambito di x è molto più grande di quanto non debba essere. Inoltre esiste una dipendenza non ovvia tra due membri (x e getNextValue).

static int x = 42; 
public static int getNextValue() { 
    return ++x; 
} 

Si vorrebbe veramente fare quanto segue, ma non è legale:

public static int getNextValue() { 
    static int x = 42;    // not legal :-(
    return ++x; 
} 

Tuttavia si potrebbe fare questo, invece,

public static class getNext { 
    static int x = 42; 
    public static int value() { 
     return ++x; 
    } 
} 

E 'meglio di ingegneria, a scapito di un po 'di bruttezza.

+6

Solo perché Java non lo consente non significa che 'static' non possa avere senso nei metodi." Certo, potrebbe, ad esempio, 'static int getNextCounter() {static int x = 0; return x ++; } 'potrebbe restituire valori crescenti, e potresti essere sicuro che nessun altro metodo potrebbe modificare' x', perché avrebbe solo lo scopo di quel metodo. Solo perché qualcosa non è incluso nella lingua non significa che non ha senso che abbia senso. –

8

Altre persone hanno spiegato come gestirlo a livello di codice. Consentitemi di spiegare le ragioni logiche e filosofiche per cui la staticità all'interno di un metodo non ha senso. Devi porre la domanda "Quanto vuoi che duri la variabile?".

  • normali variabili membro durare quanto l'istanza fanno parte;
  • variabili dichiarate all'interno di un metodo fino all'uscita dal metodo;
  • variabili di classe statiche ultimi per tutta la durata della classe (vale a dire per sempre per la maggior parte degli scopi)

Quindi, per quanto tempo volete che il vostro variabile 'statica all'interno di un metodo' per l'ultima volta?Se è fino alla fine del metodo, puoi semplicemente usarlo senza statico. Se è per la durata della classe, puoi dichiararlo come variabile membro statica. Quali altre opzioni ci sono?

C++ consente la statica all'interno di un metodo, ma finiscono per comportarsi proprio come una variabile di classe statica, ma con ambito ridotto. Anche in C++ vengono usati raramente. Inoltre finiscono per essere memorizzati esattamente come le variabili dei membri statici.

I progettisti Java hanno deciso che la piccola quantità di vantaggio non valeva la complessità aggiuntiva del linguaggio.

+5

"Se è valido per tutta la durata della classe, è possibile dichiararlo come variabile membro statica. Quali altre opzioni ci sono?" Ma quello che non ottieni qui è la garanzia che qualche altro metodo nella classe non lo modifichi. Questo è ciò che una variabile statica in un metodo ti darebbe (come fai notare): portata limitata. Lo scopo limitato lo rende * più facile * ragionare sul comportamento di un programma. –

Problemi correlati