package myTemp1;class A {
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{
void m(){
System.out.println("inner");
}
}
}
class A {
void m(){
System.out.println("middle");
}
}
}
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{
void m(){
System.out.println("inner");
}
}
}
class A {
void m(){
System.out.println("middle");
}
}
}
void m(){
System.out.println("outer");
}
}public class TestInners {
public static void main(String[] args) {
TestInners ts=new TestInners();
ts.go();
}
void go(){
new A().m();
class A{
void m(){
System.out.println("inner");
}
}
new A().m();
}
class A {
void m(){
System.out.println("middle");
}
}
}输出:
middle
inner
根据结果分析
在执行go方法是,它是先实例化TestInners里面的A类(midlle类)因为他会屏蔽掉外部的A类,
不实例化inner类是因为inner类处在其后,我在最后的时候加了一句new A().m();
他会实例化最近的A类,(屏蔽掉了外部的A类)
所以在实例化过程中当出现同名的时候,一般都是实例化最近的类。。
外部的A生成是A.class
内部的A生成是TestInners$A.class
而内部就没有对应的class
所以new A().
当然是外部的。
TestInners是public的外部生成的是 TestInners.class
内部是 TestInners$A.class
而go函数中定义的A类,在new A()后面,似乎也不能提前使用。运行结果:
middle
策划环境:
JDK1.6 Eclipse 3.3
实际是 java.lang.Object.class
你不信去在JRE下边删除这个.class 试试看。
首先局部内部类
class A{
void m(){
System.out.println("inner");
}
}
是在new A().m();之后如果在之前输出结果就是innerjava默认是从自己内部找,先找局部内部类,再找成员内部类,最后找外部类。
至于这个类:
class A {
void m(){
System.out.println("outer");
}
}
其实跟外部类没什么区别,无非就是访问权限问题,引用的时候少了一个import
去刻意调用这个"outer“ A.class 这个类呢?
如果类名使用简单名称,则根据当前代码的位置,取最近的那个具有指定简单名称的类
这个顺序如9楼所说:java默认是从自己内部找,先找局部内部类,再找成员内部类,最后找外部类。