Java内部类阴影外部类

时间:2013-11-28 15:48:13

标签: java class shadowing

我从K& B书“SCJP Sun认证程序员Java 6学习指南”中获取了以下代码:

class A { // 1
    void m() { 
        System.out.println("outer"); 
    } 
}

public class TestInners {

    public static void main(String[] args) {

        new TestInners().go();

    }

    void go() {

        new A().m();

        class A { // 2
            void m() { 
                System.out.println("inner"); 
            } 
        }

    }

    class A { // 3
        void m() { 
            System.out.println("middle"); 
        } 
    }
}

如书中所述,此代码打印“中间”。我推断标记为“3”的类声明是标记为“1”的类,它是TestInners类的外部。 如果这些类在不同的包中,我可以通过使用包名来限定其中一个来解决歧义。但在这种情况下,类不仅在同一个包中,而且在同一个文件中。我如何获得外部类的实例?

我看到同样的问题here,但接受的答案意味着修改代码,为整个事物添加一个封闭的类。我的问题是如何使用任何类型的限定符或引用来获取实例,如果它甚至可能的话。

3 个答案:

答案 0 :(得分:4)

假设您的课程在com.test个包中,您需要做的就是使用

new com.test.A().m();

使用班级的完全限定名称。

如果你的类在默认包中,即。没有package声明,那么您运气不佳,无法访问外部A

答案 1 :(得分:2)

在C ++中,您可以通过在符号前面添加::来显式地解决全局范围,但是,Java没有这样的东西。

因此,如果你真的想要获得外部A,你必须咬紧牙关并做一些其他类型的外壳,例如将它包装在另一个类或包中。

编辑:Here is another reason why

答案 2 :(得分:0)

innner-A的对象在定义它之前无法创建。因此在new A().m();内定义innner-A之后使用go()来访问内部类对象。

void go() {

        class A { 
            void m() { 
               System.out.println("inner"); 
            } 
        }
        new A().m();
    }

要访问外部A你必须附加包名,在默认包中不可能访问外部A.