Eason-S

导航

java中的匿名内部类小结

  匿名内部类也就是没有名字的内部类。正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写。

  但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口。

实例1:不使用匿名内部类来实现抽象方法

 1 abstract class Person {
 2     public abstract void eat();
 3 }
 4 
 5 class Child extends Person {
 6     public void eat() {
 7         System.out.println("eat something");
 8     }
 9 }
10 
11 public class Demo {
12     public static void main(String[] args) {
13         Person p = new Child();
14         p.eat();
15     }
16 }
17 //运行结果:eat something

  可以看到,我们用Child继承了Person类,然后实现了Child的一个实例,将其向上转型为Person类的引用。但是,如果此处的Child类只使用一次,那么将其编写为独立的一个类岂不是很麻烦?

  这个时候就引入了匿名内部类。

实例2:匿名内部类的基本实现

 1 abstract class Person {
 2     public abstract void eat();
 3 }
 4 
 5 public class Demo {
 6     public static void main(String[] args) {
 7         Person p = new Person() {
 8             public void eat() {
 9                 System.out.println("eat something");
10             }
11         };
12         p.eat();
13     }
14 }
15 //运行结果:eat something

  可以看到,我们直接将抽象类Person中的方法在大括号中实现了,这样便可以省略一个类的书写,并且,匿名内部类还能用于接口上。

实例3:在接口上使用匿名内部类

 1 interface Person {
 2     public void eat();
 3 }
 4 
 5 public class Demo {
 6     public static void main(String[] args) {
 7         Person p = new Person() {
 8             public void eat() {
 9                 System.out.println("eat something");
10             }
11         };
12         p.eat();
13     }
14 }
15 //运行结果:eat something

  由上面的例子可以看出,只要一个类是抽象的或是一个接口,那么其子类中的方法都可以使用匿名内部类来实现。最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口。

实例4:Thread类的匿名内部类实现

 1 public class Demo {
 2     public static void main(String[] args) {
 3         Thread t = new Thread() {
 4             public void run() {
 5                 for (int i = 1; i <= 5; i++) {
 6                     System.out.print(i + " ");
 7                 }
 8             }
 9         };
10         t.start();
11     }
12 }
13 //运行结果:1 2 3 4 5

实例5:Runnable接口的匿名内部类实现

 1 public class Demo {
 2     public static void main(String[] args) {
 3         Runnable r = new Runnable() {
 4             public void run() {
 5                 for (int i = 1; i <= 5; i++) {
 6                     System.out.print(i + " ");
 7                 }
 8             }
 9         };
10         Thread t = new Thread(r);
11         t.start();
12     }
13 } 
14 //运行结果:1 2 3 4 5

 

转载于:http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html#!comments

posted on 2016-08-25 13:03  Eason_S  阅读(258)  评论(0编辑  收藏  举报