이러한 예에서 볼 수 있듯이 :: 연산자는 객체 또는 클래스와 메서드 이름을 구분하며, 다음 세 가지 주요 경우가 있다.
• object::instanceMethod
• Class::staticMethod
• Class::instanceMethod
처음 두 경우에서 메서드 레퍼런스는 메서드의 파라미터를 제공하는 람다 표현식에 해당한다. 앞서 언급한 것처럼 System.out::println은 x -> System.out.println(x)에 해당한다. 마찬가지로 Math::pow는 (x, y) -> Math.pow(x, y)에 해당한다.
세 번째 경우에서는 첫 번째 파라미터가 해당 메서드의 대상이 된다. 예를 들어, String::compareToIgnoreCase는 (x, y) -> x.compareToIgnoreCase(y)와 같다.
<Note>
이름이 같은 여러 메서드가 오버로드되어 있을 때는 컴파일러가 의도한 문맥을 찾으려고 할 것이다. 예를 들어, Math.max 메서드는 정수와 부동소수점 수를 받는 버전이 있다. 이 중 어느 버전이 선택되는지는 Math::max가 변환되는 대상 함수형 인터페이스의 메서드 파라미터에 의존한다. 람다 표현식과 마찬가지로, 메서드 레퍼런스는 독립적으로 존재하지 않고 항상 함수형 인터페이스의 인스턴스로 변환된다.