Java中的内部类你了解吗

  

当我们在Java程序中声明一个类,这个类通常是在某一个包中的一个独立的.java文件中进行声明。但是Java中也存在一种叫做内部类的概念,内部类是被声明在一个外部类内部的类。在本文中,我们将详细讲解Java中的内部类的使用。

内部类的分类

Java中的内部类被分为4类,分别是:

  1. 成员内部类(Member Inner Class)
  2. 静态内部类(Static Inner Class)
  3. 局部内部类(Local Inner Class)
  4. 匿名内部类(Anonymous Inner Class)

成员内部类

一个非静态的内部类被称为成员内部类,它可以访问外部类的所有成员变量和方法。下面是它的语法结构:

class OuterClass {
    ...
    class InnerClass {
        ...
    }
}

其中,OuterClass是外部类,InnerClass是内部类。

下面是一个成员内部类的示例:

class OuterClass {
    // 外部类的私有属性
    private int outerVar = 1;
    // 外部类的静态属性
    private static int outerStaticVar = 2;
    // 内部类
    class InnerClass {
        // 内部类的方法
        public void innerMethod() {
            System.out.println("outerVar = " + outerVar);
            System.out.println("outerStaticVar = " + outerStaticVar);
        }
    }
}

在这个例子中,我们可以看到InnerClass可以访问到OuterClass中的成员变量outerVar和outerStaticVar。

静态内部类

一个静态的内部类被称为静态内部类,它不能访问外部类的非静态成员。静态内部类的语法结构与成员内部类的语法结构几乎相同,唯一的区别在于它的前面多了一个 static 关键字。下面是它的语法结构:

class OuterClass {
    ...
    static class InnerClass {
        ...
    }
}

下面是一个静态内部类的示例:

class OuterClass {
    // 外部类的私有属性
    private int outerVar = 1;
    // 外部类的静态属性
    private static int outerStaticVar = 2;
    // 静态内部类
    static class InnerClass {
        // 静态内部类的方法
        public static void innerStaticMethod() {
            System.out.println("outerStaticVar = " + outerStaticVar);
        }
    }
}

在这个例子中,我们可以看到InnerClass只能访问到OuterClass中的静态成员outerStaticVar。

局部内部类

一个内部类可以被定义在一个方法体内,这样的内部类被称为局部内部类。局部内部类只能在方法体内进行访问,它与成员内部类和静态内部类的语法结构有所不同。下面是它的语法结构:

class OuterClass {
    ...
    void outerMethod() {
        class LocalInnerClass {
            ...
        }
    }
}

下面是局部内部类的示例:

class OuterClass {
    // 外部类的私有属性
    private int outerVar = 1;

    void outerMethod() {
        // 局部内部类
        class LocalInnerClass {
            // 局部内部类的方法
            public void innerMethod() {
                System.out.println("outerVar = " + outerVar);
            }
        }

        // 创建局部内部类的对象
        LocalInnerClass localInnerClass = new LocalInnerClass();
        // 调用局部内部类的方法
        localInnerClass.innerMethod();
    }
}

在这个例子中,我们可以看到LocalInnerClass只能在outerMethod()方法中进行访问,局部内部类是最少被使用的内部类之一。

匿名内部类

一个没有名称的内部类被称为匿名内部类,它没有显式地定义类的名称,通常都是直接在方法调用时创建的。匿名内部类经常被用来在编写事件处理程序时使用,也可以用于创建接口的实现。匿名内部类不需要使用任何访问修饰符,下面是它的语法结构:

new 类名或者接口名() {
    ...
}

下面是匿名内部类的示例:

interface AnonymousInnerClass {
    void hello();
}

class OuterClass {
    // 外部类的方法
    void outerMethod() {
        // 匿名内部类
        AnonymousInnerClass anonymousInnerClass = new AnonymousInnerClass() {
            // 匿名内部类的方法实现
            public void hello() {
                System.out.println("hello world!");
            }
        };

        // 调用匿名内部类的方法
        anonymousInnerClass.hello();
    }
}

在这个例子中,我们可以看到anonymousInnerClass是一个匿名内部类的实例,它实现了接口AnonymousInnerClass中的hello()方法。

总结

本文详细讲解了Java中的内部类,包括成员内部类、静态内部类、局部内部类以及匿名内部类。对内部类的使用分别进行了示例说明,不同类型的内部类有不同的使用场景,开发者可以根据不同需求进行相应的选择。

相关文章