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