anonymous classes可以让你的代码更加简洁,使你在同一时间声明和实例化一个类,类似于一个没有名字的内部类,若你只需要一次使用一个内部类
1、声明Anonymous Classes
内部类是类声明,匿名类是表达式,意味这你在另一个表达式中定义该类,如下面例子,在初始化本地变量 frenchGreeting和 spanishGreeting使用anonymous classes,但初始化 englishGreeting使用一个内部类:
public class HelloWorldAnonymousClasses {
interface HelloWorld {
public void greet();
public void greetSomeone(String someone);
}
public void sayHello(){
class EnglishGreeting implements HelloWorld {
String name = "world";
@Override
public void greet() {
greetSomeone("world");
}
@Override
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";
@Override
public void greet() {
greetSomeone("tout le monde");
}
@Override
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
HelloWorld spanishGreeting = new HelloWorld(){
String name = "mundo";
@Override
public void greet() {
greetSomeone("mundo");
}
@Override
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();
}
}
2、Anonymous Classes语法
如上面提到的,匿名类是一个表达式,匿名类表达式的语法类似调用一个构造器,除了有一个代码块包含该类的定义:
HelloWorld frenchGreeting = new HelloWorld(){
String name = "tout le monde";
@Override
public void greet() {
greetSomeone("tout le monde");
}
@Override
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
匿名类表达式由下面组成:
a、new操作符
b、一个要实现的接口or继承类的名字,上面,匿名类实现HelloWorld接口
c、圆括号包含参数的构造器,就像一个正常类实例创建表达式
d、一个类的定义体,在定义体中,允许声明方法,语句块不允许
因为匿名类的定义是一个表达式,它必须是语句块的一部分,上面例子中,匿名类是 frenchGreeting对象实例化语句块的一部分
2、局部变量访问范围和声明及访问匿名类的成员
像内部类,匿名类可以捕获变量;它们有相同的本地变化访问范围:
a、匿名类可以访问它类作用域的成员
b、匿名类不能访问在其作用域没有被声明final的局部变量
c、像一个嵌套类,在其作用域中类型声明不能有相同的名字
匿名类当做内部类也有同样的限制
d、在一个匿名类中,不能声明一个static初始化块或接口成员
e、一个匿名类可以有static成员提供常量
在一个匿名类中,你可以声明下面:
字段、方法、实例初始化块、内部类
但不能声明构造器
来源:oschina
链接:https://my.oschina.net/u/235969/blog/219584