前言
内部类主要用于封装。任何内部类都会被编译成独立的class文件,class文件名:外部类$内部类;内部类用于封装,所以很少被外部调用。
正文
内部类
1.概念:在一个类中定义另外一个类。内部类包含在它所定义的外部类的类体中
2.分类:按照内部类定义的位置分类,可分为静态内部类,成员内部类,匿名内部类,局部内部类。
静态内部类
在类体中定义,以静态成员的形式出现的类。
1)语法:
static class 类名{
类体
}
2)特性:
1))在静态内部类中访问外部类的成员,该成员必须是为静态的。但可以使用外部类的对象引用来访问外部类的非静态成员。
2))在静态内部类中访问外部类的方法,该方法必须是为静态的。但可以使用外部类的对象引用来访问外部类的非静态方法。
3))在外部类访问内部类的静态方法,使用内部类类名.方法名。访问内部类的非静态方法使用内部类引用.方法名。代码示例:
4))静态内部类的实例化方式:外部类的类名.内部类的类名 变量名 = new 外部类类名.内部类名();
5))静态内部类可被四大访问控制符所修饰
成员内部类
在类中定义的类,该类以成员的形式出现,和类的属性和方法同级
1)语法:
class 类名{
类体
}
2)特性:
1))成员内部类可访问外部类的静态成员和非静态成员.
2))成员内部类无法再外面的类直接实例化,但可通过内部类所在的外部类中提供一个返回内部类实例的方法。示例如下:
3))成员内部类可被四大访问控制符所修饰
4))成员内部类可定义为抽象的成员内部类
5))成员内部类可继承为抽象的成员内部类
6))成员内部类不能包含静态方法。外部类访问成员内部类的成员,只能通过内部类的引用访问。
局部
局部内部类
它可定义在一个方法中,不能被static修饰,相当于一条java语句。
1)语法:
放回值 方法名(参数列表){
class 类名{
类体
}
}
2)特性:
1))局部内部类访问局部变量时,局部变量需要final修饰;局部内部类可直接访问成员变量
2))局部内部类进行实例化是有范围的,只能在当前的这个方法中进行实例化。
3))局部内部类和局部变量一样的存在作用域。当方法执行完毕后,局部内部类的实例对象会被销毁。局部内部类的作用域存在于方法中。
4))局部内部类只能被【Default】修饰,另外还可被abstract,final修饰。
匿名内部类(重点)
可以定义在类的任何位置。犹如一句话。同时它无类名
1)语法:
类名 引用=new 类名(){
类体
}
2)特性:
1))匿名内部类中的{}是内部类的类体。类体中可定义属性和方法
2))匿名内部类无法定义构造器,因为匿名内部类没有类名。
3))匿名内部类的定义首先要创建对象,在创建对象后加入类体{}。
4))(重点)匿名内部类继承抽象类和实现接口时,只需在类体中实现其抽象方法。
该使用方式,在某种意义上使得抽象类和接口可实例化。
(这种方式也可以使用基类的引用指向子类的对象,是多态的表现形式之一)
总结
匿名内部类,本人是使用比较多的,在使用集合的comparator比较器时候,常常使用匿名内部类解决问题。