-
内部类的定义
概念:所谓内部类就是在一个类的内部进行其他类结构的嵌套的操作
范例:简单内部类的实现
-
内部类的优点:
a.内部类与外部类可以互相访问彼此的私有域(最大的优点)
b.内部类可以实现JAVA的单继承局限
c.内部类可以对同一个包中的其他类隐藏起来,仅供外部类使用(保护性)。(private修饰内部类)
范例:内部类实现“多继承”
-
内部类与外部类的关系
a.对于非静态内部类而言,内部类的创建需要依赖外部类的实例化对象,在没有外部类对象之前是无法创建内部类的。
b.内部类是一个相对于独立的个体,与外部类不是is-a的关系。
c.内部类可以直接访问外部类的元素(包含私有域),但是外部类不可以直接访问内部类元素,需要通过内部类的引用间接访问。
在是简单实现内部类的代码中我们可以看出,内部类内就可以调用外部类的属性,在外部类中可以通过内部类的类对象调用内部类的方法。表明内部类和外部类可以访问彼此的私有域。
-
创建内部类
- 创建非静态内部类
外部类.内部类 内部类的引用 = new 外部类( ).内部类( );
表示当前外部类对象 : outer.this
- 创建静态内部类 直接产生内部类
外部类.内部类 内部类引用 = new 外部类.内部类( );
范例:创建非静态内部类对象
范例:创建静态类内部类对象
-
内部类的分类:
在Java中内部类主要分为成员内部类、静态内部类、方法内部类、匿名内部类。
- 成员内部类: 不能存在静态变量,但可以访问外部类的静态变量
a.成员内部类不能存在任何static变量或方法,可以访问外部类的静态域
b.成员内部类需要依附外部类new outter().new inner();
c.内部类可以使用private封装,表示私有内部类,该内部类仅供外部类使用
(HaspMap中的Entry内部类,ArrayList中的Node内部类)
- 静态内部类: 不能访问外部类的成员变量,但可以存在自己的成员变量
关键字static可以修饰成员变量、方法、代码块,其实它还可以修饰内部类,使用static修饰的内部类我们称之为静态 内部类。
特点:
a.静态内部类的创建不需要外部类,可以直接创建。
b.静态内部类不可以访问外部类的任何非static域。
- 方法内部类 (方法内部定义的类) 一定没有静态成员变量
特点:
a.方法内部类不能使用任何访问权限修饰符 private protected 和public均不允许
b.方法内部类对外(方法外)完全隐藏,除了该方法可以访问他之外,其余地方君不介意访问
c.方法内部类要想使用方法形参,该形参必须使用final声明(jdk8变为隐式final声明)
Q:为什么方法形参要用final修饰
A:方法创建在栈上。
- 匿名内部类 - 方法内部类的特殊版本
匿名内部类其实就是一个没有名字的方法内部类,所以它符合方法内部类的所有约束。
范例:匿名内部类
特点:
a. 匿名内部类是没有访问修饰符的。
b. 匿名内部类必须继承一个抽象类或者实现一个接口
c. 匿名内部类中不能存在任何静态成员或方法
d. 匿名内部类是没有构造方法的,因为它没有类名。
e. 与局部内部相同匿名内部类也可以引用方法形参。此形参也必须声明为 final。