Java

作者: Drew_MyINTYRE | 来源:发表于2021-06-23 20:22 被阅读0次

    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);
    

    相关文章

      网友评论

          本文标题:Java

          本文链接:https://www.haomeiwen.com/subject/ryfiyltx.html