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

相关文章
相关标签/搜索