目录
内部类:所谓内部类,就是将类结构的定义套在另一个类的内部,内部类也属于一种封装。
内部类分为四种:成员内部类、静态内部类、方法内部类、匿名内部类。
一、成员内部类
成员内部类:直接定义在类中,不加任何修饰符(static)定义的类。
成员内部类的使用方法:
①成员内部类的创建需要依赖外部类对象,在没有外部类对象之前,无法创建成员内部类对象。
②内部类是一个相对独立的实体,与外部类不是 is-a 关系。
③内部类可以直接访问外部类的元素和方法(包括私有域),外部类必须通过内部类的对象来访问内部类的元素和方法(包括私有域)。
④成员内部类对象的创建
- 外部类的内部创建
内部类名称 内部类引用=new 内部类();
- 外部类的外部创建——内部类要对外部可见(访问权限问题)
外部类名称.内部类 引用=new 外部类().new 内部类();
由于成员内部类Inner是套在Outter之中的,就相当于Outter的一个成员变量,因此访问Inner类,就使用Outter.Inner ,成员内部类是需要依附外部类,先要产生外部类对象才能产生内部类对象,new Outter() -> 产生一个外部类对象,然后通过产生好的外部类对象再产生内部类对象new Inner() 。
成员内部类特点:内部类和外部类可以方便的互相访问彼此的private域。
内部类访问外部类的私有域直接访问,原因就是内部类中隐藏了一个外部类对象:
关于成员内部类的几个细节问题?
1、对于成员内部类来说,能否定义一个静态变量?答:不能,外部类访问成员内部类需要通过内部类的对象来访问,而静态变量没有对象也能用,相互矛盾。
2、对于外部类来说,能否在外部类的静态方法中使用成员内部类?答:不能,相当于在静态方法中调用成员变量。
二、静态内部类
静态内部类:定义在类中,使用static修饰的内部类就是静态内部类,静态内部类不需要依赖外部类对象。
创建静态内部类对象:
- 外部类的内部
就和普通类的用法相同
为何成员方法和静态方法都能创建成员内部类对象?答:类比类中的静态变量,没有类的对象就能使用,类的静态方法可以调用,成员方法更可以。
- 外部类的外部
外部类.内部类 引用=new 外部类.内部类();
此时不需要产生外部类对象
①静态内部类能否拥有成员变量? 答:可以
②静态内部类能否访问外部类的成员变量?答:不能,外部类的成员变量有对象才能访问,此时内部类就没有外部类对象,因此无法直接访问,要访问可以通过new一个外部类对象来访问。
三、方法内部类(局部内部类)
方法内部类:直接定义在方法内部的类,不允许使用任何访问修饰符,对外部完全隐藏(出了这个方法,这个类就没了)。
①方法内部类无法定义static域,除此之外和成员内部类的用法基本相同
②方法内部类中若使用了方法的形参,该形参为隐式的final声明 (JDK8之后,JDK8之前,方法内部类若使用了形参,形参必须使用final声明)
四、匿名内部类(lambda表达式的前身)
匿名内部类:匿名内部类是方法内部类的特殊版本,直接不写类名称。
匿名内部类遵从方法内部类的所有要求,默认会继承一个类或实现一个接口
之前的接口传参方式:
使用匿名内部类: