内部类即是在一个类中定义的一个类。外边的类成为外部类,里面的类成为内部类。外部类前面的修饰符必须是public,内部类的修饰符可以private, public, protected,编译会产生两个类,外部类名.class, 外部类名$内部类名.class
一 java内部类的分类和特点
java内部类分成四种: 成员内部类, 静态内部类,局部内部类,匿名内部类。
成员内部类
与外部类的关系,作为外部类的一个成员存在。
访问原则,内部类可以访问外部类的任何成员,但是外部类不能访问内部类的成员,可以通过新建内部类的对象来访问内部类的成员,包款private成员,所以,一个内部类的对象对生成它的外部类对象是完全可见的,包括private内部类、private成员与private方法,同时,内部类对象可以访问外部类对象的任何成员,因为非静态内部类对象有着指向其外部类对象的引用,创建非静态内部类对象时,一定要先创建起相应的外部类对象。
要获得内部类实例,可以使用外部类的对象.new 内部类的方式获得内部类的实例。
OuterClassName.InnerClassName inner=new Ouer().new Inner();
在外部类的非static方法中,如果不是static方法,也可以通过如下方式来获得内部类的实例,但是在非外部类的其他类中,必须以上面的方式来获得内部类实例。
InnerClassName inner=new Ouer.Inner();
或者
InnerClassName inner=new Inner();
静态内部类
静态内部类和成员内部类相比,第一,静态内部类和外部类之间只是嵌套关系,没有其指向外部的引用; 第二,静态内部类不仅可以有非static成员,也可以有static成员; 第三,在获得内部类实例的时候,只能用后面一种方式,但是在非外部类的其他类中,则只能使用如下的一种,即:
InnerClassName inner=new Ouer.Inner();
局部内部类
写在一个方法中,或者一个语句块中的内部类,它的作用域仅限于该方法或者语句块。
01.public classGoods2 {02. private void internalTracking(booleanb) {03. if(b) {04. classTrackingSlip {05. privateString id;06. TrackingSlip(String s) {07. id =s;08. }09. String getSlip() {10. returnid;11. }12. }13. TrackingSlip ts = new TrackingSlip("slip");14. String s =ts.getSlip();15. }16. }17. public voidtrack() {18. internalTracking(true);19. }20. public static voidmain(String[] args) {21. Goods2 g = newGoods2();22. g.track();23. }24.}
匿名内部类
对于那些只适用一次,不需要对象名的场景,在swing的事件侦听中使用的比较多,比如,以下例子,只返回一个对象。
01.public classGoods3 {02. publicContents cont() {03. return newContents() {04. private int i = 11;05. public intvalue() {06. returni;07. }08. };09. }10.}
二 java内部类的访问原则
java内部类作为java的一个成员,和其他的成员的权限一样。
1 外部类对内部类的访问如上文所示;
2 和外部类同包的类,private的内部类不可见,其他类型的内部类中的private成员不可见,其他的均可以见;
3 和外部类不同包的类,只能访问public内部类的public成员;
4 继承外部类的类的访问,protected的内部类不可见。
如果让不可见的成员可见,可以通过添加接口方法,比如:
public classOut {publicPrivateIn getPrivateIn(){return newPrivateIn();
}private class PrivateIn implementsInMethod{private intprivate_arg;intdefault_arg;protected intprotected_arg;public int public_arg;
三 java内部类的作用
1.内部类可以很好的实现隐藏
一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
2.内部类拥有外围类的所有元素的访问权限
3.可是实现多重继承
4.可以避免修改接口而实现同一个类中两种同名方法的调用。
引文: