首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

静态内部类与非静态内部类的区别(2)

静态内部类与非静态内部类的区别(2)

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的非静态内部类的这种创建方式,会隐式地持有外部类的引用,而且默认情况下这个引用是强引用,因此,如果内部类的生命周期长于外部类的生命周期,程序很容易就产生内存泄漏(你认为垃圾回收器会回收掉外部类的实例,但由于内部类持有外部类的引用,导致垃圾回收器不能正常工作)。为了避免这种情况的发生,你可以在内部类的内部显示持有一个外部类的软引用(或弱引用),并通过构造方法的方式传递进来,在内部类的使用过程中,先判断一下外部类是否被回收;
返回列表