Anonymous Classes语法

浪尽此生 提交于 2019-12-03 14:15:10

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成员提供常量
    在一个匿名类中,你可以声明下面:
    字段、方法、实例初始化块、内部类
    但不能声明构造器

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!