Java 内部类和匿名内部类

1.内部类:

 1 /*
 2 局部内部类: 在一个类 的方法内部定义另外一个类,那么另外一个类就称作为局部内部类。
 3 
 4 局部内部类要注意的细节:
 5     1. 如果局部 内部类访问了一个局部变量,那么该局部变量必须使用final修饰、
 6 
 7 
 8 */
 9 class  Outer{
10 
11     String name= "外部类的name";
12 
13     public void test(){
14         //局部变量
15         final    int y =100;  // y 什么时候从内存中消失? 方法执行完毕之后y消失。
16 
17         //局部内部类
18         class Inner{     /*
19                             当test方法执行完毕之后,那么y马上从内存中消失,而Inner对象在方法
20                             执行完毕的时候还没有从内存中消失,而inner对象的print方法还在访问着
21                             y变量,这时候的y变量已经消失了,那么就给人感觉y的生命变量已经被延长了
22                             .
23 
24                             解决方案: 如果一个局部内部类访问一个局部变量的时候,那么就让该局部内部类
25                             访问这个局部 变量 的复制品。                
26                         */
27             int x = 10;
28 
29             public void print(){
30                 System.out.println("这个是局部内部类的print方法.."+y);
31             }    
32         }
33         
34         Inner inner = new Inner();  //这个inner对象什么时候消失?  Inner对象的生命周期比局部变量y的生命周期要长。
35         inner.print();
36     }
37 
38 
39 }
40 
41 
42 class Demo5 
43 {
44     public static void main(String[] args) 
45     {
46         Outer outer = new Outer();
47         outer.test();
48     }
49 }

注意特点:如果没有statice,那就要对内部类进行实例化,让其成为对象。如果有statice,那么就只用实例化外部类就可以了。内部类与外部类的方法是平级的。

2.匿名内部类:

  1.继承下的的匿名内部类

 1 /*
 2 
 3 匿名内部类:没有类名的类就称作为匿名内部类。
 4 
 5 匿名内部类的好处:简化书写。
 6 
 7 匿名内部类的使用前提:必须存在继承或者实现关系才能使用。
 8 
 9 
10 匿名内部类一般是用于实参。
11 
12 */
13 
14 abstract class Animal{
15     
16     public abstract Animal run();
17 
18     public abstract void sleep();
19 }
20 
21 class Outer{
22 
23     public void print(){
24         //需求: 在方法内部定义一个类继承Animal类,然后调用run方法与sleep()。
25         
26         /*
27         //局部内部类
28         class Dog extends Animal{
29             
30             public void run(){
31                 System.out.println("狗在跑..");
32             }
33 
34             public void sleep(){
35                 System.out.println("狗趴在睁开眼睛睡..");
36             }
37         }
38         
39         //创建对象
40         Dog d = new Dog();
41         d.run();    
42         d.sleep();
43         */    
44         //匿名内部类 :匿名内部类只是没有类名,其他的一概成员都是具备的。
45         // 匿名内部类与Animal是继承 的关系。  目前是创建Animal子类的对象. 
46     Animal    a = new Animal(){  //多态
47         
48             //匿名内部的成员 
49             public Animal run(){
50                 System.out.println("狗在跑..");
51                 return this;
52             }
53             
54             public void sleep(){
55                 System.out.println("狗趴在睁开眼睛睡..");
56             }
57 
58             //特有的方法
59             public void bite(){
60                 System.out.println("狗在咬人..");
61             }
62     
63         };
64     
65         a.bite();
66         a.run();
67         a.sleep();
68         
69     }
70 }
71 
72 class Demo6 
73 {
74     public static void main(String[] args) 
75     {
76         //System.out.println("Hello World!");
77         
78         Outer outer = new Outer();
79         outer.print();
80     
81     }
82 }

  2.接口实现下的匿名内部类

 1 //实现关系下匿名内部类
 2 interface Dao{
 3 
 4     public void add();
 5 }
 6 class Outer{
 7 
 8     public void print(){
 9         //创建一个匿名内部类的对象
10         new Dao(){   //不是接口不能创建对象吗?怎么现在又可以了?
11              
12              public void add(){
13                 System.out.println("添加成功");
14              }
15         }.add();
16     }
17 }
18 
19 class Demo7 
20 {
21     public static void main(String[] args) 
22     {
23         test(new Dao(){
24             
25             public void add(){
26                 System.out.println("添加员工成功");
27             }
28         });
29 
30 
31     }
32     //调用这个方法...
33     public static void  test(Dao d){  //形参类型是一个接口引用..
34         d.add();
35     }
36 }
原文地址:https://www.cnblogs.com/bequt/p/5040515.html