2013-10-19 15 views
5

Ho incontrato la seguente domanda in Java, come inizializzare un'istanza della classe interna se la classe interna è dichiarata nel metodo della classe esterna? Ho incontrato un errore di compilazione nel seguente caso. Grazie molto.Come inizializzare un'istanza della classe interna se la classe interna è dichiarata nel metodo della classe esterna?

class Outer { 
    public int a = 1; 
    private int b = 2; 
    public void method(final int c){ 
     int d = 3; 
     class Inner{ 
      private void iMethod(int e){ 
       System.out.println("a = " + a); 
       System.out.println("b = " + b); 
       System.out.println("c = " + c); 
       System.out.println("e = " + e); 
      } 
     }   
    } 
    public static void main (String[] args){ 
     Outer outer = new Outer(); 
     Outer.Inner inner = outer.new Inner();// there is an compile error here 
    } 
} 
+0

Le classi locali del metodo possono essere utilizzate solo in tale metodo. –

risposta

6

Non è possibile. La classe Inner è locale al metodo method(int).

Se si desidera accedervi, è necessario dichiararlo in un ambito più ampio.

In un tormento malato del destino, è possibile utilizzare la riflessione per ottenere un'istanza. Prendiamo ad esempio

package com.so.examples; 

class Main { 
    public void method(final int c){ 
     class Inner{ 
      public Inner() {} 
      private void iMethod(int e){ 
       System.out.println("inner method"); 
      } 
     }     
    } 

    public static void main (String[] args) throws Exception{ 
     Class clazz = Class.forName("com.so.examples.Main$1Inner"); 
     Constructor<?> constructor = clazz.getConstructor(new Class[]{Main.class}); 
     Object instance = constructor.newInstance(new Main()); 
     System.out.println(instance.getClass()); 
    } 
} 

Questo stampa

class com.so.examples.Main$1Inner 

senza riflessione, non è possibile accedere a qualsiasi dei suoi membri, perché non è possibile dichiarare una variabile di tipo Inner al di fuori del metodo.

8

come inizializzare un'istanza di classe interna se la classe interna è dichiarata nel metodo della classe esterna?

Non è possibile. Lo scopo della classe è limitato al metodo stesso. È simile al motivo per cui non è possibile accedere alle variabili locali al di fuori del metodo.

Da JLS §6.3 - Scope of a Declaration:

L'ambito di una dichiarazione di classe locale immediatamente chiusa da un blocco (§14.2) è il resto del block che racchiude, tra cui la propria dichiarazione di classe.

+0

Grazie Rohit! Ho provato molto ma non riesco a trovare un modo per farlo. Ora capisco che non è possibile farlo – bean

+0

@bean Basta metterlo fuori dal metodo ... 'class Outer {public static void main (String [] args) {Inner inner = new Inner(); } public void method() {} class Inner {}} ' – Radiodef

Problemi correlati