什么是对特定类型的任意对象的实例方法的引用?
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);
}
});
特定类型的任意对象到底是什么?我没看懂部分代码(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);
}
});