1、匿名内部类:就是没有名字的内部类,当程序中使用一个匿名内部类时,在定义匿名内部类的地方往往创建该类的一个对象,
匿名内部类的声明格式如下:
new ParentName(){
...// 内部类的定义
}
package Inner;
interface Product
{
public double getPrice();
public String getName();
}
public class Test
{
public void cc(Product p)
{
System.out.println("购买了一个" + p.getName() + ",花掉了" + p.getPrice());
}
public static void main(String[] args)
{
Test test = new Test();
test.cc(new Product()
{
public double getPrice()
{
return 567;
}
public String getName()
{
return "thinkpad";
}
});
}
}
{
public double getPrice();
public String getName();
}
public class Test
{
public void cc(Product p)
{
System.out.println("购买了一个" + p.getName() + ",花掉了" + p.getPrice());
}
public static void main(String[] args)
{
Test test = new Test();
test.cc(new Product()
{
public double getPrice()
{
return 567;
}
public String getName()
{
return "thinkpad";
}
});
}
}
匿名内部类会隐式地继承一个父类或实现一个接口。
1
.
怎样判断一个匿名类的存在啊?看不见名字,感觉只是父类new出一个对象而已,没有匿名类的名字。
一般来说,new 一个对象时小括号后应该是分号,也就是new出对象该语句就结束了。
但是出现匿名内部类就不一样,小括号后跟的是大括号,大括号中是该new 出对象的具体的实现方法。
因为我们知道,一个抽象类是不能直接new 的,必须先有实现类了我们才能new出它的实现类。
上面的伪代码就是表示new 的是Father的实现类,这个实现类是个匿名内部类。
但是出现匿名内部类就不一样,小括号后跟的是大括号,大括号中是该new 出对象的具体的实现方法。
因为我们知道,一个抽象类是不能直接new 的,必须先有实现类了我们才能new出它的实现类。
上面的伪代码就是表示new 的是Father的实现类,这个实现类是个匿名内部类。
2.匿名内部类的注意事项
注意匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
在使用匿名内部类时,要记住以下几个原则:
·匿名内部类不能有构造方法(因为匿名内部类没有类名)
·匿名内部类不能定义任何静态成员、方法和类。
·匿名内部类不能是public,protected,private,static。
·只能创建匿名内部类的一个实例。
·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现
最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口
实例4: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();
}
}
|