📜  Java-内部类(1)

📅  最后修改于: 2023-12-03 14:42:20.234000             🧑  作者: Mango

Java 内部类

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

内部类可以访问外部类的成员变量和方法,而外部类则不能访问内部类的成员。

在 Java 中有四种类型的内部类:成员内部类、静态内部类、局部内部类和匿名内部类。下面我们将一一介绍这些内部类的特点以及使用方法。

成员内部类

成员内部类是一个定义在另一个类中的类,它可以访问外部类的成员,而且可以被外部类的其他方法访问。

public class Outer {
    private int x = 10;

    public class Inner {
        public void print() {
            System.out.println(x);
        }
    }
}

在上面的例子中,Inner 类是 Outer 类的成员,因此它可以访问 Outer 类的私有成员 x

使用内部类的语法是,在外部类中创建内部类的实例:

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.print(); // 输出 10

注意,在创建内部类的实例时,必须使用外部类的实例来创建。

静态内部类

静态内部类是一个定义在另一个类中的静态类,它不需要外部类的实例就可以创建。

public class Outer {
    private static int x = 10;

    public static class Inner {
        public void print() {
            System.out.println(x);
        }
    }
}

在上面的例子中,Inner 类是 Outer 类的静态成员,因此它可以不依赖于外部类的实例。

创建静态内部类的实例时,不需要创建外部类的实例。使用下面的语法来创建内部类的实例:

Outer.Inner inner = new Outer.Inner();
inner.print(); // 输出 10
局部内部类

局部内部类是一个定义在一个代码块中的类,它只能在这个代码块中访问。

public class Outer {
    private int x = 10;
    
    public void test() {
        class Inner {
            public void print() {
                System.out.println(x);
            }
        }
        
        Inner inner = new Inner();
        inner.print(); // 输出 10
    }
}

在上面的例子中,Inner 类是在 test 方法中定义的局部内部类。

要访问局部内部类,必须先创建外部类的实例,然后调用外部类中包含局部内部类的方法。

匿名内部类

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

public interface MessageHandler {
    void handleMessage(String message);
}

public class MessageReceiver {
    private MessageHandler handler;

    public void setHandler(MessageHandler handler) {
        this.handler = handler;
    }
    
    public void receive(String message) {
        handler.handleMessage(message);
    }
}

public class Application {
    public static void main(String[] args) {
        MessageReceiver receiver = new MessageReceiver();
        
        receiver.setHandler(new MessageHandler() {
            @Override
            public void handleMessage(String message) {
                System.out.println("Received message: " + message);
            }
        });

        receiver.receive("Hello, World!");
    }
}

在上面的例子中,我们使用一个匿名内部类来实现 MessageHandler 接口。

创建匿名内部类的语法是,在创建对象的同时定义这个类的实现:

receiver.setHandler(new MessageHandler() {
    @Override
    public void handleMessage(String message) {
        System.out.println("Received message: " + message);
    }
});

注意,在匿名内部类中不能定义构造函数,因为它没有名字。