java中的接口如何用于代码重用?

时间:2017-09-17 07:41:36

标签: java interface multiple-inheritance

我正在学习java,并且知道Java不支持多重继承。所以,java为此引入了接口。如何通过接口解决多重继承的问题?

我在网上看到的内容:" java中的继承意味着代码重用"。

如果我在类中实现一个接口说A,我将在A中给它自己的实现,在B中也是如此,这意味着接口中的方法(比如说I)将在A和B中有不同的实现。它是否使用代码重用功能?

4 个答案:

答案 0 :(得分:2)

您没有对您在问题中提出的任何断言进行适当的引用,因此无法知道他们实际上在说什么......或者为什么您认为他们说这些不正确或误导的事情。

  

我正在学习java,并且知道Java不支持多重继承。

这是正确的。

  

因此,java为此引入了接口。

那是不正确的。 Java引入了支持多态的接口。特别是不依赖于类继承的多态。

  

接口是如何解决多重继承问题的呢?

不是。

多个继承是关于多个父的方法和字段声明的继承。接口没有提供,并没有解决问题。

接口允许您声明一个公共API(或APIS)并实现该API,而不必必须共享代码。但是通过精心设计,您可以在任何情况下进行代码共享;例如通过使用委托设计模式。

  

我在网上看到的内容:" java中的继承意味着代码重用"。

我怀疑它实际上说的是什么。无论如何,它是不正确的。

继承(类)是实现代码重用的一种方法,但它只是实现重用的众多方法之一。还有很多其他的。

  

如果我在类中实现一个接口说A,我将在A中给它自己的实现,在B中也是如此,这意味着接口中的方法(比如说I)将在A和B中有不同的实现。 / p>

我认为你的意思是这样的:

public interface I {
    void someMethod();
}

public class A implements I {
    void someMethod() {
         // some code
    }
}

public class B implements I {
    void someMethod() {
         // some code
    }
}
  

它如何使用代码重用功能?

该示例中没有代码重用。但这不是类的继承(我将其描述为单向来实现代码重用)。它是一个实现类的接口。

(现在在Java 8中,您可以在某些情况下将代码放入接口;阅读默认方法功能。这确实允许通过interface直接代码重用。但我怀疑这是你一直在讨论的来源。)

答案 1 :(得分:1)

Java通过允许单个继承解决了多重继承的问题(或者更确切地说是此功能带来的问题),即只允许一个超类。此设计创建了一个需要实现多个合同的类的新问题。合同,如@ Kermi的答案中所解释的那样,允许其他对象将不同类型的对象引用到同一个对象,出于各种目的,最常见的是存储在Collection中。一个接口可以被视为没有实现的超类(如果你愿意,所有的方法都是纯虚的)

因此,Java消除了多重继承(着名的钻石问题)带来的问题,但也消除了代码可重用性带来的优势。这种设计遵循以下原则:通过删除“高级”(有些说令人困惑)C ++特性,如多重继承,运算符重载,指针操作(以及其他),使Java变得简单,易于预测。

有几种技术允许Java恢复多重继承的大部分代码可重用性。一个这样的技术是组合:所以如果我们采用@ Kermi的例子,你可以有一个GeneralAnimal类来实现Animal的最常见行为。每个Dog实例都包含对GeneralAnimal实例的引用(通过ctor或factory或依赖注入或...获得),并且可以将一些消息(=方法调用)委托给该实例。在Cat实例中也是如此,等等。

答案 2 :(得分:0)

接口不解决多重继承问题,或者它不会创建多重继承问题。它使您可以重用现有的实现。 例如:

class Dog implements Comparable<Dog>, Animal

当您的类实现2个接口时,您可以以不同的方式使用它们。要使用TreeSet对象需要实现Comparable方法(它不是唯一的可能性)。当Dog传递给TreeSet时,该结构的实现是确保该对象具有compareTo(Dog dog)方法并且可以使用它。 但是你想要存储动物列表,而不是使用为Animal声明的执行方法遍历该列表,而不是使用Comparable接口,而是使用Animal。

List<Animals> animals = new ArrayList<>();
animals.add(dog);
animals.add(cat);
for (Animal animal : animals) {
    animal.walk();
}

答案 3 :(得分:-2)

我认为界面是一个标准。 A和B应该符合它。另外,A和B执行不同的操作,例如ArrayList和LinkedList。 “java中的继承意味着代码重用”是正确的,但接口不是。它体现了一种规范。 当你学习收藏时,你会清楚地理解它。