静态内部类
Java集合类HashMap在内部维护了一个静态内部类Node数组用于存放元素,但Node数组对使用者透明。
在类内部定义静态类。静态内部类可访问外部类的静态变量和方法;内部类可定义静态变量、方法和构造函数等;使用外部类.静态内部类的方式调用。
与外部类关系紧密且不依赖外部类实例的类可用静态内部类实现,具体实现为:
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 staticInnerClass = new OuterClass.StaticInnerClass();
staticInnerClass.getClassName();
}
}
成员内部类
类内部定义非静态方法,内部类不能定义静态方法和变量(final修饰的除外),具体实例如下:
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 class 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 "alex";
}
});
}
}
使用定义一个抽象类Worker和一个抽象方法WorkTime,然后定义一个Time类,在Test类中定义了一个方法,该方法接收一个Worker参数。根据场景不同实现不同的匿名内部类,直接在test方法中新建匿名内部类并重写相关方法。