Java内部类
概念
在Java中,可以在类中定义类,成为内部类,根据定义的方式不同,分为静态内部类、成员内部类、局部内部类、匿名内部类。
静态内部类
定义在类内部的静态类,称为静态内部类。
public class StaticInnerClass { private static int a; private int b; public static class Inner{ public void print() { System.out.println(a); // System.out.println(b); // 不能访问外部类的非静态成员变量或方法 } } }
- 静态内部类和一般类一致,可以定义变量、方法、构造方法等
- 静态内部类可以访问外部类所有的静态变量和方法、即使是private的也一样
- 其他类使用静态内部类需要使用“外部类.静态内部类”的方式,例如:StaticInnerClass.Inner inner=new StaticInnerClass.Inner();
- Java集合类HashMap内部就有一个静态内部类Entry。Entry是HashMap存放元素的抽象,HashMap 内部维护 Entry 数组用了存放元素,但是 Entry 对使用者是透明的。像这种和外部类关系密切的,且不依赖外部类实例的,都可以使用静态内部类。
成员内部类
定义在类内部的非静态类,称为成员内部类。
public class GeneralInnerClass { private static int a; private int b; public class Inner{ // private static int c; public void print() { System.out.println(a); System.out.println(b); } } }
- 成员内部类中不能定义静态方法和变量(final修饰的除外),因为类初始化的时候先初始化静态成员,成员内部类需要创建对象才能调用,而静态变量或方法可以直接类名访问。
- 内部类可以拥有private访问权限、protected访问权限、 public访问权限及 包访问权限。如果成员内部类用private修饰, 则只能在外部类的内部访问;如果用public修饰,则任何地方都能访问;如果用protected修饰, 则只能在同一个包下或者继承外部类的情况下访问;如果是默认访问权限,则只能在同一个包下访问。外部类只能被public和包访问两种权限修饰。
- 成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象;
局部内部类
定义在方法中或者定义在作用域内的类,称为局部内部类
public class LocalInnerClass { private static int a; private int b; public void test(final int c) { final int d = 1; class Inner{ public void print() { System.out.println(c); } } } }
- 局部内部类的访问权限只限于方法或作用域内
- 局部内部类就相当于方法的一个局部变量一样,不能有public,private,protected修饰符的
匿名内部类
必须继承类或者实现接口,没有名字的类,只能使用一次
abstract class Person { public abstract void eat(); } public class AnonymousInnerClass{ public static void main(String[] args) { Person p = new Person() { @Override public void eat() { System.out.println("eat sth"); } }; p.eat(); } }
- 一般使用匿名内部类编写事件监听代码
- 匿名内部类是唯一一种没有构造器的类
- 匿名内部类不能有访问修饰符