final运用于内部类访问局部变量

    public void mRun( final String name){

        new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);

                    } catch (InterruptedException e) {

                    // TODO Auto-generated catch block
                     e.printStackTrace();
                    }
                 System.out.println(name);
            }
        }.run();
    }

当内部类访问局部变量的时候,需要在局部变量前加final修饰符,不然编译器就会报错。通常我们也是这么干的。那问题来了,为什么要加final修饰符?相信大多数小伙伴都没有思考过这个问题,但凡使用的时候,直接加上就得了,从来没去深究过其中的原理。这对于一个优秀的程序员来说是不可取,我们不仅要知其然还要知其所以然。现在我们来分析一下,为什么要加final关键字。首先内部类的生命周期是成员级别的,而局部变量的生命周期实在方法体之类。也就是说会出现这样一种情况,当mRun方法执行,new 的线程运行,新线程里面会睡一秒。主线程会继续执行,mRun执行完毕,name属性生命周期结束。1秒之后,Syetem.out.printh(name)执行。然而此时name已经寿终正寝,不在内存中了。Java就是为了杜绝这种错误,严格要求内部类中方位局部变量,必须使用final关键字修饰。局部变量被final修饰之后,此时会在内存中保有一份局部变得的复制品,当内部类访问的时候其实访问的是这个复制品。这就好像是把局部变量的生命周期变长了。说到底还是Java工程师提前把这个坑给我们填了,不然不知道又会有多少小伙伴会为了内部类局部变量而发愁了。

时间: 2024-08-09 05:13:42

final运用于内部类访问局部变量的相关文章

内部类访问局部变量的时候,为什么变量必须加上final修饰

这里的局部变量就是在类方法中的变量,能访问方法中变量的类当然也是局部内部类了.我们都知道,局部变量在所处的函数执行完之后就释放了,但是内部类对象如果还有引用指向的话它是还存在的.例如下面的代码: class Outer{ public static void main(String[] args){ Outer out = new Outer(); Object obj = out.method(); } Object method(){ int locvar = 1; class Inner{

为什么java内部类访问局部变量必须声明为final?

https://blog.csdn.net/z55887/article/details/49229491 先抛出让我疑惑了很久的一个问题 编程时,在线程中使用局部变量时候经常编译器会提示:局部变量必须声明为final package test; public class ThreadTest { public void function(String a) { new Thread(){ @Override public void run() { System.out.println(a);

局部内部类访问局部变量的问题

局部内部类访问局部变量的注意事项: 局部变量必须用final修饰! 为什么?   因为局部变量是随着方法的调用而调用,随着调用完毕而消失 但是我们调用内部类时创建的对象依旧在堆内存中,并没有被回收,如果访问的局部变量不是用final修饰的,就是当方法调用完毕后,依旧存在于堆内存中的对象找不到局部变量的问题 而此时被final修饰的变量可以看成是一个常量,存在于常量池中,不会被立刻回收. 原文地址:https://www.cnblogs.com/afei1013/p/12349608.html

内部类访问外部类的变量必须是final吗,java静态方法中不能引用非静态变量,静态方法中不能创建内部类的实例

内部类访问外部类的变量必须是final吗? 如下:class A{int i = 3;public void shout(){ class B{public void shout1(){System.out.println(i);} }B b=new B();b.shout1();} public static void main(String [] args){A a=new A();a.shout();} }可正常输出3,证明可以访问类的变量i,但改为下面的方式:class A{public

JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类

JAVA之旅(九)--Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 天天被一些琐事骚扰,学习还得继续 一.Object类 Object是什么呢?我们可以翻阅JAVA API文档看他的介绍 上面介绍说,object是类层次结构的根类,也就是超类 Object:是所有对象的直接后者间继承关系,传说中的老祖宗,你父亲还有父亲,你父亲的父亲还有父亲是爷爷,这是继承关系,但是你的祖宗却只有一位,该类中定义的肯定是所有对象都具备的功能

JavaSE8基础 final 修饰值类型的局部变量 其值不可更改

os :windows7 x64    jdk:jdk-8u131-windows-x64    ide:Eclipse Oxygen Release (4.7.0)        代码: /* * final 修饰值类型的局部变量. */ class Demo { public void test() { final int num = 1; num = 2;//会报错! } public static void main(String[] agrs) { } } 结果: Java优秀,值得学

“全栈2019”Java第九十八章:局部内部类访问作用域成员详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第九十八章:局部内部类访问作用域成员详解 下一章 "全栈2019"Java第九十九章:局部内部类与继承详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学

内部类访问的局部变量必须加final

(1)内部类是外部类的一个成员,就像外部类的成员方法一样,所以内部类有权限访问外部类的所有成员,包括private的. (2)内部类不能访问外部类方法中的局部变量,除非变量是final的(一般发生在方法中定义的内部类).这是因为局部变量的生命周期原因. class Outer{ private int a; public class Inner{ private int a; public void method(int a){ a++;    //局部变量 this.a++;    //Inn

static、final、包、访问修饰符、内部类

代码块的加载顺序 静态代码块>成员代码块>构造方法(1,加载类2,创建对象3,调用方法)static静态修饰符 可以修饰成员变量 成员方法 static特点 被static修饰的成员 属于类 不单属于某个对象 是所有对象所共享 静态的访问特点 类名直接访问 类名.属性名 类名.方法名(参数) static的注意事项 静态的内容随着类的加载而加载 优先于对象存在 静态的内容只能访问静态的内容 不能使用this/super final最终修饰符 类 :被final修饰的类不能被继承 成员方法: 被