JDK8之前,匿名内部类访问局部变量,局部变量为什么必须要用 final 修饰。
我们先来看一段代码:
public class Hello {
public static void main(String[] args) {
String str = "haha";
new Thread() {
@Override
public void run() {
System.out.println(str);
}
}.start();
}
原因是:因为局部变量和匿名内部类的生命周期不同,匿名内部类创建之后是存储在堆中的,而局部变量(在方法中)是存储在栈中的,当方法执行完毕,就进行退栈,局部变量就会消失,此时匿名内部类有可能还在堆中存储着,那么此时匿名内部类要去哪里找这个变量呢?
为了解决这个问题,编译器在匿名内部类创建了该局部变量的副本,方法结束,副本还在。但是如果该变量不断的变化,那么副本也要不断的跟着变,为了保持数据的一致性,编译器规定该局部变量必须是常量。
为何成员变量需要 jvm 在对象初始话过程中赋默认值?
Source 和 Class、Runtime 注解的区别,注解如何使用?
泛型擦除,为何会有擦除?擦除的时机。通配符。
①泛型擦除的原因和效果,擦除的时机。
②为何会有协变和逆变
③通配符。
④PECS
既然泛型有编译期类型擦除,那么运行时无法获取到具体类型;而反射能在运行时获取到Class的类型;它们一个获取不到,一个可以获取到,这不就是矛盾么?请解释下细节。
Java / Kotlin 协变,逆变?
泛型和泛型擦除。kotlin真泛型的实现;泛型中T和?的区别,List<?>和List有什么区别;泛型里的super和extends区别;泛型为何会有擦除;擦除的时机;泛型的编译器类型检查。
下面这些代码会有什么问题?如何解决?
Java中进程间共享的数据是放在JVM那个分区的?Java中主进程和子进程间的通信,通过哪块内存区域?
public static class Person implements Serializable {
private One one;
private Two two;
}
public static class One implements Serializable {
}
public static class Two {
}
private final ArrayMap<String, Boolean> mBlackFirstFrame = new ArrayMap<>();
public boolean getFlag(String key) {
return mBlackFirstFrame.get(key);
}
List<? extends Object> list = new ArrayList<>();
list.add(123);
Object obj = list.get(0);
网友评论