2013-06-21 20 views
18

Mi chiedo come un metodo non statico possa modificare una variabile di istanza statica. So che i metodi statici possono accedere solo ad altri metodi statici e variabili statiche. Tuttavia, l'altro lato è vero? I metodi non statici possono accedere solo a variabili non statiche? Ad esempio:I metodi non statici possono modificare le variabili statiche

public class SampleClass { 
    private static int currentCount = 0; 

    public SampleClass() { 
    currentCount++; 
    } 

    public void increaseCount() { 
    currentCount++; 
    } 
} 

Questo codice viene compilato e vorrei sapere perché in termini di privilegi di accesso statico.

+6

hai provato esso? –

+1

@Marco Sì, compila. Mi chiedo solo se le persone lo hanno documentato ovunque e se il mio ragionamento è corretto. –

+2

Non è proprio vero che i metodi statici non possono modificare le variabili di istanza. È solo che non hanno impliciti riferimenti "questo". Puoi scrivere 'class Ex {private int x; static void fn (ex ex) {ex.x = 12; }} '. A proposito: la statica mutevole è generalmente una cattiva idea. –

risposta

23

Ho trovato questo da The Java Tutorials

  • metodi di istanza può accedere alle variabili di istanza e metodi di istanza direttamente.
  • I metodi di istanza possono accedere direttamente alle variabili di classe e ai metodi di classe.
  • I metodi di classe possono accedere direttamente alle variabili di classe e ai metodi di classe.
  • I metodi di classe non possono accedere direttamente alle variabili di istanza o ai metodi di istanza, devono utilizzare un riferimento a un oggetto. Inoltre, i metodi di classe non possono utilizzare questa parola chiave in quanto non vi è alcuna istanza a cui fare riferimento.

Quindi la risposta è sì, i metodi non statici possibile modificare le variabili statiche

15

No, qualsiasi metodo non statico ha accesso ai membri statici. L'unico modo in cui ciò sarebbe falso è se il contesto non statico non ha accesso al membro statico (ad esempio, il membro statico è privato in una classe e il codice non statico non è in quella classe). esistono variabili statiche per fornire un metodo/variabile libero da istanze, quindi, ad esempio, se abbiamo una classe di gioco e una variabile di alto livello, il punteggio sarebbe statico (accessibile senza un'istanza) e dopo ogni gioco (un'istanza della classe Game) Completa potremmo modificare il punteggio dal nostro contesto non statico se il nostro punteggio è maggiore del punteggio più alto.

+0

Grazie amico. Non sapevo nulla della cosa privata e mi stava venendo mal di testa qui ... –

0

Guardalo in questo modo. È possibile accedere a una variabile statica in molti modi. Uno dei più comuni è precedere il nome var con il nome della classe, poiché le variabili statiche sono per classe. Poiché si fa riferimento a questa variabile nella stessa classe, si è esenti da che deve essere preceduto dal nome della classe. Non importa dove chiami la variabile statica. Anche questa è una var statica privata non accessibile da nessun'altra classe.

0

metodi statici non possono modificare i campi non statici dal - Per utilizzare un campo non statico (al di fuori della classe) è necessario creare un'istanza di un oggetto classe, Ma per l'utilizzo di un metodo statico non è necessario alcun tipo di istanziazione degli oggetti. Questo è il motivo per cui non è ragionevole per un metodo non statico (che non richiede un'istanza dell'oggetto) per modificare un campo che dovrebbe essere istanziato.

Per questo: i metodi statici possono toccare solo campi statici (o chiamare altri metodi statici).

Ma come hai detto è possibile, Un metodo non statico può modificare un campo statico che è statico per tutti gli oggetti della sua classe.

0

Le variabili statiche sono variabili di classe non di istanza o variabili locali. è per questo che possiamo usare anche variabili statiche in metodo non statico. e le variabili statiche non sono per oggetto. le variabili statiche hanno una copia che verrà utilizzata nell'intero programma.

5

I metodi non statici possono accedere a variabili statiche. I metodi statici possono accedere solo a variabili statiche o metodi direttamente senza creare object.ex: public static void main (String arg [])

+0

Senza * usare * un oggetto. Potrebbe essere fornito come parametro. – EJP

0

I membri statici non sono membri di istanza, questi sono condivisi per classe, quindi in pratica qualsiasi metodo di istanza può accedi a questi membri statici.

0

metodi non statici possono accedere entrambe le variabili statiche & metodi statici come essi membri della classe

Demo Code

public class Static_Class { 
    protected static String str; 
    private static int runningLoop; 

    static{ 
     str = "Static Block"; 
    } 

    /** 
    * Non-Static Method Accessing Static Member 
    */ 
    public void modifyStaticMember(){ 
     str = "Non-Static Method";  
    } 

    /** 
    * Non-Static Method invoking Static Method 
    */ 
    public void invokeStaticMethod(){ 
     String[] args = {}; 
     if(runningLoop == 0){ 
      runningLoop++; 
      main(args); 
     } 
     //Exiting as it will lead to java.lang.StackOverflowError 
     System.exit(0); 
    } 

    public static void main(String[] args) { 
     Static_Class instance = new Static_Class(); 
     System.out.println(str); 
     instance.modifyStaticMember(); 

     // Changed Value persists 
     System.out.println(str); 

     //Invoking Static Method 
     instance.invokeStaticMethod(); 

    } 
} 
0

Sì, un metodo statico può accedere a una variabile non statico. Questo viene fatto creando un oggetto alla classe e accedendo alla variabile attraverso l'oggetto. Nell'esempio seguente, main è un metodo statico che accede alla variabile a, che è una variabile non statica.

codice demo:

public class Sample { 

    private int a; 

    void method() 
    { 
     System.out.println("i am a private method"); 
    } 

    public static void main(String[] args) 
    { 
     Sample sample=new Sample(); 
     sample.a=10; 
     System.out.println(sample.a); 
    } 
}