匿名类(Anonymous Classes)

2023年4月30日12:08:15

匿名类

匿名类可以让代码更加简洁,因为它允许声明的同时实例化一个类。类似于局部类,只不过他们没有名字,当只需要一次局部类时,用匿名类更简洁。

匿名类的声明

局部类的声明是类的声明,但匿名类的声明是一个表达式。下面的例子中,frenchGreetingspanishGreeting的初始化使用了匿名类,而englishGreeting的初始化使用了局部类。

public class HelloWorldAnonymousClasses {
  
    interface HelloWorld {
        public void greet();
        public void greetSomeone(String someone);
    }
  
    public void sayHello() {
        
        class EnglishGreeting implements HelloWorld {
            String name = "world";
            public void greet() {
                greetSomeone("world");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hello " + name);
            }
        }
      
        HelloWorld englishGreeting = new EnglishGreeting();
        
        HelloWorld frenchGreeting = new HelloWorld() {
            String name = "tout le monde";
            public void greet() {
                greetSomeone("tout le monde");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Salut " + name);
            }
        };
        
        HelloWorld spanishGreeting = new HelloWorld() {
            String name = "mundo";
            public void greet() {
                greetSomeone("mundo");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Hola, " + name);
            }
        };
        englishGreeting.greet();
        frenchGreeting.greetSomeone("Fred");
        spanishGreeting.greet();
    }

    public static void main(String... args) {
        HelloWorldAnonymousClasses myApp =
            new HelloWorldAnonymousClasses();
        myApp.sayHello();
    }            
}

Syntax of Anonymous Classes

语法

As mentioned previously, an anonymous class is an expression. The syntax of an anonymous class expression is like the invocation of a constructor, except that there is a class definition contained in a block of code.
匿名类是一个表达式,它的语法类似于构造方法的调用,加上代码块中类的定义。

HelloWorld frenchGreeting = new HelloWorld() {
	  String name = "tout le monde";
	  public void greet() {
	      greetSomeone("tout le monde");
	  }
	  public void greetSomeone(String someone) {
	      name = someone;
	      System.out.println("Salut " + name);
	  }
	};

匿名类的定义包括:

  • new 关键字
  • 匿名类要实现的接口名或是要继承的类名
  • 跟普通类的实例化一样,要传给构造方法的参数,用圆括号包起来。如果是接口,就没有构造方法,那么就跟一对空的圆括号。
  • 类的声明体,可以有方法声明,但不能有statement,但是上面String name = "tout le monde";好像又是,此处有疑问

访问所在作用域的局部变量,声明和访问匿名类的成员

匿名类访问外部变量的规则(和局部类相同):

  • 匿名类可以访问外部类的成员(成员变量和方法)
  • 对于局部变量,只有声明成finaleffectively final时匿名类才能访问它
  • 和其他嵌套类一样,匿名类中定义的变量投影所在作用域的同名变量

匿名类定义成员的规则(和局部类相同):

  • 不能定义静态初始化块和成员接口
  • 可以有静态成员变量,只要它们是常量

能在匿名类中定义的有:

  • 字段(Fields)
  • 其他方法(即使不是父类中的)
  • 初始化代码块
  • 局部类

不能在匿名类中定义构造方法。

  • 作者:cjay_fighting
  • 原文链接:https://blog.csdn.net/baidu_32223873/article/details/89302227
    更新时间:2023年4月30日12:08:15 ,共 1987 字。