<commit_before>---
layout: default
title: Java 十万个为什么
---

* 为什么要使用接口

1. 接口有利于代码复用

代码复用的关键是将变化的地方与不变的地方分离，这样，不变的地方就会得到复用。我们可以将变化的地方抽象成一个接口，这样所有实现
这个接口的类，就都可以使用不变地方的代码。例如 Java 中的排序算法，算法的步骤是不变的，变化的是元素之间的比较方式，我们可以
将比较方式抽象成一个接口，接口中包含一个比较方法。这样，所有实现这个接口的类，都必须实现这个比较方法，之后，他们就可以复用
排序算法。接口在这里就像排序算法与其它类型之间的契约，你实现这个接口，我就让你使用我的功能。<commit_msg>Update 2014-09-16-java-why.md<commit_after>---
layout: default
title: Java 十万个为什么
---

* 为什么要使用接口

1. 接口有利于代码复用

代码复用的关键是将变化的地方与不变的地方分离，这样，不变的地方就会得到复用。我们可以将变化的地方抽象成一个接口，这样所有实现
这个接口的类，就都可以使用不变地方的代码。例如 Java 中的排序算法，算法的步骤是不变的，变化的是元素之间的比较方式，我们可以
将比较方式抽象成一个接口，接口中包含一个比较方法。这样，所有实现这个接口的类，都必须实现这个比较方法，之后，他们就可以复用
排序算法。接口在这里就像排序算法与其它类型之间的契约，你实现这个接口，我就让你使用我的功能。

2. 接口有利于解耦

前面说的代码复用，用抽象类也能实现，那为什么还要用接口呢？如果使用抽象类，那么所有需要排序的类都要继承这个抽象类，由于 Java 中没有
多继承，所以这些类就不能继承其它类。而使用接口就不会有这种问题。接口实际上降低了类与类之间的耦合关系，只需要实现几个方法，不进入
继承体系的时候，就没必要去继承。
{'fraction_non_alphanumeric': 0.09692671394799054, 'fraction_numerical': 0.013002364066193853, 'mean_word_length': 11.27536231884058, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '749428', 'n_tokens_mistral': 756, 'n_tokens_neox': 789, 'n_words': 37}