Java的内部类有哪些?
静态内部类(static inner class)、成员内部类(member inner class)、局部内部类(local inner class)和匿名内部类。
静态内部类:是指被声明为static的内部类,它可以不依赖于外部类实例而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法(包括私有类型)。
非静态内部类:一个静态内部类,如果去掉static关键字,就成为成员内部类。成员内部类为非静态内部类,它可以自由地引用外部类的属性和方法,无论这些属性和方法是静态的还是非静态的。但是它与一个实例绑定在了一起,不可以定义静态的属性和方法。只有在外部的实例被实例化后,这个内部类才能被实例化。非静态内部类中不能有静态成员。
局部内部类:指的是定义在一个代码块内的类,它的作用范围为其所在的代码块,是内部类中最少使用到的一种类型。局部内部类就像局部变量一样,不能被public、protected、private以及static修饰,只能访问方法中定义为final类型的局部变量。对一个静态内部类,去掉其声明中的static关键字,将其定义移入其外部类的静态方法或静态初始化代码中就成为了局部静态内部类。对于一个成员类,将其定义移入其内部类的实例方法或实例初始化代码中就成了局部内部类。局部静态内部类与静态内部类的基本特性相同。局部内部类与内部类的基本特性相同。
匿名内部类:匿名内部类是一种没有类名的内部类,不能用关键字class、extends、implements,没有构造函数,它必须继承其他类或实现其他接口。匿名内部类的好处是代码更加简洁紧凑,但带来的问题是易读性下降。使用匿名内部类遵守的原则:①匿名内部类不能有构造函数。②匿名内部类不能定义静态成员变量、方法和类。③匿名内部类不能是public、protected、private、static。④只能创建匿名内部类的一个实例。⑤一个匿名内部类一定是new的后面,这个匿名类必须继承一个父类或实现一个接口。⑥因为匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。