什么是Java内部类

Java内部类是指在一个类的内部定义的类。它可以访问外部类的成员变量和方法,甚至可以访问外部类的私有成员。内部类可以分为成员内部类、局部内部类和匿名内部类三种类型。

成员内部类

成员内部类是定义在一个类的内部的另一个类,它与外部类的实例相关联。成员内部类可以访问外部类的所有成员,包括私有成员。

下面是一个示例代码,演示了如何定义和使用成员内部类:

public class OuterClass {
    private int outerNum;

    public OuterClass(int num) {
        this.outerNum = num;
    }

    private void outerMethod() {
        System.out.println("Outer Method");
    }

    public class InnerClass {
        public void innerMethod() {
            System.out.println("Inner Method");
            outerMethod();
            System.out.println("Outer Number: " + outerNum);
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass(10);
        OuterClass.InnerClass inner = outer.new InnerClass();
        inner.innerMethod();
    }
}

在上面的代码中,OuterClass是外部类,InnerClass是成员内部类。在main方法中,我们首先创建了一个外部类的实例outer,然后使用outer实例来创建内部类的实例inner。通过内部类的实例,我们可以调用内部类的方法innerMethod,并且可以访问外部类的成员变量outerNum和方法outerMethod

局部内部类

局部内部类是定义在一个方法或代码块内部的类,它只能在该方法或代码块内部被访问。局部内部类可以访问外部类的成员变量和方法,但是只能访问被final修饰的局部变量。

下面是一个示例代码,演示了如何定义和使用局部内部类:

public class OuterClass {
    private int outerNum;

    public OuterClass(int num) {
        this.outerNum = num;
    }

    public void outerMethod() {
        final int localNum = 20;

        class LocalInnerClass {
            public void innerMethod() {
                System.out.println("Inner Method");
                System.out.println("Outer Number: " + outerNum);
                System.out.println("Local Number: " + localNum);
            }
        }

        LocalInnerClass inner = new LocalInnerClass();
        inner.innerMethod();
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass(10);
        outer.outerMethod();
    }
}

在上面的代码中,OuterClass是外部类,LocalInnerClass是局部内部类。在outerMethod方法中,我们定义了一个局部变量localNum,并将其设置为final。然后,在局部内部类中,我们可以访问外部类的成员变量outerNum和方法outerMethod,以及局部变量localNum

匿名内部类

匿名内部类是没有名字的内部类,它通常用作实现某个接口或继承某个类的临时实例。匿名内部类没有构造方法,它的定义和创建同时完成。

下面是一个示例代码,演示了如何定义和使用匿名内部类:

public class OuterClass {
    public void outerMethod() {
        MathOperation operation = new MathOperation() {
            @Override
            public int operate(int a, int b) {
                return a + b;
            }
        };

        int result = operation.operate(10, 20);
        System.out.println("Result: " + result);
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.outerMethod();
    }
}

interface MathOperation {
    int operate(int a, int b);
}

在上面的代码中,我们定义了一个接口MathOperation,其中包含一个operate方法。然后,在outerMethod方法中,我们使用匿名内部类来实现MathOperation接口,并重写了operate方法。通过匿名内部类的实例,我们可以调用operate方法,计算两个数的和。

总结

Java内部