匿名类是一种特殊的内部类,它是在一个表达式内部包含一个完整的类定义。所谓的匿名就是该类连名字都没有,匿名内部类不可以有构造器,因为匿名内部类是要扩展或实现父类或接口。匿名内部类可以继承其他类,因为是类就是继承自Object类的。
匿名内部类实现接口指的是类本身定义的时候实现接口还是直接定义匿名内部类的时候实现接口,前者肯定是可以的,后者应该是不行的,光从语法上都不能实现,如:
class B { }
class C{
public void z(){
Thread t=new Thread(new A(){//这里定义了一个无名内部类,要实现接口,语法上都是不能实现的
public void run() { }
});
}
class A extends B implements Runnable,Serializable,Cloneable
{ //如果在new 以后写继承其他类或是实现接口都是错误的
public void run(){ }
}
}
public class A {
int i = 1;
public A() {
Thread thread = new Thread() {//匿名内部类
public void run() {
for(;;) {
A.this.run();//用到了外部类的 run 函数,用外部类的类名加上 this 引用来说明要调用的是外部类的方法 run
try {
sleep(1000);
} catch(InterruptedException ie) {
}
}//for
}//run
};//Thread
thread.start();
} //A()
public void run() {
System.out.println("i = " + i);
i++;
}
public static void main(String[] args) throws Exception {
new A();
}
}
本地内部类与匿名内部类的区别在于本地内部类有构造函数,而匿名内部类只能实例初始化。
匿名内部类:通常用在Java的事件处理上
package inner; System.out.println(str); } |
在上面的例子中, 方法addMouseListener接受一个对象型的参数表达式, 于是, 在参数里, 我们定义了一个匿名内部类,这个类是一个MouseAdapter类型的类, 同时在这个类中定义了一个继承的方法mousePressed, 整个类做为一个参数.这个类没有名称, 但是当执行这个表达式时它被自动实例化.