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

原创 2018年04月17日 09:08:38

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的,但是依然是常量,不能改变值。


















































































































Java面向对象 局部内部类的一些特点

1.不可以被成员修饰符修饰 2.可以直接访问外部类中的成员,因为还持有外部类中的引用。 但不可以访问它所在的局部中的变量,只能访问被final修饰的局部变量 (局部内部类中访问局部变量,局部变量...
  • nicolas9974
  • nicolas9974
  • 2015-06-15 23:02:55
  • 212

JAVA局部内部类的使用

我是在JDK8环境下实现的,与之前的版本规则有一些变化,所以在这里mark一下 public class localInnerClass{ public static void main(S...
  • iversongzy
  • iversongzy
  • 2017-04-22 00:00:11
  • 374

Java内部类(二)局部内部类

局部内部类就是声明在一个块(通常是方法)中的类。举例如下: package innerclass; public class Outer1 { private String outerClassN...
  • l294265421
  • l294265421
  • 2015-06-21 19:04:13
  • 2263

java 局部内部类的使用规范

  • 2010年06月21日 15:00
  • 59KB
  • 下载

Java之局部内部类和匿名内部类的区别详解(附源码)

前言        前面提到过,可以在代码块里创建内部类,典型的方式是在一个方法体里面创建。局部内部类不能有访问说明符,因为它不是外围类的一部分;但是他可以访问当前代码块内的常量,以及此外围...
  • u013693649
  • u013693649
  • 2016-08-04 11:38:10
  • 1274

Java--内部类,局部类与匿名类

1.内部类是定义在另一个类中的类。 内部类在封装它的类中使用跟普通类一样。 在其他地方使用必须在new前面冠以外部类对象。 即:外部对象名.new 内部类(参数)2.内部类可以访问外部类的所有成...
  • a970973835
  • a970973835
  • 2015-08-06 17:48:40
  • 1040

JAVA面向对象与内存分析

从代码加载,及内存分析
  • lidaasky
  • lidaasky
  • 2014-06-06 11:47:57
  • 2043

Java 局部内部类访问局部变量必须加final关键字

局部内部类(包括匿名局部内部类和普通内部类)中使用局部变量,那么这个局部变量必须使用final修饰。这里说的事局部内部类,不是普通静态内部类和非静态内部类,因为他们不能访问方法体内的局部变量。  ...
  • hanghangde
  • hanghangde
  • 2016-02-01 21:45:15
  • 2215

《java中内部类在局部时,访问权限》

/* 内部类定义在局部时, 1,不可以被成员修饰符修饰 2,可以直接访问外部类中的成员,因为还持有外部类中的引用。 但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。 */ c...
  • w695050167
  • w695050167
  • 2012-03-26 22:59:20
  • 1664

Java 内部类与局部类

Java文件里的类为 内部类public class outer{public static String staticString; public String string; public vo...
  • sysusr
  • sysusr
  • 2011-02-28 05:11:00
  • 5250
收藏助手
不良信息举报
您举报文章:java java面向对象-局部内部类分析
举报原因:
原因补充:

(最多只允许输入30个字)