实例1:不使用匿名内部类来实现抽象方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
abstract class Person
{ public abstract void eat(); } class Child extends Person
{ public void eat()
{ System.out.println( "eat
something" ); } } public class Demo
{ public static void main(String[]
args) { Person
p = new Child(); p.eat(); } } |
运行结果:eat something
可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用
但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?
这个时候就引入了匿名内部类
实例2:匿名内部类的基本实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
abstract class Person
{ public abstract 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
可以看到,我们直接将抽象类Person中的方法在大括号中实现了
这样便可以省略一个类的书写
并且,匿名内部类还能用于接口上
实例3:在接口上使用匿名内部类
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接口
实例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(); } } |
运行结果:1 2 3 4 5
实例5:Runnable接口的匿名内部类实现
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@Override public void run() { // TODO Auto-generated method stub for(int i =0;i<10;i++) { Log.i("runble",Double.toString(i)); } } };
//将其加入到线程队列myHandler.post(myrunble);
|
运行结果:0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
//实战
Android中Handler作为匿名内部类使用
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mainactivity);
Message msg = new Message();
msg.arg1 = 1;
myhandler.sendMessage(msg);
//myhandler.handleMessage(msg);
//myhandler.post()
}
private static Handler myhandler = new Handler(){
public void handleMessage(Message msg){
Log.i("message",Double.toString(msg.arg1));
super.handleMessage(msg);
}
};
运行结果:1.0