匿名内部类是内部类的简写格式, 其实就是一个匿名子类对象。使用匿名内部类必须继承或实现一个类或者接口。格式:new 父类或者接口(){子类内容};

 1 //定义匿名内部类实例一
 2 public class InnerClassDome {
 3     public static void main(String[] args)
 4     {
 5         Outer outer = new Outer();
 6         outer.method();
 7     }
 8 }
 9 
10 abstract class Demo
11 {
12     abstract void show();
13 }
14 
15 class Outer
16 {
17     private int num = 3;
18     /*class Inner extends Demo
19     {
20         void show()
21         {
22             System.out.println("show ...");
23         }
24     }*/
25     public void method()
26     {
27         //new Inner().show();
28         //下面就是匿名内部类的格式
29         new Demo()
30         {
31             @Override
32             void show() {
33                 System.out.println("show ...");
34             }
35         }.show();
36     }
37 }

 

 1 //定义匿名内部类实例二
 2 public class InnerClassDome {
 3     public static void main(String[] args)
 4     {
 5         new Outer().method();
 6     }
 7 }
 8 
 9 interface Demo
10 {
11     public abstract void show1();
12     public abstract void show2();
13 }
14 
15 class Outer
16 {
17     public void method()
18     {
19         Demo demo = new Demo()
20         {
21             @Override
22             public void show1() {
23                 System.out.println("show1 ... ");
24             }
25 
26             @Override
27             public void show2() {
28                 System.out.println("show2 ... ");
29             }
30         };
31         demo.show1();
32         demo.show2();
33     }
34 }

 

使用场景

当函数参数是接口类型是,而且接口中的方法超不过三个,可以用匿名内部类作为时间参数进行传递。

 1 public class InnerClassDome {
 2     public static void main(String[] args)
 3     {
 4         show(new Inter() {
 5             @Override
 6             public void show1() {
 7                 System.out.println("show1 ... ");
 8             }
 9 
10             @Override
11             public void show2() {
12                 System.out.println("show2 ...");
13             }
14         });
15     }
16 
17     public static void show(Inter inter)
18     {
19         inter.show1();
20         inter.show2();
21     }
22 }
23 
24 interface Inter
25 {
26     public abstract void show1();
27     public abstract void show2();
28 }

 

匿名内部类细节

 1 //细节一:主函数不可调用非静态的匿名内部类,想调用必须给匿名内部类加上static
 2 class InnerClassDemo
 3 {
 4     class Inner
 5     {
 6     }
 7         
 8     public static void main(string[] args)
 9     {
10         //new Inner();//这里会报错
11     }
12     
13     public void method()
14     {
15         new Inner();    
16     }
17 }

 

 1 //细节二:所有子类都默认继承Object,但不能实例成一个匿名内部类
 2 //会报错的程序
 3 class Outer
 4 {
 5     void method()
 6     {
 7         Object obj = new Object(){
 8             public void show()
 9             {
10                 System.out.println("show...");
11             }
12         };
13         obj.show();//因为匿名内部类这个子类对象被向上转型为object类型
14                    //这样就不能在使用子类特有的方法了.
15     }
16 }    

 

posted on 2020-11-13 16:10  白客C  阅读(201)  评论(0编辑  收藏  举报