2013-07-17 7 views
11

Quando stavo leggendo un libro su Java, ho visto un esempio scritto in questo modo. E mi chiedo se posso dichiarare una variabile al di fuori del metodo principale? Qual è la differenza tra dichiarare la variabile all'esterno e all'interno del metodo principale? qual è il ruolo di "statico" qui? Per favore qualcuno mi spiega? Sono nuovo di java.Qual è la differenza tra la dichiarazione della variabile dal metodo principale e il metodo principale interno?

public class Printstuff { 
     static int an_integer = 0; 
     public static void main(String[] args) { 
      int an_integer = 2; 
      String[] some_strings = {"Shoes", "Suit", "Tie" }; 
      an_integer = an_integer - 1; 
      some_strings[an_integer] = some_strings[an_integer] +"+++"; 
      for (int i = 0; i < some_strings.length; i++) 
      System.out.println(some_strings[Printstuff.an_integer]); 
     } 
    } 

Cordiali saluti.

risposta

12

1) All'interno vs Esterno:

Se si dichiara l'oggetto all'interno un metodo, che sarà visibile solo in questo metodo. Fondamentalmente, se le metti tra parentesi, è visibile/accessibile solo all'interno di queste parentesi.

Se si dichiara l'oggetto al di fuori il metodo (all'interno della classe), che dipende dal access modifier.
Per impostazione predefinita, è visibile/accessibile da quella classe e dall'intero pacchetto.

2) statici

mezzi statici, quali l'oggetto/variabile appartiene alla classe stessa, e non ai suoi oggetti.

Esempio:

public class Members { 

    static int memberCount; 

    public Members() { 
    memberCount++; 
    } 
} 

memberCount esiste solo una volta, non importa quanti oggetti della classe esiste. (anche prima che venga creato qualsiasi oggetto!)

Ogni volta che si crea un nuovo oggetto di Members, memberCount viene aumentato. Ora puoi accedervi in ​​questo modo: Members.memberCount

3

Dichiarare una variabile nel metodo principale lo renderà disponibile solo nella principale. Dichiarare una variabile all'esterno lo renderà disponibile per tutti i metodi della classe, incluso il metodo principale.

Esempio:

public class Foo { 
    private String varOne = "Test"; 

    public void testOne() { 
    System.out.println(varOne); 
    System.out.println(varTwo); // Error, this variable is available in the testTwo method only 
    } 

    public void testTwo() { 
    String varTwo = "Bar"; 
    System.out.println(varOne); // Will display "Test" 
    System.out.println(varTwo); // Will display "Bar" 
    } 
} 
+0

fuori dalla classe per altre classi nello stesso pacchetto – nachokk

+1

@nachokk: solo in questo caso. Dipende dallo specificatore di accesso. – pratZ

+1

Questo codice non verrà compilato, poichè 'varOne' non è statico, quindi non è possibile accedervi dal metodo statico' main() '. – bcsb1001

1

C'è una differenza ambito. E devi dichiararlo come statico perché la tua funzione principale è statica, quindi ti permette di usare solo variabili statiche. Variabile che dichiara che il metodo principale all'interno sarebbe utilizzato solo all'interno del metodo principale.

Ora potreste chiedervi perché ho bisogno di avere il metodo principale come statico !!! Come qualsiasi applicazione in java verrà eseguito dal metodo principale in modo che possa essere chiamato solo dal nome della classe senza creare alcun oggetto, quindi lo stiamo definendo come statico. Tutto il metodo statico può chiamare con riferimento alla classe, nessun oggetto necessario.

+0

Grazie era chiaro. –

1

La differenza è ora il tuo an_integer ha più portata.

Esempio se si dispone di un altro metodo.

public class Printstuff { 
     static int an_integer = 0; 
     public static void main(String[] args) { 
      int an_integer = 2; 
      String[] some_strings = {"Shoes", "Suit", "Tie" }; 
      an_integer = an_integer - 1; 
      some_strings[an_integer] = some_strings[an_integer] +"+++"; 
      for (int i = 0; i < some_strings.length; i++) 
      System.out.println(some_strings[Printstuff.an_integer]); 
     } 

     public void anotherMethod(){ 
     an_integer++; 
     } 


    } 

Come dichiarato

<default package> int an_integer=0;

Tutti clases nello stesso pacchetto ha accesso a questa variabile.

+0

Grazie era chiaro –

+0

Siete i benvenuti, considerate di accettare qualsiasi risposta e di svalutare quelli che vi permettono di capire :) – nachokk

1

Ciò a cui ti riferisci è lo scopo di una variabile.

variabili all'interno metodi sono accessibili solo all'interno di questo metodo, cioè an_integer all'interno main -method non può fare riferimento fuori del metodo main. Le variabili possono anche avere ambiti più ristretti, per esempio all'interno di loop. La classica variabile iterating di un ciclo for è disponibile solo nel suo ciclo, dopodiché è scomparsa.

Le variabili esterne ai metodi sono denominate campi. Dipende dal suo modificatore di accesso dove può essere visto. I campi Private, ad esempio, sono disponibili solo all'interno di questa classe, i campi public sono accessibili da qualsiasi luogo (altri modificatori di accesso sono protected e nessuno, che ricade su un valore predefinito). Fondamentalmente, puoi usare un campo all'interno di una classe per accedere al suo valore da ogni metodo all'interno di questa classe, ma questo potrebbe essere pericoloso se più thread accedono alla stessa istanza di una classe, ma questa è tutta un'altra storia.

Un campo e una variabile locale possono avere lo stesso nome, il che può causare confusione. Generalmente preferisco non farlo, o, forse meglio, fare sempre riferimento ai campi con un accessorio this. Non sono pienamente sicuro se ci sia una preferenza per variabili locali rispetto a campi con lo stesso nome, ma suppongo che le variabili locali abbiano una priorità più alta nel determinare quale fosse il significato di una.

Static indica che questa variabile non appartiene a un'istanza di una classe, ma alla classe stessa. I campi (e i metodi) Static possono essere letti (o richiamati) senza dover prima inizializzare la classe. Un esempio potrebbe essere un valore standard di una classe, o forse un metodo factory (se è un metodo). I campi Static possono anche essere utili per le costanti, insieme al modificatore final. Un campo public final static è praticamente una costante globale.

3

Sono incuriosito che nessuno abbia menzionato la memoria. Molti anni fa, l'istanziazione all'interno di main() assegnava la variabile allo stack, mentre l'istanziazione di main avrebbe assegnato la variabile all'heap. A quei tempi, i sistemi avevano stack molto piccoli, quindi non controllare questi dettagli causerebbe un overflow dello stack molto più facile. Tuttavia, non sono un esperto di architettura della memoria, vorrei che qualcuno potesse contribuire a questo sottile dettaglio applicabile all'architettura/memoria SW corrente.

Problemi correlati