java——内部类
1. 为什么需要内部类
(1) 可以访问该类定义所在的作用域中的数据,包括私有数据(内部类具有访问特权,比常规类功能更加强大)
(2) 内部类可以对同一个包中的其他类隐藏起来
(3) 当想要定义一个回调函数且不想编写大量代码时,使用匿名(anonymous)内部类比较便捷
2. 内部类是一个怎样的存在
(1) 是指在一个外部类内部再定义一个类,类名不需要和文件夹相同
(2) 可以使用static,public,default,protected,private等修饰,而外部顶级类只能用public或者default
(3) 编译器会把内部类翻译成$分割外部类名与内部类名,而JVM对此完全不知道。例如外部类编译后是outer.class,对应的内部类则是outer$inner.class
3. 成员内部类
public class Outer{ private static int j=0; public class Inner{ //执行代码
j ++; } }
(1) 不能含有static的变量或者方法,因为成员内部类需要先创建外部类
(2) 创建内部类: Outer obj = new Outer(); Outer.Inner inobj = obj.new Inner();
4. 局部内部类
public class Outer{ public void start(){ //定义在函数里 class Inner1{ //执行代码 } } public void test(){ if(true){ //定义在作用域里 class Inner2{ //执行代码 } } } }
(1) 局部内部类,是指定义在方法或者作用域中的类,不能使用public或者private访问说明符进行声明。
(2) 局部内部类可以对外部世界完全的隐藏起来。
(3) 不仅可以访问外部类,还可以访问被声明为finla(相当于常量)的局部变量
5. 匿名内部类
在局部内部类的基础上再深入一步。假设只创建这个类的一个对象,就不需要命名了。这种类就叫做匿名内部类
public void start(){ ActionListener listener = new ActionListener(){ //inner class methods and data } }
6. 静态内部类(static)
如果不需要内部类引用外围类对象,仅仅使用内部类来隐藏该类,则可以声明为static,以便取消产生的引用。所有和静态内部类相关的函数也需要定义为static
public class Outer{ public static class Inner{ //data or method } public static Inner getResult(){ //method } }
(1) 又叫做嵌套内部类,不用创建内部类或者外部类,可直接使用Outer.Inner来使用
(2) 静态内部类一般声明为public,方便调用