`

匿名类

 
阅读更多

 

匿名类

匿名类可以让你的代码更简洁,可以同时声明并实例化一个类。匿名类就像一个没有名称的本地类。如果有一个本地类只使用一次,那么就可以用到匿名类

 

声明匿名类

本地类定义是类声明,匿名类是在表达式中定义。在下面的例子中,在本地变量spanishGreet的初始化语句中使用到匿名类,在本地变量的初始化中使用了本地类。(初始化和初始化语句的区别可以自己看代码理解)

class HelloWorldAnonymousClass {
    interface HelloWorld{
        public void greet();
    }

    public void sayHello(){
        class EnglishGreeting implements HelloWorld{
            @Override
            public void greet() {
                System.out.println("hello");
            }
        }

        HelloWorld englishGreet = new EnglishGreeting();

        HelloWorld spanishGreet = new HelloWorld() {
            @Override
            public void greet() {
                System.out.println("hola");
            }
        };

        englishGreet.greet();
        spanishGreet.greet();
    }

}

 

匿名类语法

正如前面提到的,匿名类是一个表达式。除了有一个类定义在一个代码块中之外,匿名类的语法就像调用一个构造函数一样。

匿名类表达式包含以下几个部分:

1.new 关键词

2.要实现的接口或要继承的类的名称,在这个例子中就是接口HelloWorld

3.一个包含构造函数参数的括号,就像一个一般类的实例化创建表达式那样。如果是实现一个接口的话,那就没有构造函数,所以直接使用空括号

4.一个类定义实体

由于匿名类定义是一个表达式,那它就必须是语句的一部分。上面例子中,匿名类表达式就是spanishGreet变量初始化语句的一部分。(这也说明为什么在最后要跟个封号)

 

匿名类使用规则

就像本地类一样,匿名类可以获得外部作用域的本地变量

1.匿名类可以获得外部类的成员

2.匿名类不能获得外部作用域中不是final或实际final的本地变量

3.就像内嵌类一样,在匿名类中声明的类型(比如变量)会遮蔽外部作用相同名称的声明

匿名类关于它的成员,也有跟本地类一样的限制条件

1.不能在匿名类中声明静态初始化或成员接口

2.一种例外就是静态成员时常量变量时

可以在匿名类中声明以下内容:

1.属性

2.不在继承父类或接口中存在的额外的方法

3.实例初始化

4.本地类

但是不能再匿名类中声明一个构造函数

 

匿名类的原理

跟本地类一样,不过就是通过编译器给一个class名称罢了

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics