什么是对特定类型的任意对象的实例方法的引用?

What is exactly a reference to an Instance Method of an Arbitrary Object of a Particular Type?

特定类型的任意对象到底是什么?我没看懂部分代码(String::compareToIgnoreCase),我们是如何引用的?

String[] stringArray = { "Barbara", "James", "Mary","John","Patricia", "Robert"}; 

Arrays.sort(stringArray, String::compareToIgnoreCase);

按类型名称,您指的是 Class 而不是 Object。这是 Java(以及一般的面向对象编程)的根本区别。

对象从 classes 实例化。 Class-specific 定义适用于 class 方法和静态数据,这些方法和静态数据通常始终可用于 class,并且不引用任何一个特定实例。 Class 数据和方法可以随时从您应用程序的任何位置调用,方法是在方法或数据项前面加上 class 名称本身。 Class-specific 方法和数据很容易通过源代码中它们前面的 static 关键字识别,这意味着它们永远不会改变。它们在每个实例中都永远相同。

如果您尝试在没有 class 名称前缀的情况下调用特定于 class 的方法或访问特定于 class 的数据,将会出现编译时错误。

而对象是 class 个实例。使用 new 关键字实例化 class 时会创建对象。这为您提供了对新对象实例的引用。有了那个引用,不管你赋值与否,你都可以引用所有非静态(非class级别)的数据和方法。

public class Foo {
     public  static int myStaticVarPublic  = 1;
     private static int myStaticVarPrivate = 2;

     public  int myInstanceVarPublic;
     private int myInstanceVarPrivate;

     public Foo() {
         myInstanceVarPublic  = 3;
         myInstanceVarPrivate = 4;
     }

     int getMyInstanceVarPrivate() {
        return myInstanceVarPrivate;
     }

     static int getMyStaticVarPrivate() {
        return myStaticVarPrivate;
     } 

     public static void main(String args[]) {

           System.out.println("class-specific value Foo.myStaticVarPrivate = " + 
               Foo.getMyStaticVarPrivate());

           System.out.println("class-specific value Foo.myStaticVarPublic  = " + 
               Foo.myStaticVarPublic);

           System.out.println("object-specific value myInstanceVarPrivate = " + 
               new Foo().getMyInstanceVarPrivate());

           System.out.println("object-specific value myInstanceVarPublic  = " + 
               new Foo().myInstanceVarPublic);

     }
}

Method references are a feature introduced with Java 8. They are related to lambda expressions。在 Java 8 之前,lamdas 不能作为一种语言特性使用,如果你想将一个 method/function 传递给另一个方法,你必须通过传递一个命名的 class 实例或一个匿名 class 个实例。

语义上,这三个语句是等价的:

Arrays.sort(stringArray, String::compareToIgnoreCase);
Arrays.sort(stringArray, (s1, s2) -> s1.compareToIgnoreCase(s2));
Arrays.sort(stringArray, new Comparator<String>() {
    @Override
    public int compare(final String s1, final String s2) {
        return s1.compareToIgnoreCase(s2);
    }
});