Java匿名内部类详解(定义格式及实现示例)

Java匿名内部类详解(定义格式及实现示例)-mikechen

匿名内部类定义

匿名内部类是一种在Java中定义内部类的方式,没有显式的类名,通常用于创建临时的、一次性的类。

 

匿名内部类作用

匿名内部类作用,主要包含如下:

1.封装线

实现了更好的封装,普通类(非内部类)的访问修饰符不能为:private或protected,而内部类可以。

当我们将内部类声明为private时,只有外部类可以访问内部类,很好地隐藏了内部类。

2.临时性实现

匿名内部类常用于临时性的实现,无需创建一个完整的命名类。

这对于只需要在一个地方使用的小型类非常有用,可以避免定义一个单独的类文件。

3.简化代码

匿名内部类可以在创建对象的同时实现方法或提供逻辑,从而减少了代码的数量。

 

匿名内部类格式

匿名内部类的格式通常如下:

new ClassName() {
    // 重写父类方法
    @Override
    public void methodName() {
        // 方法实现
    }
}.methodName(); // 直接调用重写的方法

这个格式适用于继承一个类的匿名内部类,在大括号内部可以重写父类中的方法,并且可以直接在匿名内部类上调用这些方法。

匿名内部类实现

主要包含两种方式:实现接口的匿名内部类和继承类的匿名内部类。

1.实现接口的匿名内部类

要创建实现接口的匿名内部类,您需要在对象创建的地方内联地提供接口的方法实现。

如下所示:

InterfaceName objectReference = new InterfaceName() {
    // 在大括号内部实现接口方法
    @Override
    public void methodName() {
        // 方法实现
    }
};

参数说明:

  • 接口名称(InterfaceName):这是要实现的接口的名称。
  • objectReference:这是一个可选的引用变量,用于引用匿名内部类的对象。
  • 在大括号内部实现接口方法:在匿名内部类的大括号内,可以提供接口方法的实现。
  • 方法实现:在接口方法的大括号内部,您可以编写实际的方法逻辑。

示例:

interface Greeting {
    void greet();
}

public class AnonymousInnerClassExample {
    public static void main(String[] args) {
        // 使用匿名内部类实现接口
        Greeting greeting = new Greeting() {
            @Override
            public void greet() {
                System.out.println("Hello, world!");
            }
        };

        // 调用匿名内部类实现的方法
        greeting.greet(); // 输出 "Hello, world!"
    }
}

 

2.继承类的匿名内部类

要创建继承类的匿名内部类,需要在对象创建的地方内联地提供类的定义,并且可以在匿名内部类中重写父类的方法。

如下所示:

ClassName objectReference = new ClassName() {
    // 在大括号内部重写父类方法
    @Override
    public void methodName() {
        // 方法实现
    }
};

示例:

class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

public class AnonymousInnerClassExample {
    public static void main(String[] args) {
        // 使用匿名内部类继承类
        Animal animal = new Animal() {
            // 在大括号内部重写父类方法
            @Override
            void makeSound() {
                System.out.println("Dog barks");
            }
        };

        // 调用匿名内部类重写的方法
        animal.makeSound(); // 输出 "Dog barks"
    }
}

在这个示例中,我们有一个父类 Animal,然后使用匿名内部类创建了一个继承自 Animal 的匿名子类。

在匿名内部类中,我们重写了父类的 makeSound 方法,并提供了不同的实现来改变动物的声音。

 

匿名内部类注意事项

  • 匿名内部类没有显式的类名,它是隐式的,只能在创建对象的地方定义。
  • 匿名内部类可以访问外部类的成员和方法,但外部类的成员变量必须是 finaleffectively final 的。
  • 匿名内部类的作用范围通常被限定在包含它的方法内部,除非它使用了外部类的成员变量。
  • 匿名内部类适用于实现接口、继承抽象类、重写父类方法以及提供实际的方法实现。
评论交流
    说说你的看法