2023.8 - java -匿名内部类

匿名内部类是一种特殊的内部类,它没有显式的类名,而是在声明和创建时同时定义。它通常用于创建只需使用一次的简单类或接口的实例。
匿名内部类的主要用途是在需要创建临时对象并使用其方法或覆盖其行为的情况下,避免编写额外的类定义。它通常在局部方法中使用,或者作为实现接口的替代方式。
interface Greeting {
    void sayHello();
}

public class Main {
    public static void main(String[] args) {
        Greeting greeting = new Greeting() {
            @Override
            public void sayHello() {
                System.out.println("Hello, World!");
            }
        };
        
        greeting.sayHello(); // 输出: Hello, World!
    }
}
在上面的示例中,我们创建了一个匿名内部类,实现了 `Greeting` 接口,并重写了其中的 `sayHello` 方法。然后,我们通过匿名内部类的实例对象调用了 `sayHello` 方法。

匿名内部类可以使代码更简洁,但由于其没有类名,因此无法在其他地方再次使用。因此,如果需要多次使用相同的逻辑,建议使用具名的内部类或独;:立的类来实现。
/**
 * Java匿名内部类的例子
 */
abstract class Person{
    abstract void eat();
}
class Demo{
    public static void main(String args[]){
        Person p=new Person(){
            void eat(){
                System.out.println("很好吃...");
            }
        };
        p.eat();
    }
}

3 Java匿名内部类工作原理:

Person p=new Person(){  
    void eat(){
      System.out.println("很好吃...");
    }  
};  
  • 创建了一个类,但其名称由编译器决定,该编译器扩展了Person类并提供了eat() 方法的实现。
  • 创建由Person类型的p引用变量引用的匿名类的对象。

以下是反编译的匿名内部类源码:

import java.io.PrintStream;  

static class Demo$1 extends Person  
{  
   Demo$1(){}  
   void eat()  
    {  
        System.out.println("很好吃...");  
    }  
}  

4 使用接口的匿名内部类的例子

interface Eatable{
    void eat();
}
class Demo{
    public static void main(String args[]){
        Eatable e=new Eatable(){
            public void eat(){System.out.println("很好吃的苹果...");}
        };
        e.eat();
    }
}

使用接口的匿名内部类工作原理 :

  • 创建了一个类,但是其名称由编译器决定,该编译器实现Eatable接口并提供eat() 方法的实现。
  • 创建由Eatable类型的p引用变量引用的匿名类的对象。

以下为反编译带接口的匿名内部类的源码:

import java.io.PrintStream; 
 
static class Demo$1 implements Eatable  
{  
    Demo$1(){}  
    void eat(){
        System.out.println("很好吃的苹果...");
    }  
}  

你可能感兴趣的:(2023-java,java,开发语言)