匿名类Anonymous Classes
Anonymous Classes
匿名类可以是你的代码更加简。你可以同时声明和实例化一个匿名类。匿名类与局不累很想,只不过没有名字。如果你只想使用一个局部类一次,就可以是用匿名类。
本节包含了一下主题:
声明匿名类
局不类是声明,而匿名类是表达式,意思是你在另外一个表达式中定义这个类。下面的例子,HelloWorldAnonymousClasses
, 在局部变量 frenchGreeting
以及spanishGreeting
的初始化过程中使用了匿名类,而 而局部变量 englishGreeting
的声明则使用的局部类:
|
|
匿名类的语法Syntax of Anonymous Classes
就像之前提到的一样,一个匿名类是一个表达式。匿名类表达式的语法类似调用一个构造器,不过在后边多了定义类的代码块。
参考一下 frenchGreeting
对象的实例:
|
|
匿名类表达式由一下几部分组成:
new
操作符- 一个用来实现的接口或者用来继承的类的名称。本例中,匿名类为接口
HelloWorld
的实现。 - 包含构造器参数的圆括号,类似普通的类创建实例表达式。注意: 当你实现一个接口时,没有构造器,所以你使用一个空的圆括号。
- 一个类体,包括了类的定义。需要注意的事,在类体中可以允许方法声明,但是不允许有语句。
因为匿名类的定义是一个表达式,他必须是语句的一部分。在本例中,匿名类表达式是实例化frenchGreeting
对象语句的一部分。(这也解释了为什么需要在闭合的大括号后面需要一个分号)
访问闭合氛围内的局部变量,以及声明和访问匿名类的成员
就像局不类一样,匿名类可以 捕获变量capture variables;他们对于闭合范围内的局部变量具有相同的访问权限:
- 匿名类可以访问他的闭合类的成员。
- 匿名类不能访问他所属闭合范围内定义不是
final
或者等效于与final
的局部变量。 - 与嵌套类一样,在匿名类中声明某一类型的变量会遮蔽它所属闭合范围内的其它名字相同的变量。参考 遮蔽Shadowing以获取更多信息。
匿名类与局不累一样对它自己的成员访问有一些限制:
- 你不能在匿名类中定义静态的初始化器或者是成员接口.
- 匿名类中可以是用静态成员来定义常量。
注意你可以在匿名类中定义以下内容:
- 字段/属性Fields
- 扩展方法(尽管他们没有实现任何父类的方法)
- 实例初始化器
- 局不类
不过你不能再匿名类中定义构造器.
匿名类的实例Examples of Anonymous Classes
匿名类经常在图形界面的应用中使用。
参考下列JavaFX 列子 HelloWorld.java
(摘自 Hello World, JavaFX Style 中 Getting Started with JavaFX). 这个例子创建了一个报刊了 Say ‘Hello World’按钮的框架 :
|
|
本例中I,方法调用btn.setOnAction
定义了当你选择Say ‘Hello World’按钮的时候回发生什么.这个方法要求一个 EventHandler<ActionEvent>
类型的对象. EventHandler<ActionEvent>
接口仅包含一个方法,handle。这里没有重新定义一个类来实现这个方法,而是直接使用了匿名类表达式。注意这个表达式是传递给btn.setOnAction
方法的参数.
因为 EventHandler<ActionEvent>
接口仅仅包含一个方法,你同样可以使用lambda表达式来代替匿名类表达式. 参考Lambda Expressions 章节来获取更多信息.
匿名类是用来实现包含有两个或多个方法接口的理想方法。下面的例子JavaFX example 来自Customization of UI Controls](https://docs.oracle.com/javase/8/javafx/user-interface-tutorial/custom.htm). 代码中创建了一个只接受数字值文本域. 它使用匿名类重新定义了TextField
类,复写了继承自 TextInputControl
类的 replaceText
和 replaceSelection
方法.
|
|