2013-10-19 19 views
5

Javaで次の質問が発生しました。内部クラスが外部クラスのメソッドで宣言されている場合、内部クラスのインスタンスを初期化する方法はありますか?私は次の場合にコンパイルエラーに遭遇しました。どうもありがとう。外部クラスのメソッドで内部クラスが宣言されている場合、内部クラスのインスタンスを初期化する方法はありますか?

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

メソッドローカルクラスは、そのメソッドでのみ使用できます。 –

答えて

6

できません。 Innerクラスは、method(int)メソッドに対してローカルです。

アクセスする場合は、より広い範囲で宣言する必要があります。

運命の病気のひねりで、反射を使用してインスタンスを取得できます。あなたは方法の種類Inner外の変数を宣言することはできませんので、例えば取る

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()); 
    } 
} 

これは反射せずに

class com.so.examples.Main$1Inner 

をプリントアウトし、あなたはそのメンバーのいずれかにアクセスすることはできません。

8

外部クラスのメソッドで内部クラスが宣言されている場合、内部クラスのインスタンスを初期化する方法はありますか?

できません。クラスのスコープはメソッド自体に限定されています。これは、メソッドの外部でローカル変数にアクセスできない理由と似ています。

JLS §6.3 - Scope of a Declarationより:

直ちにブロック(§14.2)で囲まれた局所クラス宣言の範囲は、それ自身のクラス宣言を含む、直ちに囲むブロックの残りの部分です。

+0

ありがとうRohit!私は懸命に努力しましたが、その方法を見つけることができません。今、私はそれができないことを理解しています – bean

+0

@beanメソッドの外側に置くだけです... 'class Outer {public static void main(String [] args){Inner inner = new Inner(); } public void method(){}クラス内部{}} ' – Radiodef

関連する問題