匿名类
匿名类可以让你的代码更简洁,可以同时声明并实例化一个类。匿名类就像一个没有名称的本地类。如果有一个本地类只使用一次,那么就可以用到匿名类
声明匿名类
本地类定义是类声明,匿名类是在表达式中定义。在下面的例子中,在本地变量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名称罢了