匿名内部类在开发中的使用
我们在开发的时候,会看到抽象类,或者接口作为方法的形式参数。 而这个时候,我们知道实际需要的是一个子类的对象。 如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式进行简化。
Android开发中这种格式见得多, JavaEE开发中见得少。 为什么呢? 因为匿名内部类的好处是: 匿名内部类用完之后就是垃圾(即只能用一次),就可以立即被垃圾回收器回收, 栈内存没有东西指向你,Android的手机内存小,要及时让这个对象被回收。
示例代码如下:
1 /*
2 匿名内部类在开发中的使用:
3 Android开发中这种格式见得多,
4 JavaEE开发中见得少。
5
6 为什么呢?
7 因为匿名内部类的好处是:
8 匿名内部类用完之后就是垃圾(即只能用一次),就可以立即被垃圾回收器回收,
9 栈内存没有东西指向你,Android的手机内存小,要及时让这个对象被回收。
10 */
11
12 //定义一个接口
13 interface Person {
14 public abstract void study();
15 }
16
17 //定义具体类实现接口
18 class Student implements Person {
19 public void study() {
20 System.out.println("好好学习,天天向上");
21 }
22 }
23
24 //方法的形式参数为接口时,需要的是该接口的实现类的对象。
25 class PersonDemo {
26 //接口名作为方法的形式参数
27 //其实这里需要的不是接口,而是该接口的实现类的对象
28 public void method(Person p) {
29 p.study();
30 }
31 }
32
33 class InnerClassTest2 {
34 public static void main(String[] args) {
35 //法一:测试PersonDemo类中的method方法。
36 PersonDemo pd = new PersonDemo();
37 Person p = new Student();
38 pd.method(p);
39 System.out.println("--------------------");
40
41 //法二:匿名内部类在开发中的使用:
42 //匿名内部类的本质是该类的子类或者实现该接口的实现类(子类)的匿名对象。
43 pd.method(new Person(){
44 public void study() {
45 System.out.println("好好学习,天天向上");
46 }
47 });
48 }
49 }
50
51 运行结果为:
52 好好学习,天天向上
53 --------------------
54 好好学习,天天向上
匿名内部类的面试题
按照要求,补齐代码 interface Inter {
void show();
} class Outer { //补齐代码 } class OuterDemo { public static void main(String[] args) { Outer.method().show(); } } 要求在控制台输出”HelloWorld”
示例代码如下:
1 /*
2 匿名内部类的面试题:
3 按照要求,补齐代码
4 interface Inter {
5 void show();
6 }
7 class Outer {
8 //补齐代码
9 }
10 class OuterDemo {
11 public static void main(String[] args) {
12 Outer.method().show();
13 }
14 }
15 要求在控制台输出”HelloWorld”
16 */
17 interface Inter {
18 void show();
19 // public abstract
20 }
21
22 class Outer {
23 // 补齐代码
24 public static Inter method() {
25 // 子类对象 -- 子类匿名对象是子类对象的一种
26 return new Inter() {
27 public void show() {
28 System.out.println("HelloWorld");
29 }
30 };
31
32 }
33 }
34
35 class OuterDemo {
36 public static void main(String[] args) {
37 Outer.method().show();
38 /*
39 * 1:Outer.method()可以看出method()应该是Outer中的一个静态方法。
40 * 2:Outer.method().show()可以看出method()方法的返回值是一个对象。
41 * 又由于接口Inter中有一个show()方法,所以我认为method()方法的返回值类型是一个接口。
42 */
43 }
44 }