在类A的里面或者是中间,定义一个B类那么这个B类就是【内部类】也可以叫作【嵌套类】;
相对来说,B就是A的【内部类】;反知A就是B的【外部类】;
内部类也可以分为多种形式,与变量非常类型:
1、内部类的特点:
- 内部的类仍然是一个【独立的类】,编译之后会被编译成独立的【.class文件】,但是会在外面冠以外部类的【类名】和【$】符号。
编译后的文件命名:【外部类的包名】+【.类名】+【$】+【内部类的名称】
- 内部类是不能用普通的方式访问的;【内部类】是【外部类】的一个【成员】,这个【成员】可能是【实列的成员变量】,也可以是【静态的成员变量】,然后就是【内部类】可以自由访问【外部类的成员变量】,无论是不是【private】私有的。
- 如果【内部类】声明为【静态的】,就不能随便访问【外部类的成员变量】,只能访问【外部类】的【静态成员变量】。
不能随便访问外部类实列的成员变量视图:
- 内部类的通用处
- 【外部类】只有两个访问等级:【public】和【private】;
【内部类】有四个访问等级:【public】、【protrcted】、【private】和【默认】,当成一个【成员变量】都可以使用;
- JAVA实列内部类、JAVA静态内部类、JAVA局部内部类、JAVA匿名内部类
JAVA实列内部类:
定义:【实列内部类】是指没有【static】修饰的内部类,直接在类里面定义一个类。
实列内部类视图:
- 在【外部类】的【静态方法】以及【外部类以外】的【其它类中】,必须通过【外部类的实列】来创建【内部类的实列】。
- 在【实例内部类】或【实列类当中】,可以访问外部类的【所有成员】。
- 在外部类中【不能直接访问】内部类的成员,必须通过【内部类的实列】去访问。
- 【外部类的实列】与【内部类的实列】是一个【一对多】的关系
- 在【实力内部类中】不能定义【static】成员,除非同时使用【final】和【static】修饰
正确写法视图:
JAVA静态内部类:
- 在创建【静态内部类的实列】时,不需要创建【外部内部类的实列】。、
- 【静态内部类中】可以定义【静态成员】和【实列成员】。
外部类以外的其它类需要通过【完整的类名】----》【外部类的类名.内部类.里面的东西】 ,才能访问到【静态内部类中的静态成员】;如要访问【静态内部中的实列成员】
,则需要通过【静态内部类的实列】 。
- 【静态内部类】可以直接访问【外部类的静态成员】,如要要访问【静态内部类的实列成员】,则需要通过【静态内部类的实列】去访问。
注意事项:
- 【实列内部类】是可以直接调用【外部类的实列变量/实列成员】实例方法、类方法,实列内部类去访问外面是没有限制的 。
- 实列内部类来说以外部类去访问它就复杂一点
- 【静态内部类】去访问【外部的静态成员】,是没有问题的,但是它是无法直接去访问外部类的实列成员的,因为【静态内部类】是划分在静态区域那一块的。
JAVA局部内部类:
定义:局部内部类是指在一个【方法(或代码块)】中定义内部类
- 【局部内部类】与【局部变量】一样,不能使用任何的修饰符
- 局部内部类只在【当前的方法】或者【代码块的方法】中有效
- 【局部内部类】中不能定义【static】成员
- 局部内部类中还可以【包含】内部类,但是【内部类】也不能使用任何的修饰符
- 在【局部内部类】中可以访问【外部类的所有成员】
- 在【局部内部类】中只能访问【当前方法】中【final】类型的【参数】与 【变量】。
如果【方法】中的【成员】与【外部类】中的【成员】同名,则可以使用:【最外面类的类名.this.自己定义的类名】
匿名内部类:
定义:匿名内部类是指【没有类名】的【内部类】,
用法:
- 匿名内部类可以定义在成员哪里也可以在局部哪里,但是大部分都是放在【局部当中】
- 匿名类大部分都是和【抽象类】或者【接口】、【类】来搭配使用
局部内部类的特点:
- 【匿名内部类】和【局部内部类】是一样的,可以访问【外部类】的【所有成员】;如果【匿名内部类】位于一个【方法中】,则【匿名内部类】也只能防问在【当前方法中】用【final】类型修饰的【局部变量】和【参数】。
- 【匿名类】可以使用【非静态化代码块】进行初始化的操作。
非静态化代码块视图:
- 匿名内部类的【非静态代码块】会在【父类】的【构造方法】之后被执行。