内部类
故名思义 -- 就是在一个类A的内部定义另外一个类B,那么类A就是外部类,类B就是A的内部类。
首先需要明确:
1、内部类一定要定义在外部类的"{}"里面,而不是简单的写在一篇java文件当中;写在一篇java文件当中,它们两个是平行关系,不是嵌套关系。
2、内部类除了定义的位置有特殊性以外,它在本质上和普通的类没有区别; 包括: a、仍然拥有属性、构造、行为、初始化块、甚至是它的内部类; b、内部类虽然和外部类在同一篇java文件当中定义,但是编译以后它拥有自己独立的class文件。 c、内部类的类名,不是我们书写的简单名,而是和外部类的类名共同组成的。 内部类的class文件名要先添加上外部类的名字和“$”符号,后面再跟上内部类的名字。
内部类的分类
首先根据内部类书写的位置,分为两大类:
1、成员内部类;
如果一个内部类是直接定义在外部类的“{}”当中,它的位置和外部类的属性、方法、构造,都处于平行位置,那么就叫做“成员内部类”。 当然作为外部类的成员,它是可以有访问修饰符的,用来控制这个内部类是否可以被外部使用。
成员内部类编译后的class文件名:外部类名字$内部类的名字
2、局部内部类;
如果一个内部类是定义在外部类的某个方法当中,它的位置和这个方法的局部变量保持一致,那么就叫做“局部内部类”。 作为方法的内部定义,跟局部变量一样出了方法就认为消失不在了,所以它只能在这个方法内部使用,不能有访问修饰符。
局部内部类编译后的class文件名:外部类的名$序号内部类名字 这里序号从1开始,是同名局部内部类编译的顺序序号。
再根据语法特殊性,对“成员内部类”和“局部内部类”再分类:
1、成员内部类分为:普通成员内部类 和 静态内部类; 区别就在于 加不加 static 关键字;
2、局部内部类分为:普通的局部内部类 和 匿名内部类 所谓“匿名”就是没有给这个类起类名,匿名内部类是在定义的时候马上产生对象,只能使用一次。
四种内部类的使用语法
1、普通的成员内部类 要想用普通的成员内部类,首先要先产生外部类的对象,然后用"外部类对象.new" 的语法 去产生内部类对象。
OutClass1 out = new OutClass1(); OutClass1.InnerClass1 inner1 = out.new InnerClass1();
2、静态内部类 要用静态内部类,由于有static修饰符,所以这个静态内部类与它所属的外部类对象无关,因此可以不需要产生外部类对象,直接用外部类类名访问。
OutClass1.InnerClass2 inner2 = new OutClass1.InnerClass2();
3、局部内部类 局部内部类只能在定义它的方法之内使用。
InnerClass3 inner3 = new InnerClass3();
内部类当中书写this,代表的是当前的内部类对象,如果要表示它所关联的外部类对象,那么要写成“外部类类名.this”; 局部内部类的方法里面,能够操作到外部类的属性,但是不能操作到所属方法的局部变量(只能访问,不能改人家的值,当成常量用)。
4、匿名内部类 匿名内部类是在new对象的同时,去定义这个对象里面的属性和行为,然后由于没有给这个类型取名字,所以只能用这一次。
new Object(){ private int a; public void test(){ } }.test();
在new对象的同时,去定义这个对象里面有哪些属性和行为。由于这个对象有了新增的属性和行为,所以它不属于new关键字后面那个类型了,而是属于一种新的具有a属性和test方法的类型,但这种类型没有取名字。