elik Asked:2020-10-12 20:36:24 +0000 UTC2020-10-12 20:36:24 +0000 UTC 2020-10-12 20:36:24 +0000 UTC 接口和抽象类有什么区别 772 以前,interface它没有实现,我们必须实现抽象类。但是现在,特别是从'Java8'开始,接口可以有一个实现。他们为什么这样做?这里有什么收获?具有实现的接口有什么好处?最重要的是,如果接口可以包含方法的实现,那么使用抽象类的意义何在? java 1 个回答 Voted Best Answer Nofate 2020-10-12T20:51:35Z2020-10-12T20:51:35Z 接口只描述行为(方法),不能有状态(字段),抽象类可以。 在default-methods 的情况下,不仅可以描述行为,还可以实现行为。但是,仍然无法进入状态。 在 Java 8default中,主要为了 Stream API 添加了 -methods。这允许我们向所有在 Stream API 出现之前编写的集合添加方法spliterator(),stream()而不会影响它们的实现: public interface Iterable<T> // ... default Spliterator<T> spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); } } public interface Collection<E> extends Iterable<E> { // ... @Override default Spliterator<E> spliterator() { return Spliterators.spliterator(this, 0); } default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); } } 如您所见,这里的默认方法的行为类似于 mixins,包装了一些第三方实现(Spliterators, StreamSupport)并将其转换为诚实的集合方法。 生活中的一个例子。有一个数据访问接口可以有不同的实现: public interface Repository { Foo getFooWithTimeout(int id, int timeout); // ... } 而且我想拥有一些具有默认参数值的方法的缩短版本。然后用默认方法包装现有方法就足够了: public interface Repository { Foo getFooWithTimeout(int id, int timeout); default Foo getFoo(int id) { return getFooWithTimeout(id, 0); } // ... } Repository我们用一种新方法扩展了接口的所有实现的契约,没有人受到伤害,我们不必闯入实现。
接口只描述行为(方法),不能有状态(字段),抽象类可以。
在
default-methods 的情况下,不仅可以描述行为,还可以实现行为。但是,仍然无法进入状态。在 Java 8
default中,主要为了 Stream API 添加了 -methods。这允许我们向所有在 Stream API 出现之前编写的集合添加方法spliterator(),stream()而不会影响它们的实现:如您所见,这里的默认方法的行为类似于 mixins,包装了一些第三方实现(
Spliterators,StreamSupport)并将其转换为诚实的集合方法。生活中的一个例子。有一个数据访问接口可以有不同的实现:
而且我想拥有一些具有默认参数值的方法的缩短版本。然后用默认方法包装现有方法就足够了:
Repository我们用一种新方法扩展了接口的所有实现的契约,没有人受到伤害,我们不必闯入实现。