📜  Java-内部类(1)

📅  最后修改于: 2023-12-03 15:16:02.138000             🧑  作者: Mango

Java 内部类

在 Java 中,一个类可以被定义在另一个类的内部,这被称为内部类。

内部类可以访问外部类的私有成员,可以方便地进行封装。

内部类的种类

Java 中有四种内部类:

  • 成员内部类(Member Inner Class)
  • 局部内部类(Local Inner Class)
  • 匿名内部类(Anonymous Inner Class)
  • 静态内部类(Static Inner Class)
成员内部类

成员内部类是一个类定义在另一个类的内部,并且与外部类的某个实例相关联。

举例:

public class Outer {
    private int x = 10;

    public class Inner {
        public void display() {
            System.out.println("x = " + x);
        }
    }
}

在这个例子中,Inner 类是一个成员内部类,它可以访问到 Outer 类的私有成员 x。

局部内部类

局部内部类是定义在一个方法或代码块内部的类,它只能在其所在的方法或代码块内部被访问。

举例:

public class Outer {
    public void display() {
        class Inner {
            public void print() {
                System.out.println("This is an inner class.");
            }
        }

        Inner inner = new Inner();
        inner.print();
    }
}

在这个例子中,Inner 类是一个局部内部类,它只能在 display() 方法内被访问。

匿名内部类

匿名内部类是一个没有名字的类,它通常用来创建一个实现某个接口或继承某个类的对象。

举例:

public class Outer {
    public void display() {
        // 匿名内部类实现接口
        new Runnable() {
            @Override
            public void run() {
                System.out.println("This is an anonymous inner class.");
            }
        }.run();
        
        // 匿名内部类继承类
        new Thread() {
            @Override
            public void run() {
                System.out.println("This is another anonymous inner class.");
            }
        }.start();
    }
}

在这个例子中,我们使用了两个匿名内部类,一个实现了 Runnable 接口,另一个继承了 Thread 类。

静态内部类

静态内部类是一个与外部类的实例无关的类,可以被直接使用。

举例:

public class Outer {
    private static int y = 20;

    public static class Inner {
        public void display() {
            System.out.println("y = " + y);
        }
    }
}

在这个例子中,Inner 类是一个静态内部类,与 Outer 类的实例无关。

内部类的访问控制

内部类的访问控制规则与普通类一样,但是内部类有其特殊性,在内部类中使用特殊语法可以访问外部类的私有成员。

举例:

public class Outer {
    private int x = 10;

    public class Inner {
        public void display() {
            System.out.println("x = " + x);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.display();
    }
}

在这个例子中,我们在 Test 类中创建了 Outer 的一个实例 outer,并通过 outer.new Inner() 的方式创建了 Inner 的一个实例 inner。在 Inner 的 display() 方法中,我们可以访问 Outer 的私有成员 x。

结语

内部类是 Java 中一种非常有用的特性,它可以方便地进行封装和代码复用。我们可以根据具体的需求选择合适的内部类种类来使用。