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

java中的接口如何用于代码重用?,java,interface,multiple-inheritance,Java,Interface,Multiple Inheritance,我正在学习java,并且知道java不支持多重继承。因此,java为此引入了接口。接口如何解决多重继承的问题 我在网上读到:“java中的继承意味着代码重用” 如果我在类A中实现一个接口,我必须在类A中给出我自己的接口实现,在类B中给出同样的接口实现,这意味着接口中的方法(比如i)将在A和B中有不同的实现。它如何使用代码可重用性功能?接口没有解决多重继承问题,或者说它没有创建多重继承问题。它为您提供了重用现有实现的可能性。 例如: class Dog implements Comparable&

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

我在网上读到:“java中的继承意味着代码重用”


如果我在类A中实现一个接口,我必须在类A中给出我自己的接口实现,在类B中给出同样的接口实现,这意味着接口中的方法(比如i)将在A和B中有不同的实现。它如何使用代码可重用性功能?

接口没有解决多重继承问题,或者说它没有创建多重继承问题。它为您提供了重用现有实现的可能性。 例如:

class Dog implements Comparable<Dog>, Animal
类狗,动物
由于您的类实现了两个接口,您可以以不同的方式使用它们。要使用TreeSet对象,需要实现可比较的方法(这不是唯一的可能性)。当Dog被传递到树集时,该结构的实现就可以确保该对象具有compareTo(Dog-Dog)方法并可以使用它。 但是,如果您想存储一个动物列表,并使用为动物声明的执行方法遍历该列表,那么您就不会使用可比较的接口,而是使用动物

List<Animals> animals = new ArrayList<>();
animals.add(dog);
animals.add(cat);
for (Animal animal : animals) {
    animal.walk();
}
List animals=new ArrayList();
动物。添加(狗);
动物。添加(猫);
用于(动物:动物){
动物。行走();
}

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

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

因此,Java消除了多重继承带来的问题(著名的钻石问题),同时也消除了它带来的优势,如代码可重用性。这种设计遵循的原则是通过删除“高级”(一些令人困惑的)C++特性(如多重继承、操作符重载、指针操作等),使java简单易懂,可预测。
有几种技术允许Java恢复多重继承的大部分代码重用性。其中一种技术是合成:因此,如果我们以@Kermi为例,您可以拥有一个
GeneralAnimal
类,它实现了
动物
最常见的行为。每个
Dog
实例都持有对
GeneralAnimal
实例的引用(通过ctor或factory或依赖项注入或…)并可以将一些消息(=方法调用)委托给该实例。在
Cat
实例等中也是如此。

您在问题中的任何断言都没有给出适当的引用,因此不可能知道他们实际上在说什么。。。或者为什么你认为他们说了这些不正确或误导的话


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

这是正确的

因此,java为此引入了接口

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

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

事实并非如此

多重继承是关于从多个父类继承方法和字段声明。接口不提供这一点,也不能解决问题

接口确实允许您声明一个或多个公共API并实现该API,而无需共享代码。但是通过仔细的设计,你可以在任何情况下进行代码共享;e、 g.使用委托设计模式

我在网上读到:“java中的继承意味着代码重用”

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

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

如果我在类A中实现一个接口,我必须在A中给出我自己的实现,在B中也一样,这意味着接口(比如i)中的方法在A和B中有不同的实现

我猜你的意思是这样的:

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中,您可以在某些情况下将代码放入接口中;阅读默认方法功能。这确实允许通过
接口
直接重用代码。但我怀疑这就是您一直在查看的源代码所说的。)

您可能看到了“我知道接口是如何工作的”,但是你不知道它是如何解决多重继承问题的吗?你为什么认为它能解决这些问题呢?你从哪里得到这个想法的?提示:如果你能给我们一些引文,我们可以(也许)弄清楚它(你正在阅读的文本)实际上在说什么,并向你解释。我提到的每个网站都说,在java中,多重继承可以通过接口实现,所以,不是继承