0%

java | 匿名内部类与外部变量

匿名内部类是不能用外部变量的。

这是因为匿名内部类和外部变量并不在同一个工作空间。基本类型数据保存在栈里面,就得用地址不可变的引用类型。

Integer 也不行,因为值变了,意味着对象也变了。

原子类是引用类型,放在内部类当中将引用赋值到内部类对象所在的对中,而基本类型复制会有数据不一致问题。

问题现象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.redisc;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

@Slf4j(topic = "c.Test")
public class Run {

public static void main(String[] args) throws IOException {
int i = 0;
new Thread(() -> {
i++;
});
}

}

i++ 会报错,因为在内部类中使用 i ,相当于默认 ifinal

修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.redisc;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;

@Slf4j(topic = "c.Test")
public class Run {

public static void main(String[] args) throws IOException {
AtomicInteger i = new AtomicInteger();
new Thread(() -> {
i.getAndIncrement();
});
}

}
请我喝杯咖啡吧~