我从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,但接受的答案意味着修改代码,为整个事物添加一个封闭的类。我的问题是如何使用任何类型的限定符或引用来获取实例,如果它甚至可能的话。
答案 0 :(得分:4)
假设您的课程在com.test
个包中,您需要做的就是使用
new com.test.A().m();
使用班级的完全限定名称。
如果你的类在默认包中,即。没有package
声明,那么您运气不佳,无法访问外部A
。
答案 1 :(得分:2)
在C ++中,您可以通过在符号前面添加::来显式地解决全局范围,但是,Java没有这样的东西。
因此,如果你真的想要获得外部A,你必须咬紧牙关并做一些其他类型的外壳,例如将它包装在另一个类或包中。
答案 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.