A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hezhipengzipp 中级黑马   /  2016-2-25 08:24  /  1416 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在jdk1.8之前       局部内部类访问局部变量时,局部变量需要加final修饰!

        Why?局部变量时随着方法的调用而调用,随着方法的调用完毕而消失,而我们知道new出来的对象是保存在堆内存中,并不会立即消失,所以我们需要对所访问的局部变量进行final修饰,加入final修饰后,这个变量就成了常量。
        但在用jdk1.8使用时,局部内部类访问局部变量,并不需要对局部变量加final修饰。
使用jdk1.8代码
package Pratice;
//这是jdk1.8版本的,从这个代码可以看出,局部内部类访问局部变量不需要加final修饰
//其实是底层默认加了final进行修饰
package Pratice;
public class Inner {
        public void method(){
                int a=10;
                class InnerText{
                        public void method2(){
                                System.out.println(a);
                        }
                }
        }
}
用反编译工具xlad可以看到jdk进行的优化
package Pratice;

import java.io.PrintStream;

public class Inner
{

        public Inner()
        {
        }

        public void method()
        {
                int a = 10;
        }

        // Unreferenced inner class Pratice/Inner$1InnerText
        class 1InnerText
        {

                final Inner this$0;
                private final int val$a;

                public void method2()
                {
                        System.out.println(a);
                }

                        1InnerText()
                        {
                                this$0 = Inner.this;
                                a = i;
                                super();
                        }
        }

}


3 个回复

倒序浏览
各位请留下你们的足迹,跪求黑马币
回复 使用道具 举报
顶顶顶顶顶
回复 使用道具 举报
顶顶顶顶顶,66666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马