Java匿名类
作用:重写其方法,或实现抽象方法、接口。来完成自己的特殊实现。正因为没有名字
所以匿名内部类只能使用一次,它通常用来简化代码编写,匿名内部类没有构造器。
内部类能够访问外部类的一切成员变量和方法,包括私有的。
注意事项
1)访问外层Class里面的字段。
2)不能访问外层方法中的本地变量。除非变量是final。(拷贝引用,为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变)
3)如果内部类的名称和外面能访问的名称相同,则会把名称覆盖掉。
4)不能定义静态初始化代码块(StaticInitializer)
5)不能在匿名类里面定义接口、不能定义构造函数的。
6)匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
实例1:匿名内部类的基本实现
Abstract class Person {//如果是一般类的话,就是重写方法
public
abstract
void
eat();
}
public class Test{
private intfoo;
public void show() {
final int doo = 0;
Person person =new Person () {
public void run() {
System.out.println(doo);
}
};
person.run();
}
}
实例2:在接口上使用匿名内部类
interface
Person {
public
void
eat();
}
public
class
Demo {
public
static
void
main(String[] args) {
Person p = new
Person() {
public
void
eat() {
System.out.println("eat something");
}
};
p.eat();
}
}
运行结果:eat something
由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现
最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口
实例3:Thread类的匿名内部类实现
public
class
Demo {
public
static
void
main(String[] args) {
Thread t = new
Thread() {
public
void
run() {
for
(int
i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
t.start();
}
}
运行结果:1 2 3 4 5
实例4:Runnable接口的匿名内部类实现
public
class
Demo {
public
static
void
main(String[] args) {
Runnable r = new
Runnable() {
Public
void
run() {
for
(int
i = 1; i <= 5; i++) {
System.out.print(i + " ");
}
}
};
Thread t = new
Thread(r);
t.start();
}
}
运行结果:1 2 3 4 5
实例5:匿名内部类初始化
我们一般都是利用构造器来完成某个实例的初始化工作的,但是匿名内部类是没有构造器的!那怎么来初始化匿名内部类呢?使用构造代码块!利用构造代码块能够达到为匿名内部类创建一个构造器的效果。
public class Test {
public String getName() {
returnnull;
}
public int getAge() {
return 0;
}
}
public class HelloA {
public Test getInnerClass(finalint age, final String name) {
return new Test() {
int age_; String name_;
//构造代码块完成初始化工作
{
if (0 < age && age <200) {
age_= age;
name_= name;
}
}
public String getName() {
return name_;
}
public int getAge() {
return age_;
}
};
}
public static void main(String[] args) {
HelloA out = new HelloA();
Test inner_1 = out.getInnerClass(199,"chenssy");
System.out.println(inner_1.getName()+" : "+inner_1.getAge());
}
}