Java的内部类
1.概念
在一个类的内部再定义一个类,编译之后可分别生成独立的字节码文件,内部类可直接访问外部类的私有成员,而不破坏封装。
2.内部类的分类
2.1 成员内部类
1.如何获取成员内部类对象?
- 成员内部类创建对象要先创建外部类对象,再通过"外部类对象.new 内部类类名()" 创建内部类对象。
2.当外部类成员变量和成员内部类成员变量重名时如何获取外部类成员变量?
- 外部类类名.this 引用外部类的当前对象。
成员内部类需要依托于外部类对象创建对象,成员内部类可以访问外部类的私有属性。
2.2 静态内部类
静态内部类只能访问外部类的静态成员,
1.静态内部类如何创建对象?
- 静态内部类创建对象,可以直接用"外部类类名.new 静态内部类类名()" 创建对象。
静态内部类不需要依托外部类对象,比成员内部类更方便。
2.3 局部内部类
1.作用范围
- 从定义开始,到代码块结束。
2.局部内部类不能定义静态成员
3.局部内部类可以访问外部类的私有成员,也能访问局部变量,但是需要加final修饰符。
4.局部内部类为什么访问外部类局部变量要加final?
首先要了解JVM的内存空间
堆空间存放对象
栈空间存放局部变量
方法区的常量池存放常量(基本数据类型,String类型在串池),也存放一个类的静态数据。
一个方法不能访问其它方法栈空间(局部变量)里的数据。
在jdk1.8里局部内部类访问外部类的局部变量时,final会默认加上的。
2.4 匿名内部类
匿名内部类时一个特殊的局部内部类。
1.如果你写一个局部内部类的目的满足如下的条件,那么这个局部内部类就可以改写成局部内部类。
条件如下:
1.1 写匿名内部类目的是为了继承某个类或者实现某个接口
1.2 只会创建一个对象
写法如下:
new 父类名或者接口名(){继承父类或者实现接口的代码}
匿名内部类的可读性差,但是实际开发中匿名内部类用的比局部内部类多