匿名类
匿名类可以让代码更加简洁,因为它允许声明的同时实例化一个类。类似于局部类,只不过他们没有名字,当只需要一次局部类时,用匿名类更简洁。
匿名类的声明
局部类的声明是类的声明,但匿名类的声明是一个表达式。下面的例子中,frenchGreeting
和spanishGreeting
的初始化使用了匿名类,而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";
好像又是,此处有疑问
访问所在作用域的局部变量,声明和访问匿名类的成员
匿名类访问外部变量的规则(和局部类相同):
- 匿名类可以访问外部类的成员(成员变量和方法)
- 对于局部变量,只有声明成
final
或effectively final时匿名类才能访问它 - 和其他嵌套类一样,匿名类中定义的变量投影所在作用域的同名变量
匿名类定义成员的规则(和局部类相同):
- 不能定义静态初始化块和成员接口
- 可以有静态成员变量,只要它们是常量
能在匿名类中定义的有:
- 字段(Fields)
- 其他方法(即使不是父类中的)
- 初始化代码块
- 局部类
不能在匿名类中定义构造方法。
热门文章
- 最大生成树Bad Cowtractors_在线工具
- 被家猫咬了一个小孔就一丁点血,然后早上伤口已经愈合(被猫咬出一个小伤口流血了)
- 4月10日|Clash/SSR/V2ray/Shadowrocket每天更新21.8M/S免费节点订阅链接地址分享
- 青岛动物学院(青岛动物学院招生简章)
- 开宠物店最怕被什么部门投诉(开宠物店会亏本吗)
- 3月6日|SSR/Clash/V2ray/Shadowrocket每天更新20.9M/S免费节点订阅链接地址分享
- 4月1日|Shadowrocket/SSR/V2ray/Clash每天更新20.7M/S免费节点订阅链接地址分享
- 3月30日|SSR/Clash/Shadowrocket/V2ray每天更新21.9M/S免费节点订阅链接地址分享
- 3月10日|Clash/Shadowrocket/V2ray/SSR每天更新22M/S免费节点订阅链接地址分享
- 狗粮加盟店 狗粮加盟厂