内部类实例

104 阅读2分钟

静态内部类

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方法中新建匿名内部类并重写相关方法。