If you execute the two you will not notice any difference.
If you explore the directory your .class files are in, there will be a $1 file for the Runnable class in one case but not in the other. You could consider exploring the bytecode for that method and see what difference that makes to the bytecode.
No, like how System.out::println doesn't mean the no-args println() method. Which method is called depends on what arguments the functional interface expects. invokeLater expects a Runnable, which is () -> void. If the return type is void, you may use a method reference with any return type, as long as the parameters match.
If you have a method that takes an Elastic -> BouncingBalls, you can pass it BouncingBalls::new, if BouncingBalls has a constructor that accepts Elastic.
Let's look at a concrete example:
Say we have a Stream<Integer> and we want to use the reduce method to create a single string with all the integers concatenated. You could pass method references to it like so:
From a presentation I gave at work yesterday*:
(Don't mind the duplicate declaration of f).
* We've only started using Java 8 recently after the first JBoss 6.4.x project was started, and Java 8 was finally officially supported. Personally I've been using it for over a year already, so I was the likely candidate for showing everybody the ropes.