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
    }
}
4

2 回答 2

8

如果在外部类的方法中声明了内部类,如何初始化内部类的实例?

你不能。类的范围仅限于方法本身。这类似于为什么您不能访问方法之外的局部变量。

来自JLS §6.3 - 声明范围

由块(第 14.2 节)直接包围的局部类声明的范围是直接封闭块的其余部分,包括它自己的类声明。

于 2013-10-19T20:23:43.183 回答
6

你不能。该类Innermethod(int)方法的本地类。

如果要访问它,则需要在更大的范围内声明它。

在命运的扭曲中,您可以使用反射来获取实例。举个例子

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

没有反射,你不能访问它的任何成员,因为你不能Inner在方法之外声明一个类型的变量。

于 2013-10-19T20:23:42.910 回答