Java匿名内部类相关

匿名内部类的前提:内部类可以处于成员位置上。

 1 class Outer
 2 {
 3     int x=3;
 4     void method()
 5     {
 6         class Inner
 7         {
 8             void function()
 9             {
10                 System.out.print(Outer.this.x);
11             }
12         }
13     }
14 }
15  

匿名内部类只是一种简写格式:

    1.匿名内部类其实就是内部类的简写格式。

    2.定义匿名内部类的前提:

        内部类必须是继承一个类或者实现接口。

    3.匿名内部类的格式:

1 new 父类或者子类接口()
2 {
3      定义子类内容;
4 }    

    4.其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖。可以理解为带内容的对象。

 1 class Outer
 2 {
 3     int x = 3;
 4 
 5     class Inner extends AbsDemo//正常写法,若是想匿名写就必须继承或者实现一个接口
 6     {
 7         void show()
 8         {
 9             System.out.print("show:" + x);
10         }
11     }
12 
13     public void function()
14     {
15         new Inner().show();
16     }
17 }
18 abstract class AbsDemo
19 {
20     abstract void show();
21 }
22 
23 class Outer
24 {
25     int x = 3;
26 
27     public void function()
28     {
29         /*
30          * 与new Inner().show(); 相比,下面的相当于把Inner替换了, 
31                  * 但是没有Inner类,所以调用其父类,父类中含有抽象方法,
32          * 所以要先去实现。建立对象之后,调用对象的的方法.show() 也就理所当然了。
33          */
34         new AbsDemo() // 匿名内部类
35         {
36             @Override
37             void show()
38             {
39                 System.out.print("x==" + x);
40             }
41         }.show();
42     }
43 }

5.如果你匿名内部类里面覆盖和(或)定义了两个以上的方法,就不能用匿名的方式了,因为匿名的只能调用一次。所以要是想用两个方法,就得起个名儿。

1 AbsDemo a = new AbsDemo() // 匿名内部类
2 {
3     @Override
4     void show()
5     {
6         System.out.print("x==" + x);
7     }
8 };

注意,AbsDemo是父类,建立的a是子类对象,这不就是多态嘛。

但是在调用的时候

1 a.show();//这个问题不大
2 a.abc();//这个就编译不过去了,父类根本就没有abc方法。
原文地址:https://www.cnblogs.com/KangYh/p/9790949.html