Anonymous Classes語法

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

相關文章
相關標籤/搜索