加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 内存如何分配给lambda |它是如何通过非超类引用变量引用

发布时间:2020-12-15 00:37:51 所属栏目:Java 来源:网络整理
导读:我正在创建功能界面的实现,下面是我的代码 ConsumerInteger consumer=new ConsumerInteger() { @Override public void accept(Integer t) { System.out.println(t); }}; 按照javadoc A variable of a class type T can hold a null reference or a reference
我正在创建功能界面的实现,下面是我的代码
Consumer<Integer> consumer=new Consumer<Integer>() {
    @Override
    public void accept(Integer t) {
        System.out.println(t);
    }
};

按照javadoc

A variable of a class type T can hold a null reference or a reference
to an instance of class T or of any class that is a subclass of T.

这里创建了匿名对象的Object,它是Consumer的子类,可以通过引用变量consumer引用,这很精细.

但我看到Consumer是FunctionalInterface,所以我也可以在java8中做这样的事情 –

使用Lambda

Consumer<Integer> consumer=t->System.out.println(t);

或使用方法参考

Consumer<Integer> consumer=System.out::println;

我知道在上述两种情况下都没有创建子类或匿名类.所以这导致我两次混淆 –

1:如果这里的消费者不是指子类或消费者的匿名类,那么这不违反上面提到的概念变量只能引用child / self或null吗?

2:内存如何分配给lamdas以及JVM在运行时如何处理?

解决方法

首先,Jean-Baptiste向您展示了为什么作业首先起作用.

现在,我认为您缺少的部分是在Consumer< Integer>的情况下生成的Consumer类.消费者= t – >的System.out.println(T);仅在运行时由于invokedynamic而可见.

使用标志运行您的类:

java -Djdk.internal.lambda.dumpProxyClasses=/Your/Path

并且您会注意到有一个生成的类(在类的包名称中的文件夹路径中)包含.class文件,类似于此SOQuestion $$Lambda $1.class.

如果你反编译,你会发现它实际上是一个实现Consumer的类:

final class org.eugene.so.SOQuestion$$Lambda$1 
            implements java.util.function.Consumer {
     public void accept(java.lang.Object);
}

如果你看一下定义lambda的生成字节代码,你会看到lambda表达式实际上是对静态方法去糖(对于非捕获lambda,如果它是一个捕获lambda,它也可以是非静态的) ).它的代码:

private static void lambda$main$0(java.lang.Integer);
Code:
   0: getstatic     #3  // Field java/lang/System.out:Ljava/io/PrintStream;
   3: aload_0
   4: invokevirtual #4  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
   7: return

至于VM如何为它管理内存,对于非捕获lambda,你将得到一个单例,对于capture-lambda,你将获得每个调用的新实例.绝对必读为here

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读