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)
如果在外部类的方法中声明内部类,如何初始化内部类的实例?
你不能.该类的范围仅限于方法本身.它类似于您无法访问方法之外的局部变量的原因.
由块(第14.2节)直接包含的本地类声明的范围是直接封闭块的其余部分,包括它自己的类声明.
你不能.该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在方法之外声明类型的变量.
| 归档时间: |
|
| 查看次数: |
2113 次 |
| 最近记录: |