`
leonzhx
  • 浏览: 799793 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

为什么局部内部类只能访问final变量

    博客分类:
  • Java
 
阅读更多

一、匿名内部类为什么只能用final.
   是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为 final。因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一 个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或参数的作用域只在这个方法内部有效。因为编译的时候内部类和方法在同一级别上,所 以方法中的变量或参数只有为final,内部类才可以引用。

二、简单的来说是作用域的问题。就好像方法外面做的事情并不能改变方法内才定义的变量,因为你并不知道方法里面这个时候已经存在了这个局部变量了没有。在这个内部类中方法里面的本地变量是失效的,也就是不在作用域内,所以是不能够访问的

但是为什么这里用final却又可以访问呢?
因为Java采用了一种copy   local   variable的方式来实现,也就是说把定义为final的局部变量拷贝过来用,而引用的也可以拿过来用,只是不能重新赋值。从而造成了可以 access   local   variable的假象,而这个时候由于不能重新赋值,所以一般不会造成不可预料的事情发生

分享到:
评论

相关推荐

    局部内部类和匿名内部类使用局部变量为什么要final1

    总结来说,局部内部类和匿名内部类只能访问final或等效final的局部变量,这是为了保证代码的可读性和内存管理的正确性。通过使用final关键字,我们可以确保内部类所使用的变量在创建后不会被意外地修改,从而避免了...

    Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释.doc

    - 当局部内部类需要访问所在方法的局部变量时,JVM会自动为这些局部变量创建副本,并存储在局部内部类的隐式成员变量中。 - 这一行为仅适用于final修饰的局部变量。 #### 示例分析 考虑以下代码示例: ```java ...

    局部变量用final的讨论

    这是因为内部类可以访问外部类的final或effectively final变量,而这些变量被视为常量。 3. **代码优化**:JVM可能会对`final`局部变量进行优化,如逃逸分析,将它们存储在栈上而不是堆上,提高运行效率。 4. **...

    final类,方法,变量

    同样,在Java 8及更高版本中,`final`局部变量可以作为lambda表达式的捕获变量,保证了lambda表达式只能读取而不能修改这些变量。 在工具方面,IDEs如Eclipse和IntelliJ IDEA提供了很好的支持来使用`final`关键字。...

    Java基础权限控制与final,内部类

    局部内部类是在方法内部定义的类,只能在该方法内部访问。匿名内部类是在使用时才临时定义的一个没有类名的类,通常用于实现事件监听器或其他一次性的接口。 了解了这些概念,让我们回到Java基础权限控制与final,...

    java代码笔记2010-06-01:Java内部类 静态内部类 局部内部类 明明内部类;StringBuffer reverse的使用;

    这使得局部内部类可以访问它所在范围内的所有变量,包括局部变量,但这些变量必须是final的。局部内部类主要用来实现某个特定功能,其生命周期与包含它的方法或块相同。 4. **明明内部类**: "明明内部类"可能是指...

    JAVA内部类总结

    1. **访问权限**:局部内部类可以访问方法内的局部变量,但这些变量必须声明为final。 2. **实例化**:局部内部类只能在其定义的方法或构造函数内部实例化。 3. **示例**: ```java public void method() { final...

    Java成员变量类变量局部变量的区别共5页.pdf.zip

    局部变量只能在声明它的代码块内访问。 4. 初始化:成员变量有默认初始值,类变量在类加载时初始化,局部变量必须在声明时或使用前初始化。 5. 是否共享:成员变量和类变量可能被多个对象共享,而局部变量仅在声明它...

    内部类分类及应用

    方法内部类对象不能使用该内部类所在方法的非final局部变量。 四、匿名内部类 匿名内部类是指不具有名称的内部类。匿名内部类适合使用场景包括:只用到类的一个实例、类在定义后马上用到、类非常小、给类命名并...

    java 内部类使用(内部匿名类)

    内部类分为几种类型,包括成员内部类、局部内部类、匿名内部类以及方法参数内部类。 1. **成员内部类**:成员内部类就像是外部类的一个普通成员,可以是静态或非静态的。非静态内部类拥有对外部类的引用,可以直接...

    java内部类详解

    由于其局部性,局部内部类可以访问方法内的所有局部变量和参数,但这些变量必须是 final 或 effectively final。局部内部类不能声明为 static,也不能被外部类访问,除非通过方法返回。 4. 匿名内部类(Anonymous ...

    day11【final、权限、内部类】.pdf

    - **作为方法参数**:通过引用类型作为参数传递给方法,可以让方法内部访问或修改传递对象的状态。 - **作为方法返回值**:方法可以返回一个引用类型,允许调用者获得一个对象的引用,并可以进一步访问和操作该对象...

    Java内部类总结

    - **局部内部类**:是在一个方法或构造器内部定义的类,可以访问该方法或构造器内的局部变量,但这些局部变量必须声明为`final`。 - **匿名内部类**:没有名字的内部类,通常用于实现接口或继承类时简化代码,主要...

    内部类 匿名内部类 内部接口 对比说明

    它可以访问外部类的所有成员以及所在方法的final变量。局部内部类主要用于方法内部的特定逻辑,对外不可见。 3. **静态内部类(嵌套类)**:在类的任何方法之外,用static关键字定义。静态内部类可以直接访问外部类...

    Java内部类访问规则.doc

    - 如果局部内部类要访问其所在方法的局部变量,该变量必须声明为`final`,否则无法访问。 5. **匿名内部类**: - 匿名内部类是没有名称的内部类,常用于简洁地实现单个接口或继承单个类的情况。 - 匿名内部类...

    java语言--内部类总结

    局部内部类可以访问方法的局部变量,但这些变量必须声明为final。 - 静态内部类:与普通成员内部类不同,静态内部类可以像普通类一样通过类名直接创建实例,无需外部类的实例。但它不能直接访问外部类的非静态成员...

    内部类的分类及各自用法

    局部内部类可以访问方法或构造器中的所有局部变量,但这些变量必须声明为`final`(最终的)。局部内部类的主要用途是为某个特定的方法提供定制化的类实现。 **示例代码片段**: ```java public class Outer { ...

    Java4Android 35_内部类和匿名内部类

    2. **局部内部类**: 定义在方法、构造器或块中的类被称为局部内部类。它的作用范围仅限于该方法、构造器或块。 3. **静态内部类**: 声明为static的内部类,称为静态内部类。它不持有对外部类的隐式引用,因此可以...

Global site tag (gtag.js) - Google Analytics