如何访问与其他类的“方法本地内部类”同名的类

时间:2019-02-20 07:35:58

标签: java inner-classes

考虑以下代码

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的对象。但是,当它们不在任何软件包中时,找不到找到相同方法的方法。

3 个答案:

答案 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