java匿名内部类实例简析


在Java中,匿名内部类是一种非常便捷的方式来实现接口或继承类(通常是抽象类)的单个实例,而无需显式地定义并实现该接口或类的子类。这种方式特别适用于那些只需要一次实例化,并且实现相对简单的场景。

### 匿名内部类基本结构


接口名 变量名 = new 接口名() {
    // 实现接口中的所有抽象方法
    @Override
    public 返回值类型 方法名(参数列表) {
        // 方法体
    }
    
    // 可以有其他的方法实现,如果有的话
};

或者对于继承抽象类的情况(注意,这里不能继承非抽象类):


抽象类名 变量名 = new 抽象类名() {
    // 实现抽象类中的所有抽象方法
    @Override
    public 返回值类型 方法名(参数列表) {
        // 方法体
    }
    
    // 可以重写父类中的其他方法,也可以添加新的方法
};

### 示例

假设我们有一个简单的接口`Greeting`,它定义了一个`greet`方法:


public interface Greeting {
    void greet(String name);
}

我们可以使用匿名内部类来实现这个接口,并立即创建一个实例:


Greeting greeting = new Greeting() {
    @Override
    public void greet(String name) {
        System.out.println("Hello, " + name + "!");
    }
};

greeting.greet("World"); // 输出: Hello, World!

在这个例子中,我们没有显式地定义一个`Greeting`接口的子类,而是直接在需要的地方创建了一个实现了`greet`方法的`Greeting`接口的匿名内部类实例。

### 优点

- 匿名内部类可以让我们编写更简洁的代码,特别是当接口或抽象类的实现非常简单时。

- 它允许我们在需要接口或抽象类实例的地方立即实现它们,而无需先定义一个单独的类。

### 缺点

- 匿名内部类会使代码的可读性降低,特别是当实现比较复杂时。

- 由于没有显式的类名,所以不能使用`instanceof`来检查一个对象是否是某个特定匿名内部类的实例。

- 匿名内部类不能有构造函数,因为它们是隐式地通过`new`表达式创建的。但是,它们可以访问外部类的成员变量和方法(如果是非静态的,则需要在匿名内部类内部有指向外部类实例的引用)。