Java8 中的静态方法
Static methods in Java8
Java8 允许接口有静态方法。如果有人解释在哪种情况下我们可能需要使用静态方法进行接口,那将非常有帮助。
提前致谢。
- Java接口静态方法是接口的一部分,我们不能用它来实现class个对象。
- Java接口静态方法有利于提供实用方法,例如null检查、集合排序等
- Java 接口静态方法通过 不允许实现 class 重写它们 .
来帮助我们提供安全性
- 我们不能为 Object class 方法定义接口静态方法,我们会得到编译器错误“这个静态方法不能隐藏 Object 的实例方法”。这是因为 java 中不允许这样做,因为
- 对象是所有 class 对象的基础 class,我们不能有一个 class 级静态方法和另一个具有相同签名的实例方法。
- 我们可以使用 java 接口静态方法来删除实用程序 class ,例如 Collections 并将其所有静态方法移动到相应的接口,这将很容易找到和使用。
您是否搜索了 jdk 来源?至少举两个例子怎么样:
Function.identity()
有如下实现:
static <T> Function<T, T> identity() {
return t -> t;
}
或 Predicate.isEqual
看起来像:
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
通常 我将它们视为静态工厂方法,return 返回该接口的一个实例。
我有一个我们在代码库中使用的很好的例子 (but it comes from Holger initially):
public interface UncheckedCloseable extends Runnable, AutoCloseable {
@Override
default void run() {
try {
close();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
static UncheckedCloseable wrap(AutoCloseable c) {
return c::close;
}
default UncheckedCloseable nest(AutoCloseable c) {
return () -> {
try (UncheckedCloseable c1 = this) {
c.close();
}
};
}
}
据我了解-
1.These 方法不能被继承它的 类 覆盖。
2.They 只能被该接口的函数访问(不能被覆盖)。
因此,只要您希望接口的函数(不是静态的也不是被覆盖的)使用该函数(静态的),就可以使用它们。
所以你可以在里面使用你自己的业务逻辑,你自己的排序方式,一些限制或边界。
所以它可以像有人调用你的函数一样使用,你在其他函数的帮助下在其中做你自己的事情。这就像另一个程序员实现你的接口来使用一些功能,为自己的程序提供一些支持(例如,可以保存笔记、计划会议等的日历)。
但请记住,您不应该覆盖调用那些静态函数的函数。
Java8 允许接口有静态方法。如果有人解释在哪种情况下我们可能需要使用静态方法进行接口,那将非常有帮助。
提前致谢。
- Java接口静态方法是接口的一部分,我们不能用它来实现class个对象。
- Java接口静态方法有利于提供实用方法,例如null检查、集合排序等
- Java 接口静态方法通过 不允许实现 class 重写它们 . 来帮助我们提供安全性
- 我们不能为 Object class 方法定义接口静态方法,我们会得到编译器错误“这个静态方法不能隐藏 Object 的实例方法”。这是因为 java 中不允许这样做,因为
- 对象是所有 class 对象的基础 class,我们不能有一个 class 级静态方法和另一个具有相同签名的实例方法。
- 我们可以使用 java 接口静态方法来删除实用程序 class ,例如 Collections 并将其所有静态方法移动到相应的接口,这将很容易找到和使用。
您是否搜索了 jdk 来源?至少举两个例子怎么样:
Function.identity()
有如下实现:
static <T> Function<T, T> identity() {
return t -> t;
}
或 Predicate.isEqual
看起来像:
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
通常 我将它们视为静态工厂方法,return 返回该接口的一个实例。
我有一个我们在代码库中使用的很好的例子 (but it comes from Holger initially):
public interface UncheckedCloseable extends Runnable, AutoCloseable {
@Override
default void run() {
try {
close();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
static UncheckedCloseable wrap(AutoCloseable c) {
return c::close;
}
default UncheckedCloseable nest(AutoCloseable c) {
return () -> {
try (UncheckedCloseable c1 = this) {
c.close();
}
};
}
}
据我了解-
1.These 方法不能被继承它的 类 覆盖。
2.They 只能被该接口的函数访问(不能被覆盖)。
因此,只要您希望接口的函数(不是静态的也不是被覆盖的)使用该函数(静态的),就可以使用它们。
所以你可以在里面使用你自己的业务逻辑,你自己的排序方式,一些限制或边界。
所以它可以像有人调用你的函数一样使用,你在其他函数的帮助下在其中做你自己的事情。这就像另一个程序员实现你的接口来使用一些功能,为自己的程序提供一些支持(例如,可以保存笔记、计划会议等的日历)。
但请记住,您不应该覆盖调用那些静态函数的函数。