Java内部类引用外部类中的局部变量为何必须是final问题解析
今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该 是生命周期的原因,因为方法内定义的变量是局部变量,离开该方法,变量就失去了作用,也就会自动被消除,而内部类却不会离开它所在方法就失去作用,它有更 广的生命周期,下面通过一个实例加以说明:
如例中所示,在外部类Outer中声明了一个内部类TimerPrint,这个类中的方法引用了方法start中的一个局部变量testTxt
逻辑上:因为该内部类出现在一个方法的内部,但实际编译时,内部类编译为Outer$1TimerPrint.class,这说明,外部类的这个方法和内 部类是处于同一级别的。换句话说是非final变量和内部类的生命周期不一样!start被调用后,非final变量也会随之消失,就会出现内部类引用非 法!
实际做法:Java编译器的行为是这样的(前提条件是该变量在内部类中被引用):
若定义为final,则java编译器则会在内部类TimerPrint内生成一个外部变量的拷贝,而且可以既可以保证内部类可以引用外部属性,又能保证值的唯一性。
若不定义为final,则无法通过编译!(jdk1.6测试过)。因为编译器不会给非final变量进行拷贝,那么内部类引用的变量就是非法的!
下面看经过编译以后的字节码:
外部类编译后的字节码:
内部类编译后的字节码:
如果外部类中的变量d没有被内部类引用,则final为可选的,而且java编译器将不做特殊处理!!
加一个参数d 并且把它定义为非final类型,编译以后文件如下:
编译后的外部类class:
编译后的内部类class:
由上可以看出,在方法内部定义内部类时,内部类如果调用了方法内的变量,则该变量必须被final修饰,否则就会因为在调用内部类时因为找不到所用的变量而报错!
文章引自---blog.csdn.net/zzp_403184692/article/details/8014235
转载于:https://www.cnblogs.com/duanxiaojun/p/6930298.html
Java内部类引用外部类中的局部变量为何必须是final问题解析相关推荐
- java内部类与外部类
java内部类与外部类 java内部类与外部类 一.内部类的作用 二.内部类分类 一.成员内部类 1.非静态内部类 2.静态内部类 二.局部内部类 三.匿名内部类(重要) java内部类与外部类 概念 ...
- Java内部类、外部类之间访问权限
Java内部类.外部类之间访问权限 啥是内部类 内部类可以访问外部类的所有成员吗 那外部类能访问内部类的所有成员吗 匿名内部类 静态内部类呢 为啥会这样呢 得出结论 啥是内部类 顾名思义,内部类就是在 ...
- JAVA内部类、外部类
一.内部类 内部类就是将一个类A定义在类B里边,里边的那个类A称为内部类,外边的类B称为外部类 成员内部类定义格式:class 外部类{ class 内部类{ } } c ...
- Java内存泄露系列--内部类持有外部类导致内存泄露--原因/解决方案
原文网址:Java内存泄露系列--内部类持有外部类导致内存泄露--原因/解决方案_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java内部类持有外部类导致内存泄露的原因以及其解决方案. 为什么内部 ...
- 内部类与外部类之间的访问
目 录 1.内部类与外部类 2.内部类的特点:内部类可以直接访问外部类的成员(成员变量和成员方法),包括私有成员. 3.内部类与外部类之间的访问 在测试类中调用成员内部类中的方法: ...
- java内部类gc_Java内部类持有外部类的引用详细分析与解决方案
在Java中内部类的定义与使用一般为成员内部类与匿名内部类,他们的对象都会隐式持有外部类对象的引用,影响外部类对象的回收. GC只会回收没有被引用或者根集不可到达的对象(取决于GC算法),内部类在生命 ...
- java内部类为什么会持有外部类的引用_为什么内部类持有外部类的引?
对普通类(没有内部类的类)来说,内部类和外部类都与他无关:对有内部类的类来说,它们就是其内部类的外部类,外部类是个相对的说法,其实就是有内部类的类.所以,要回答这个问题,只需要讲解内部类是什么:Jav ...
- java内部类外部类_Java内部类:如何在内部类中返回外部类对象
Nasted Class 的介绍,请详见参考 今天讨论的不是不是内部类的概念,而是具体使用的一个场景-如何在内部类中返回外部对象 (孤猪:我在程序里也碰到过一次这样的状况,非静态内部类可以直接调用外部 ...
- java的内部类和外部类_java内部类 和外部类的区别
下面说一说内部类(Inner Class)和静态内部类(Static Nested Class)的区别: 定义在一个类内部的类叫内部类,包含内部类的类称为外部类.内部类可以声明public.prote ...
最新文章
- java float转换int
- 较全的jdom使用教程
- IOS 实现滚动文字
- SQL Server2012登录记录怎么删除?
- Android之WebView学习
- html滚动选择框代码,如何使用最简单纯Css代码美化checkbox复选框、radios单选框和滑动按钮...
- ZH奶酪:【阅读笔记】Deep Learning, NLP, and Representations
- linux之chsh命令
- set python_Python的set集合详解
- 第J题-=数组中等于K的数对(详解) =======给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数
- 关于嵌入式学习随笔-2《GPIO基础知识》
- java web中的监听器
- 基于Java、Jsp实现购物车的功能
- 这些月薪过万的公司你准备好了吗
- 如何更改itunes备份位置_itunes备份路径是什么,如何修改itunes备份路径
- sqlite 数据库连接问题以及解决方法
- 功放限幅保护_限幅器在音响系统中限幅阈值的计算方法
- 纯硬件无人直播手机,不需要电脑,不需要虚拟摄像头,可人工干预、可粉丝互动,半无人直播
- 计算机网络检查方式,一种计算机网络环路检测方法与流程
- Scratch滚动的天空(1)