5

我从 K&B 书籍“SCJP Sun Certified Programmer for Java 6 Study Guide”中获取了以下代码:

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 类的外部。如果这些类位于不同的包中,我可以通过使用包名限定其中一个来解决歧义。但在这种情况下,这些类不仅在同一个包中,而且在同一个文件中。如何获取外部类的实例?

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

4

3 回答 3

4

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

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

使用类的完全限定名。

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

于 2013-11-28T15:52:16.307 回答
2

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

因此,如果您真的想获得外部 A,则必须硬着头皮做一些其他类型的封装,例如将其包装在另一个类或包中。

编辑:这是另一个原因

于 2013-11-28T15:52:53.807 回答
0

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

void go() {

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

要访问outer-A,您必须附加包名称,在默认包中无法访问outer-A。

于 2015-05-26T10:58:59.123 回答