一、关于嵌套类的分类以及作用
这个直接上个图比较方便
嵌套类或者嵌套接口的主要作用主要是以下两点
①方便逻辑上将相关联的类和接口放在一起便于维护
②内部类可以访问外部类的所有方法和域
二、嵌套类使用上的原则
个人认为只要掌握了一下几点准则,那么关于嵌套类的使用上就会有一个比较明晰的方向,也较容易看懂框架或者工具包里面一些内部类使用的代码。
①首先要明确的就是静态和非静态的访问区别,这个和成员变量的静态和非静态是一个道理,导致的结果就是静态和非静态的内部类的建立方式不同,静态的通过
OuterClass.InnerClass innerInstance = new OuterClass.InnerClass();
就可以建立,而非静态只能在外部实例的基础上进行建立
OuterClass.InnerClass innerInstance = outerInstance.new InnerClass()
②关于几个嵌套类可以访问的变量,主要基于内部类所在位置的不同,是可以访问到不同作用域的。
比如成员内部类,就可以访问到外部类的成员方法,局部内部类则进一步可以访问到方法内的局部变量,然后匿名内部类则根据所处位置不同可以访问到不同作用域的变量,最后静态的内部类则只能访问到静态的成员变量和方法。
tips:针对局部内部类,如果局部内部类的成员变量和方法内的局部变量以及外部类的成员变量命令发生了冲突,则(假设成员变量名为var):
默认var指成员变量,
OuterClass.this.var则指示外部类的成员变量,
至于方法中的成员变量,本人没找到合适的方式访问到,编译后的代码上有体现,不知道在语法上有没有支持的
③关于嵌套接口,主要就是将一系列相关的接口放在一起便于维护,比如Map接口中的Entry接口,必须通过外部类或者接口进行进行引用,而不能直接访问,即OuterClass.InnerInterface这种形式,
同时注意:
1)嵌套接口如果放在接口中,则必须且默认为public访问符,如果在类中,则可以使用任何访问符
2)所有嵌套接口隐式声明为static(即编译器会加上static)
④那内部类可以放在接口中吗?答案是肯定的,同时编译器默认将其声明为static
三、小结
其实内部类这块如果掌握了自己的一套理解方式,万变不离其宗,主要就是语法上的变化,本质含义还是很好理解的。再说了如果看不懂内部类这块代码,关于AQS源码这块其实也挺难掌握的,慢慢来吧!缺啥补啥