`
369128396
  • 浏览: 83853 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

内部类为什么必须引用final局部变量

    博客分类:
  • java
 
阅读更多
在方法中创建内部匿名类时,一般是作为callback接口的实现而创建的,可能方法已经执行完了局部变量生命周期结束了,之后如果callback触发了,就可能引起变量引用丢失等内存访问不一致。

而加上final后,编译器是这样处理内部类的。如果这个外部局部变量是常量,则在内部类代码中直接用这个常量。如果是类的实例,则编译器将产生一个内部类的构造参数,将这个final变量传到内部类里,这样即使外部局部变量无效了,还可以使用。

内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。
这样理解就很容易得出为什么要用final了,因为两者从外表看起来是同一个东西,实际上却不是这样,如果内部类改掉了这些参数的值也不可能影响到原参数,然而这样却失去了参数的一致性,因为从编程人员的角度来看他们是同一个东西,如果编程人员在程序设计的时候在内部类中改掉参数的值,但是外部调用的时候又发现值其实没有被改掉,这就让人非常的难以理解和接受,为了避免这种尴尬的问题存在,所以编译器设计人员把内部类能够使用的参数设定为必须是 final来规避这种莫名其妙错误的存在。
分享到:
评论

相关推荐

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

    这种情况下的阅读和运行结果不一致,为了避免这种混淆,Java规定局部变量必须是final的,确保一旦赋值就不能更改,从而保证内部类的成员变量(实际上是局部变量的副本)与原始变量保持一致。 4. **final关键字的...

    局部变量用final的讨论

    2. **匿名内部类与final**:在Java中,如果一个局部变量要在匿名内部类中使用,那么它必须是`final`或effectively final(实际上相当于只赋值一次)。这是因为内部类可以访问外部类的final或effectively final变量,...

    final类,方法,变量

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

    Java为什么匿名内部类参数引用需要用final进行修饰?

    Java匿名内部类参数引用需要用final进行修饰的原因分析 Java中的匿名内部类参数引用需要用final进行修饰,这是因为内部类中使用的外部变量需要延长其生命周期,以便在回调时能够找到该变量。下面是详细的分析: ...

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

    当你声明一个引用类型变量为final时,你不能将它指向另一个对象,但是你可以修改对象内部的成员变量。这意味着,引用本身不能改变,但你可以改变引用所指向对象的内容。 Java中的内部类是一种定义在另一个类内部的...

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

    - **final修饰变量**:基本数据类型的局部变量,一旦被`final`修饰后,其值就不能再被改变。引用类型的`final`变量是指不能指向另一个对象,但是其指向的对象的成员变量是可以改变的。 ### 权限修饰符 Java中通过...

    java为什么匿名内部类的参数引用时final?final局部变量的生命周期

    在知乎上看到了一篇帖子 在这个问题下面大家已经吵得不可开交了,看了很多篇文章,被误导进了很多的坑,发现只有下面两篇文章是写的最好的,解释的很清楚,我把两篇文章简单的总结了一下: ...1.问题的引出 ...

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

    这种内部类的生命周期仅限于该方法的执行,可以访问方法的局部变量和参数,但对这些局部变量的访问有一些限制,它们必须是final或者等效于final的。 4. **局部内部类**:定义在方法、块或者构造器内部的类称为局部...

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

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

    java 匿名内部类的使用规范

    如果匿名内部类需要访问局部变量,那么这个局部变量必须是final的或者实际上等效于final。这是因为匿名内部类可以异步执行,它们可能在局部变量的生命周期结束后仍然需要访问这些变量。 4. **单例模式中的应用** ...

    final修饰类

    3. **局部变量的final**:在方法或块中,`final`修饰的局部变量同样只能赋值一次,这有助于创建只读变量,确保代码的可预测性。当函数的参数声明为`final`时,表明该参数是只读的,不允许在方法内部改变其值,这在多...

    java内部类详解

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

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

    - 匿名内部类不能包含静态成员(除了final static变量)。 - 匿名内部类不能有构造器,但可以通过初始化块来传递参数。 学习“Java4Android 35_内部类和匿名内部类”这个教程,开发者将掌握如何有效地利用内部类和...

    内部类知识总结3--匿名内部类

    同时,如果匿名内部类访问了外部类的非`final`局部变量,这些变量会被隐式地转换为`final`。 7. **内部类与内存管理** 内部类的对象会持有对外部类对象的引用,因此,只要内部类对象存在,外部类对象就不会被垃圾...

    内部类详解,看了他就不用看其他资料了

    - 当局部变量在代码块内被局部内部类引用时,该变量必须是`final`的,因为局部变量在代码块结束时会被销毁,而局部内部类的对象可能会持续存在。 总的来说,内部类是Java提供的一种强大的工具,它增加了代码的灵活...

    Java内部类总结

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

    Java中final的深度剖析

    在创建匿名内部类时,如果需要访问外部类的非final局部变量,该变量必须声明为final。这是因为匿名内部类可以看作是外部类的子类,而局部变量的作用域仅限于方法,所以必须通过final保证变量的值在内部类创建后不会...

    java语言--内部类总结

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

    JAVA语法总结 - 内部类

    2. **访问限制**:与方法内部类类似,不能访问包含它的方法内的非final局部变量。 #### 七、小结 内部类为Java程序设计提供了强大的灵活性和封装能力。理解不同类型的内部类以及它们之间的差异对于编写高质量的...

Global site tag (gtag.js) - Google Analytics