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

Hui*_*ang 5 java inner-classes

我在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
    }
}
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 8

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

你不能.该类的范围仅限于方法本身.它类似于您无法访问方法之外的局部变量的原因.

来自JLS§6.3 - 声明的范围:

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


Sot*_*lis 6

你不能.该Inner班是本地method(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());
    }
}
Run Code Online (Sandbox Code Playgroud)

打印出来

class com.so.examples.Main$1Inner
Run Code Online (Sandbox Code Playgroud)

如果没有反射,则无法访问其任何成员,因为您无法Inner在方法之外声明类型的变量.