JAVA的内部类
内部类总共拆分为以下几个类型:
1.成员内部类
2.局部内部类
3.匿名内部类
4.静态内部类
内部类主要运用,编写监听事件。
成员内部类
成员内部类是最普通的内部类,它定义在另一个类的内部。
不过要注意的是,当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员(内部类中访问内部类成员变量)。如果要访问外部类的同名成员,需要使用this。
内部类可以拥有private
访问权限、protected
访问权限、public
访问权限及包访问权限。
1.如果成员内部类Inner用private修饰。则只能在外部类的内部访问。
2.如果用public修饰,则任何地方访问。
3.如果用protected
修饰,则只能在同一个包下或者继承外部类的情况下访问。
4如果是默认权限,则只能在同一个包下访问。
注意:
成员内部类中不能出现static修饰符,也就是不能使用static修饰成员方法和变量。
局部内部类
局部内部类是定义在一个方法或者在一个作用域里面的类,它和成员内部类区别在于局部内部类的访问权限限于方法内或者该作用域内。
- 局部内部类就像是方法里面的一个局部变量一样,是不能使用
public
、protected
、private
以及static
修饰符的; - 局部内部类中的成员变量和方法,都不能使用static关键字进行修饰
静态内部类
静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static,静态内部类是不需要依赖外部类,这点和类的静态成员相似,并且它不能使用外类的非static成员方法和成员变量,因为没有外部类的对象情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生了矛盾,因为外部类的非static成员必须依附具体的对象。
匿名内部类(常用)
没有名字的内部类,在编写事件监听的代码时,使用匿名内部类比较方便,便于维护。
使用匿名内部类:因为接口和抽象类不能被实例化对象。
使用匿名内部类的方式构造接口、实例化对象(只要是抽象的,不管是抽象类还是接口,都可以通过匿名内部类方式访问)
情况一:
接口和抽象类的使用:相当于不用特意写个类去实现这个接口方法,直接在实例化的时候就写好这个方法。
情况二:
抽象类用匿名内部类:当接口作为参数放在方法体里的时候,用new 接口()的方式来实例对象,则匿名必须实现两个方法。
内部类使用场景
- 每个内部类都能独立的继承一个接口的实现,所以无论外部类是否已经继承了某个接口的实现,对于内部类来说都没有影响。内部类使得多继承的解决方案变得完整。
- 方便将存在一定逻辑关系的类组织在一起,又可以对外界隐藏。
- 方便编写事件驱动程序。
- 方便编写线程代码。