java java面向对象-局部内部类分析

20180410 java java面向对象-局部内部类分析





/************************************/
/****    千万不要用局部内部类    ****/
/************************************/




局部内部类的定义:在方法中定义的内部类,其可见范围就是在当前方法中,局部内部类是和 当前方法中的变量  同一级别的。


eg:
class LocalInnerClassDemo
{
  public static void main(String[] args)
  {
    System.out.println("bai he");


    class Inner
    {
      String info = "INFO";
    }


    System.out.println(new Inner().info);//可以 正常输出 INFO
  }
}
 




局部内部类的特点:


特点1:不能使用public,private,protected,static。因为局部变量就是不能使用这些修饰符的。




特点2:局部内部类只能在当前方法中使用。




特点3:局部内部类和实例内部类一样,不能包含静态成员。


特点4:局部内部类和实例内部类一样,都可以访问外部类的所有成员。
eg:
class LocalInnerClassDemo
{


  static String s = "XXX";


  public static void main(String[] args)
  {




    System.out.println("bai he");


    class Inner
    {
      String info = "INFO";


      


      public void test()
      {
        System.out.println(info);


        System.out.println(s);//可以访问
      }
    }


    new Inner().test();//可以 正常输出 INFO


    
  }
}












特点5:局部内部类访问的局部变量必须使用final修饰(在java8中不适用)。




eg:
class LocalInnerClassDemo
{
  public static void main(String[] args)
  {
    int age = 16;//局部变量


    class Inner
    {
      String info = "INFO";
      public void test()
      {
        System.out.println(info);


        System.out.println(age);//局部内部类访问局部变量,会报错
      }
    }
    new Inner().test();    
  }
}




应该改写成这样:


eg:
class LocalInnerClassDemo
{
  public static void main(String[] args)
  {
    final int age = 16;//局部变量


    class Inner
    {
      String info = "INFO";
      public void test()
      {
        System.out.println(info);


        System.out.println(age);//局部内部类访问局部变量,通过
      }
    }
    new Inner().test();    
  }
}


原因:如果当前方法不是main方法,那么当前方法调用完毕之后,当前方法的栈帧会被销毁,方法内部的局部变量的空间也会全部销毁。
然而局部内部类是定义在方法中的,而且在方法中会创建局部内部类对象,而局部内部类会去访问局部变量,当 当前方法被销毁的时候,对象还在堆内存中,依然持有对局部变量的引用。但是方法被销毁的时候局部变量已经被销毁了。
  此时出现:在堆内存空间中,一个对象引用着一个不存在的数据。为了避免该问题,我们使用final修饰局部变量,从而变成常量,永驻内存空间,即使方法销毁之后,该局部变量也在内存中,对象可以继续持有。






在Java8中是自动隐式加上final的,但是依然是常量,不能改变值。


















































































































阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页