Java lambda 方法和新对象

2022-09-01 21:35:48

我有以下代码:

public class RefDemo {

    static class Demo implements Runnable {

        public Demo() {
            System.out.println(this.toString() + "-----");
        }

        @Override
        public void run() {
            System.out.println("run");
        }
    }

    public static void main(String[] args) {
        Runnable runnable = Demo::new; // lambda ref constructor method
        runnable.run(); // does not do anything
        System.out.println(runnable);
        Runnable demo = new Demo(); // using new to create a Demo instance
        demo.run();
        System.out.println(demo);
    }
}

哪些打印:

RefDemo$Demo@7291c18f----- // lambda run constructor method print
RefDemo$$Lambda$1/793589513@34a245ab // main method print
RefDemo$Demo@7cc355be-----
run
RefDemo$Demo@7cc355be

我不知道为什么调用时代码不打印runrunnable.run();

为什么会这样?


答案 1

此代码

Runnable runnable = Demo::new;

等效于此代码

Runnable runnable = new Runnable() {
    @Override 
    public void run() {
        new Demo();
    }
};

因此,您指的不是方法,而是构造函数。runDemo


答案 2

你只是在太多的地方使用,让自己感到困惑。下面的代码使所发生的情况更加清晰:Runnable

public class RefDemo {

    static class Demo {

        public Demo() {
            System.out.println(this.toString() + "-----");
        }

        public void something() {
            System.out.println("something");
        }
    }

    public static void main(String[] args) {
        Runnable runnable = Demo::new; 
        runnable.run();

        System.out.println(runnable);

        Demo demo = new Demo();
        demo.something();

        System.out.println(demo);
    }
}

Runnable runnable = Demo::new;意味着您现在有一个对 构造函数的引用(在删除与接口的一致性后仍然有效)。您将该引用存储在一个类型的变量中,该变量之所以有效,是因为它们的功能接口是兼容的。调用该引用然后只调用构造函数,而不是 的 / 方法。DemoRunnableRunnablerunrunsomethingDemo


推荐