Какая разница между этим::myMethod и ClassName::myMethod?

Я не понимаю разницу между

this::myMethod  

а также

ClassName::myMethod

когда это экземпляр класса ClassName.

Я думал, что в обоих случаях я вызываю метод myMethod и дать myObject что я бегу в качестве аргумента myMethod метод, но я думаю, что есть разница. Что это?

1 ответ

Решение

this::myMethod относится к myMethod на конкретном случае ClassName - экземпляр, который вы положили this::myMethod в своем коде.

ClassName::myMethod может ссылаться на статический метод или метод экземпляра. Если он ссылается на метод экземпляра, он может быть выполнен на другом экземпляре ClassName каждый раз это называется.

Например:

List<ClassName> list = ...
list.stream().map(ClassName::myMethod)...

выполнит myMethod каждый раз для другого ClassName член списка.

Вот подробный пример режима, который показывает разницу между этими двумя типами ссылок на методы:

public class Test ()
{
    String myMethod () {
        return hashCode() + " ";
    }
    String myMethod (Test other) {
        return hashCode() + " ";
    }
    public void test () {
        List<Test> list = new ArrayList<>();
        list.add (new Test());
        list.add (new Test());
        System.out.println (this.hashCode ());
        // this will execute myMethod () on each member of the Stream
        list.stream ().map (Test::myMethod).forEach (System.out::print);
        System.out.println (" ");
        // this will execute myMethod (Test other) on the same instance (this) of the class
        // note that I had to overload myMethod, since `map` must apply myMethod
        // to each element of the Stream, and since this::myMethod means it
        // will always be executed on the same instance of Test, we must pass
        // the element of the Stream as an argument
        list.stream ().map (this::myMethod).forEach (System.out::print);
    }
    public static void main (java.lang.String[] args) { 
        new Test ().test ();
    }
}

Выход:

2003749087 // the hash code of the Test instance on which we called test()
1747585824 1023892928  // the hash codes of the members of the List
2003749087 2003749087 // the hash code of the Test instance on which we called test()
Другие вопросы по тегам