2010-03-23 9 views
2

Auparavant, j'avais un problème lorsqu'une classe anonyme interne ne voyait pas de champ de la classe "externe". J'avais besoin de faire une dernière variable pour la rendre visible à la classe interne. Maintenant, j'ai une situation opposée. Dans la classe "externe" "ClientListener" j'utilise une classe interne "Thread" et la classe "Thread" j'ai la méthode "run" et je vois le "earPort" de la classe "outer"! Pourquoi?Pourquoi ma classe interne voit-elle une variable NON statique?

import java.io.IOException; 
import java.net.*; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 

public class ClientsListener { 

    private int earPort; 

    // Constructor. 
    public ClientsListener(int earPort) { 
     this.earPort = earPort; 
    } 

    public void starListening() { 

     Thread inputStreamsGenerator = new Thread() { 
      public void run() { 
       System.out.println(earPort); 
       try { 
        System.out.println(earPort); 
        ServerSocket listeningSocket = new ServerSocket(earPort); 
        Socket serverSideSocket = listeningSocket.accept(); 
        BufferedReader in = new BufferedReader(new InputStreamReader(serverSideSocket.getInputStream())); 
       } catch (IOException e) { 
        System.out.println(""); 
       } 
      } 
     }; 
     inputStreamsGenerator.start();  
    } 

} 
+1

Je aime cette fonctionnalité de Java. – CiscoIPPhone

Répondre

12

Les classes internes anonymes ont accès aux variables statiques et d'instance. Si vous souhaitez avoir également accès aux variables locales, déclarez-les comme définitives. Voici comment cela fonctionne :)

1

Votre classe interne anonyme a accès aux attributs de l'objet conteneur. Toutes les classes internes qui ne sont pas déclarées static ont un accesseur implicite.

Si vous voulez éviter que cela se produise, vous pouvez déclarer une classe interne statique et instancier que:

public class ClientsListener { 

    private int earPort; 

    // Constructor. 
    public ClientsListener(int earPort) { 
     this.earPort = earPort; 
    } 

    public void starListening() { 

     Thread inputStreamsGenerator = new InputStreamsGenerator(); 
     inputStreamsGenerator.start();  
    } 

    private static class InputStreamsGenerator extends Thread() { 
     public void run() { 
      // no access to earport in next line (can make it a constructor argument) 
      System.out.println(earPort); 
      try { 
       System.out.println(earPort); 
       ServerSocket listeningSocket = new ServerSocket(earPort); 
       Socket serverSideSocket = listeningSocket.accept(); 
       BufferedReader in = new BufferedReader(new InputStreamReader(serverSideSocket.getInputStream())); 
      } catch (IOException e) { 
       System.out.println(""); 
      } 
     } 
    }; 
} 
Questions connexes