考虑以下代码
class A{}
class B{
void main(){
A a1=new A();
class A{}
A a2=new A();
System.out.println(a1); // A@___
System.out.println(a2); // B$1A@____
}
}
A类和B类不在任何包中,创建方法本地内部类后,如何在main()内部创建外部类A的对象。 换句话说,如何创建外部类A的“ a2”对象?
我通过将这些类放在Package中进行了检查,并且能够使用完全限定的名称创建外部类A的对象。但是,当它们不在任何软件包中时,找不到找到相同方法的方法。
答案 0 :(得分:4)
您可以使用Class.forName()
来加载您要实例化的类:
class A {}
class B {
public static void main(String[] args) throws Exception {
A a1 = new A();
class A {}
A a2 = new A();
Class<?> clazz = Class.forName("A");
Object a3 = clazz.getDeclaredConstructor().newInstance();
System.out.println(a1); // A@___
System.out.println(a2); // B$1A@____
System.out.println(a3); // A@___
}
}
这是可行的,因为A
中的本地类B.main()
具有与B
相同级别上声明的完全限定域名:
System.out.println(a1.getClass()); // class A
System.out.println(a2.getClass()); // class B$1A
System.out.println(a3.getClass()); // class A
我不得不使用Object
作为a3
的类型,因为一旦本地类{{1}就无法在A
内引用外部main()
}}已声明。
答案 1 :(得分:3)
对于这两个A类都没有包,您将无法区分它们。
引用A类型时,编译器将引用最本地/最接近的A
类声明:
A a1=new A(); // refer the outer (the single that is visible in this scope)
class A{}
A a2=new A(); // refer the inner : the closest in this scope
请注意,不建议您使用默认软件包,但不要将其与相同的类名一起使用。
修改
使用在本地Supplier
类之前声明的A
,可以在本地类声明之后创建外部A
对象,因为Supplier
仅在{{ 1}}被调用:
get()
答案 2 :(得分:0)
如果您使用与外部类相同的内部类名称,则需要使用 完全合格的类名称以引用外部类。
就像同一概念适用于本地声明获得更高优先级的方法或变量一样。
作为一般的经验法则,不建议使用相同的类名,这样更容易混淆
有关此内容的参考链接: https://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.4.2
可以在此处找到类似问题的出色SO答案。 Inner Class visibility SO Thread