2 静态内部类
Java中的静态内部类在构造的时候并不需要外部类的引用,因此静态的内部类不会持有外部类的引用,并且静态内部类只能访问外部类的静态成员变量和方法。一个简单的例子为(上面的代码做一些简单的改动):
public class Main {
2
3 /**
4 * @param args
5 */
6 public int k=3;
7 private static String string="Java";
8 protected float j=1.5f;
9 public static void show(){
10 System.out.println("show");
11 }
12 private void add(){
13 System.out.println("add");
14 }
15 public static void main(String[] args) {
16 // TODO Auto-generated method stub
17 Main m=new Main();
18 //Child c=m.new Childe();//非法
19 Child c=new Child();
20 c.test();
21
22 }
23 static class Child{
24 public int i;
25
26 public void test(){
27 // System.out.println("k=:"+k);//不能访问外部类非静态变量
28 System.out.println("string:"+string);
29 //add(); //不能访问外部类的非静态方法
30 // System.out.println("j=:"+j);
31 show();
32 }
33
34 }
35
36 }
从上面的代码可以看到,静态内部类的创建方式与普通的Java类的创建方式一样,执行第21行代码就可以得到如下结果:
1 string:Java
2 show
3 杂谈
Java的非静态内部类的这种创建方式,会隐式地持有外部类的引用,而且默认情况下这个引用是强引用,因此,如果内部类的生命周期长于外部类的生命周期,程序很容易就产生内存泄漏(你认为垃圾回收器会回收掉外部类的实例,但由于内部类持有外部类的引用,导致垃圾回收器不能正常工作)。为了避免这种情况的发生,你可以在内部类的内部显示持有一个外部类的软引用(或弱引用),并通过构造方法的方式传递进来,在内部类的使用过程中,先判断一下外部类是否被回收; |