内部类:所谓内部类就是在一个类的内部进行其他类结构的嵌套的操作。简单来说就是在类的内部又定义了一个类
根据内部类定义的位置及关键字。一共可将内部类分为4类:
1.成员内部类(普通内部类)
类比普通属性
定义:直接定义在外部类的内部不加static属性修饰
在外部类的外部直接创建成员内部类对象语法:
在外部类内部创建内部类对象
在外部类内部创建内部类,就像普通对象一样直接创建
Inner in = new Inner();
限制:成员内部类可访问外部类的静态属性,成员内部类不能拥有静态域(静态属性,静态方法都不行), 成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类
2.静态内部类
类比静态属性,静态方法
定义:直接定义在外部类中加static修饰
静态内部类只是包在外部类中而已,除此之外与外部类没有任何区别,不需要外部类对象
在外部类外部创建静态内部类对象语法:
静态内部类限制: 静态内部类的创建是不需要依赖于外围类,可以直接创建。可以拥有普通属性但不能访问外部类的普通属性
3.方法内部类
类比方法中的局部变量
定义在方法中不加任何修饰,与普通内部类基本一致只是作用域不同。
注意:(1)方法中若存在内部类方法形参隐式使用final声明,JDK8之前是显示
(2)方法内部类不能使用任何权限修饰符
(3)对外完全隐藏,除了创建这个类的方法可以访问它,其他的地方是不允许访问的。
4.匿名内部类
等同于方法内部类,只是无名,除此之外与方法内部类完全一致,但必须继承一个抽象类或实现一个接口。
- 匿名内部类是没有访问修饰符的。
- 匿名内部类必须继承一个抽象类或者实现一个接口
- 匿名内部类中不能存在任何静态成员或方法
- 匿名内部类是没有构造方法的,因为它没有类名。
- 与局部内部相同匿名内部类也可以引用方法形参。此形参也必须声明为 final
内部类的优点:
1.可访问彼此的私有属性(内部类可直接访问,外部类通过内部类的对象访问)
2.使用内部类可实现多继承的概念
3.内部类可以对外部类完全隐藏
内部类与外部类的关系:
对于非静态内部类,内部类的创建依赖外部类的实例对象,在没有外部类实例之前是无法创建内部类的
内部类是一个相对独立的实体,与外部类不是is-a关系
内部类可以直接访问外部类的元素(包含私有域),但是外部类不可以直接访问内部类的元素 外部类可以通过内部类引用间接访问内部类元素