关于内部类引用外部变量的理解

观察下面代码

  1,如果把第五行的注释打开则编译不通过,因为方法内的变量需要是final变量或者事实上的final变量(effectively final)才可以传入匿名内部类被使用

  2,把第五行注释加上之后,用java8可以编译通过,此时变量d是事实上的final变量,jvm可以放心地把该变量复制到内部类中

  3,为什么需要把d复制一份到内部类?因为test1方法的生命周期比内部类要短,导致test1执行完之后栈内的变量随着方法栈销毁而销毁,此时内部类还存在

  4,第二和第三个方法,内部类也引用了外部的变量,但是c和w都分配在堆区,生命周期不受限制,所以不必要复制到内部类里边

 1 public class InnerClassTest {
 2
 3     void test1() {
 4         int d = 2;
 5         //d = 3;
 6         new Runnable() {
 7             @Override
 8             public void run() {
 9                 System.out.println(d);
10             }
11         };
12     }
13
14     int c = 1;
15     void test2() {
16         c = 2;
17         new Runnable() {
18             @Override
19             public void run() {
20                 System.out.println(c);
21             }
22         };
23     }
24
25     void test3() {
26         W w = new W();
27         Thread thread = new Thread(new Runnable() {
28             @Override
29             public void run() {
30                 w.i = 4;
31                 System.out.println(w.i);
32             }
33         });
34         thread.run();
35         System.out.println(w.i);
36     }
37 }
38 class W {
39     int i = 2;
40 }

原文地址:https://www.cnblogs.com/liangwenhan/p/11318659.html

时间: 2024-10-01 03:43:21

关于内部类引用外部变量的理解的相关文章

shell if判断(曾经被一个字符串相等的判断纠结半小时,最后只是if后少了个空格!) 和 awk引用外部变量判断

一.if判断 数字: $A=12 $B=15 if(("$A"<"$B")) if(("$A"=="$B")) 字符串: $A="HELLO" $B="WORLD" if [ "$A" = "FACT_LOGIN_USER" ] if [ "$A" = "$B" ] PS:字符串比较的时候注意 'if'

awk引用外部变量及调用系统命令方法

目标:想用awk与scp命令批量传送文件 前提:先搭好主机间的免密登陆环境(参考:http://www.cnblogs.com/tankaixiong/p/4172942.html) 实现脚本方法: 1.在一个文件中记录好各个主机的端口与ip地址,第一列为主机描述信息,参考信息 [[email protected] share]# cat scp_port_ip.txt host1 33330 192.168.10.11 host2 33331 192.168.20.22 host3 33332

awk引用外部变量问题

在awk中引用外部变量会无法生效,但使用双引号时候,内置变量会不识别:解决方法是使用三引号: localhost ~]$ more awkfile this is onethis is twothis is threethis is fourthis is fivethis is sixthis is seven $ awk '{print $3}' awkfile                             $ awk "{print $3}" awkfile   one

Python:字符串中引用外部变量的3种方法

方法一: 1 username=input('username:') 2 age=input('age:') 3 job=input('job:') 4 salary=input('salary') 5 6 info1=''' 7 -----------------------info of %s---------------------------- 8 Name:%s 9 Age:%s 10 Job:%s 11 Salary:%s 12 ''' %(username,username,age

一个注意事项:内部类引用的外部变量必须是final的

之前写过一个项目,好久没更新了,最近翻起以前的代码,发现在这里报了一个错.(现在转到Intellij了,从前在Eclipse luna中是可以编译通过的,Eclipse mars也会报错,JDK版本都是1.8,还没去查为什么) 为什么在内部类中引用外部变量时,必须声明为final呢? 最开始我想的是,会和Java的内存模型有关.因为我们都知道,带有static的变量或者方法是属于类的,也就是说,类成员是被储存在堆内存里面的.那么final是否也是这样?经过查找资料,得知:final 是保护 所修

Java内部类引用外部类中的局部变量为何必须是final问题解析

今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该 是生命周期的原因,因为方法内定义的变量是局部变量,离开该方法,变量就失去了作用,也就会自动被消除,而内部类却不会离开它所在方法就失去作用,它有更 广的生命周期,下面通过一个实例加以说明: 如例中所示,在外部类Outer中声明了一个内部类TimerPrint,这个类中的方法引用了方法start中的一个局部变量testTxt 逻辑上:因为该内部类出现在一个方

awk调用外部变量

一.用awk 有以下几种方法去调用变量:1.  awk '{print a, b}' a=111 b=222 yourfile注意, 变量位置要在 file 名之前, 否则就不能调用.还有, 于 BEGIN{}中是不能调用这些的variable. 要用之后所讲的第二种方法才可解决.2.  awk –v a=111 –v b=222 '{print a,b}' yourfile注意, 对每一个变量加一个 –v 作传递.3.  awk '{print " ' "$LOGNAME"

深入浅出理解局部、全局、静态、动态、外部变量

1.全部变量.局部变量 局部变量:定义在函数内部的变量,作用域为函数内部         eg: void fun(){ int x;} 全部变量:只能定义一次,多次引用.作用域为整个文件. 若同一个源文件,全局变量和局部变量重名是,在局部变量的作用域,全部变量不起作用. 关键词: 全部变量:函数外定义+全局可见+存放在内存的全局数据区+未初始化的的时候为0 局部变量:函数内定义+函数内可见+存放在栈区,函数退出变量消失+不显式初始化内容不可预知 2.静态存储变量.动态存储变量 静态存储变量:程

深入研究Block捕获外部变量和__block实现原理

Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”.从那开始,Block就出现在iOS和Mac系统各个API中,并被大家广泛使用.一句话来形容Blocks,带有自动变量(局部变量)的匿名函数. Block在OC中的实现如下: struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Bl