anonymous classes能够让你的代码更加简洁,使你在同一时间声明和实例化一个类,相似于一个没有名字的内部类,若你只须要一次使用一个内部类
一、声明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();
}
}
二、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对象实例化语句块的一部分
二、局部变量访问范围和声明及访问匿名类的成员
像内部类,匿名类能够捕获变量;它们有相同的本地变化访问范围:
a、匿名类能够访问它类做用域的成员
b、匿名类不能访问在其做用域没有被声明final的局部变量
c、像一个嵌套类,在其做用域中类型声明不能有相同的名字
匿名类当作内部类也有一样的限制
d、在一个匿名类中,不能声明一个static初始化块或接口成员
e、一个匿名类能够有static成员提供常量
在一个匿名类中,你能够声明下面:
字段、方法、实例初始化块、内部类
但不能声明构造器ide