E' giusto che faccia così: è una questione di visibilità delle variabili.

Ogni variabile (che sia un oggetto o un tipo di dato primitivo) è visibile solamente nel blocco in cui è definita ed in quelli in esso innestati. Al di fuori di essi la variabile non è visibile.

Per aiutarti a capire se una variabile è visibile in un blocco o meno dovresti tenere presente la struttura di annidamento di ogni blocco (un blocco è una porzione di codice racchiusa dalle parentesi graffe, questo significa un metodo, un ciclo for o while, un blocco if...).
A questo punto osservi a che livello di annidamento è stata DICHIARATA la variabile e sai che tutte le parti di codice ad un livello più interno (ma appartenente a quello) possono vederla. Per capirlo pensa ad una cosa del genere: quando entri nella classe sei all'entrata di una stanza; tutto ciò che vedi all'interno di questa stanza lo conoscono anche tutte le persone che sono dentro a tutte le porte che ci sono in quella stanza (tutti i metodi della classe), perchè, per entrare nella porta, devono essere passati da lì; a questo punto ti sposti dentro ad un metodo ed è come se aprissi una delle perte di quella stanza; quando sei dentro questa porta hai davanti una nuova stanza con, magari, altre porte e altre cose; a questo punto conosci tutti gli oggetti che ci sono nella stanza, ma anche quelli della stanza precedente per la quale sei passato.

Questo è un esempio di codice con relative visibilità:
codice:
class MiaClasse {
   int variabile; // questa variabile sarà visibile OVUNQUE: è dentro la prima stanza!

   public MiaClasse() {
      // Qui sono in una stanza, ho aperto una porta della stanza principale
      variabile = 0; // Posso farlo: variabile è dichiarata in una stanza per la quale sono già passato
      int a; // questa è visibile solo qui dentro e nelle parti di codice interne
   }

   public mioMetodo() {
      // Ho aperto una porta della stanza principale
      a = 2; // ERRORE: questa io non la conosco; per arrivare qui non sono passato per la stanza MiaClasse()
      for (int i=0; i<50; i++) {
         // Questo è un blocco dove è stata definita la variabile i: la vedo solo qui dentro!!
         System.out.println(i);
      }
   }
}
Spero di essere stato abbastanza chiaro. L'argomento non è dei più semplici e tutti (o quasi) appena iniziano a programmare prima o poi si scontrano con questo problema.
Altri preferiscono una rappresentazione ad albero per evidenziare la visibilità (o scoping) delle variabili, ma io, personalmente, non lo trovo molto intuitivo... preferisco la storiella delle stanze (me la sono inventata apposta per spiegare lo scoping ad un mio amico e ho notato che ha funzionato).

Per altri chiarimenti, sono sempre disponibile.

Ciao.