定义在类内部的类称为内部类。内部类根据不同的定义方式,可分为静态内部类/成员内部类/局部内部类和匿名内部类。
静态内部类
定义在类内部的静态类成为静态内部类。静态内部类可以访问外部类的静态变量和方法;在静态内部类中可以定义
静态变量/方法/构造函数等;静态内部类通过“外部类.静态内部类”的方式调用。
public class OuterClass{
private static String className = "StaticInnerClass";
public static class StaticInnerClass{
public void getClassName(){
System.out.println("className:"+className);
}
}
public static void main(String[]args){
OuterClass.StaticInnerClass InnerClass = new OuterClass.StaticInnerClass();
InnerClass.getClassName();
}
}
- Java集合类HashMap在内部维护了一个静态内部类Node数组用于存放元素,对使用者是透明的。这种和外部类关系密切且不依赖外部类实例的类,可以使用静态内部类实现。
成员内部类
定义在类内部的非静态类叫做成员内部类,在成员内部类中不能定义静态方法和变量(final修饰的除外),因为成员内部类都是非静态的,
而在JAVA的非静态代码块中不能定义静态方法和变量。
public class OutClass{
private static int a;
private int b;
public class MemberInnerClass{
public void print(){
System.out.println(a);
System.out.println(b);
}
}
}
局部内部类
定义在方法中的类叫做局部内部类。当一个类只需要在某个方法中使用某个特定的类时,可以通过局部类来优雅的实现。
public class OutClass{
private static int a;
private int b;
public void partClassTest(final int c){
final int d = 1;
class PastClass{
public void print(){
System.out.println(c);
}
}
}
}
匿名内部类
匿名内部类指通过继承一个父类或者实现一个接口的方法直接定义并使用的类。匿名内部类没有class关键字,
这是因为匿名内部类直接使用new生成一个对象的引用。
public abstract class Worker{
private String name;
public String getName(){ return name; }
public void SetName(String name){this.name = name;}
public abstract int workTime();
}
public void Test {
public void test(Worker worker){
System.out.println(worker.getName()+"工作时间"+worker.workTime());
}
public static void main(String[]args){
Test test = new Test();
test.test(new Worker(){
public int workTime(){
return 8;
}
public String getName(){
return "apex";
}
});
}
}