问题描述
publicclassMemberInnerClassTest{publicstaticvoidmain(String[]args){OuterHullouter=newOuterHull();OuterHull.InnerCoreinner=outer.newInnerCore();//OuterHull.InnerCoreinner1=newouter.InnerCore();//OuterHull.InnerCoreinner1=newInnerCore();System.out.println("OuterHull="+outer.ship);System.out.println("InnerCore="+inner.ship);inner.communicate();}}classOuterHull{Stringship="U.S.S.Enterprising";classInnerCore{Stringship="ShuttleCraft";voidcommunicate(){System.out.println("OuterHull="+(OuterHull.this).ship);System.out.println("OuterHull="+OuterHull.this.ship);//System.out.println("OuterHull="+OuterHull.ship);System.out.println("InnerCore="+this.ship);}}}下面这二个语句中的this应该如何去理解?System.out.println("OuterHull="+OuterHull.this.ship);System.out.println("InnerCore="+this.ship);还有为什么被行注释的语句会提示“在静态域无法使用非静态域OutHull.ship”编译?
解决方案
解决方案二:
输出结果为:OuterHull=U.S.S.EnterprisingInnerCore=ShuttleCraftOuterHull=U.S.S.EnterprisingOuterHull=U.S.S.EnterprisingInnerCore=ShuttleCraft
解决方案三:
classInnerCore是个成员内部类,就相当于OuterHull的一个成员,它看不到OuterHull,所以不能通过OuterHull直接访问ship,只能OuterHull.this.ship访问外部类的变量,这是规定。System.out.println("InnerCore="+this.ship);没什么好解释的,当前对象的ship就是InnerCore的ship
解决方案四:
同名变量ship盖住了。需要明确的说它在哪里,否则认为你想用inner.ship呢。需要Outer.this是因为外面的类和它内部的一个非static类直接在编译时会自动插入一个隐藏的成员指向另一个类的对象实例。你用一个反编译工具打开生成的.class文件看一下,内部类能直接访问它外面的类的任何成员,私有的都可以,反过来外部的类也可以访问内部的,但这不像继承关系那样是自成一体的(继承关系的两个类实际上只有一个对象实例存在),外部类和内部是两个对象实例,各自持有自己的状态,需要一个引用去连接两个实例以达到互访的关系,JVM会自动地允许它们互相访问彼此的所有定义的成员。
解决方案五:
输出结果:OuterHull=U.S.S.EnterprisingInnerCore=ShuttleCraftOuterHull=U.S.S.EnterprisingOuterHull=U.S.S.EnterprisingInnerCore=ShuttleCraft由于内部类是外部类的一部分,当外部类使用内部类的时候需要创建内部类的一个对象就可以了;由于内部类是一个非静态的类里面是一个非静态的方法所以在内部类的方法中使用访问父类的字段和方法时就需父类的一个实例OuterHull.this;所以是OuterHull.this.ship;System.out.println("InnerCore="+this.ship);//本句中的this就是内部类的一个实例了
解决方案六:
果断mark内部类不好理解回去慢慢看看
解决方案七:
个人感觉内部类还是匿名内部类用的相对最多,在开发中,其他的内部类用的很少
解决方案八:
System.out.println("OuterHull="+OuterHull.this.ship);System.out.println("InnerCore="+this.ship);this指向的是内部对像的一个引用