Java 为什么我们需要接口而不是类,以及我们通过接口实现了什么

Java 为什么我们需要接口而不是类,以及我们通过接口实现了什么,java,Java,我们知道,我们只能声明方法签名,也不能创建接口的实例。那么为什么我们需要接口。不需要将其加载到JVM中。这也是一种性能下降。我们正在创建接口和几个实现该接口的类,并定义接口的所有方法。实际上,我们从这个界面获得了什么。你能给我举个例子吗。接口是你强迫你的客户端实现某些特定的东西,实现将由客户端来完成。而且java不支持通过扩展多个类来实现多重继承,你可以实现多个接口 例如:List声明add(…)方法List的所有实现都提供了它的实现 简单一点 您定义了一个接口Animal和一个方法speak(

我们知道,我们只能声明方法签名,也不能创建接口的实例。那么为什么我们需要接口。不需要将其加载到JVM中。这也是一种性能下降。我们正在创建接口和几个实现该接口的类,并定义接口的所有方法。实际上,我们从这个界面获得了什么。你能给我举个例子吗。

接口是你强迫你的客户端实现某些特定的东西,实现将由客户端来完成。而且java不支持通过扩展多个类来实现多重继承,你可以实现多个接口

例如:
List
声明
add(…)
方法List的所有实现都提供了它的实现

简单一点

您定义了一个接口
Animal
和一个方法
speak()。人会说话,狗会吠叫,狮子会咆哮


为什么我们要去创造类动物额外的。我们可以在每个类中声明speak()。我们将从Animal类中得到什么,并在所有子类中实现speak()。但我还是不明白这个概念

主要优点是继承和多态性[面向对象的核心概念]

您在这里也指定了动物的行为

你可以

Animal obj = new Man();

Animal obj = getAnimalForThisCriteria(something here);//this will return some animal at runtime so you can catch instance using Animal.

您可能有三个不同的类Ma、Dog、Lion,它们的方法相同,但除非它们扩展或实现了公共类或接口,否则无法判断它们都是动物。下面是结构的概念,将接口与类分开,可以在,对象的接口及其实现。如果没有它们,您将没有标准的方法来指示某些类根本不应该包含实现细节


其次,由于Java不支持多重继承,接口是一种局部的解决方法,允许继承类的外部特性。

当您只关心对象的功能,而不关心它是如何实现这些功能时,接口是适用的

假设您正在为机器人编写高级控制代码。你不关心机器人的实际工作方式,你只想告诉它前进、后退、向左或向右等等。如果没有接口,你将实现一个名为
AbstractRobot
的抽象类,它将所有方法都作为抽象方法。此时,您基本上已经创建了一个接口,但它是一个抽象类的形式,但比所需的“重”


最后,一个类可以符合多个接口,但只能从一个类继承。这允许一些依赖于多重继承的设计模式。

我将尝试用简单的话来解释这一点

想想你最喜欢的电脑游戏,比如说反击。 在这个游戏中,玩家(恐怖分子或反恐怖分子)使用武器

如果我们教玩家如何使用
武器
(类似于界面),它可以使用任何武器,如
AK47
特立独行
散弹枪
狙击手
(类似于继承武器界面的类)

这个优点是考虑<代码>火箭炮< /代码>(实现武器)是在未来版本中开发的。然后当前玩家将能够使用它而无需任何修改-因为它知道如何使用武器界面:-)


这只是一个简单的例子。使用接口还有许多其他原因。

简单。我认为接口和抽象类的用途是相同的。不同之处在于,如果您扩展了一个抽象类,那么就不能在Java中扩展任何其他类。原因:Java不支持多重继承。同时,您可以为一个类实现任意数量的接口

在我看来,接口最重要的用途是将代码(或)作为参数传递给方法

例如:

假设我们想要创建一个方法,该方法可以返回运行一段代码所需的执行时间。我们希望将代码作为参数传递给此方法

interface Code{
     public void run();   
}


long getExectutionTime(Code code){

     long startTime = System.nanoTime();    
     code.run();    
     return System.nanoTime() - startTime;
}


getExecutionTime(new Code(){

     public void run(){
          //the code to be executed
     }
});
在java 8中

getExecutionTime(()->{ 
     //the code to be executed 
});

接口只是新实现的一条指导线
它为新的实现提供了一些说明,并对对象的功能进行了分类。在细节上,例如,如果我们创建了一个接口,那么我们就为实现创建了一条说明。

接口的一个类比是,将使用接口的类看作是一个电墙插座,并将实现视为插件。插座不在乎插头后面是什么,只要它能安装在插座上。在psuedocode术语中,可以这样编写:

public interface ElectricOutlet {
     public void powerUp(); 
}
实现ElectricOutlet的类可能如下所示:

public class Appliance implements ElectricOutlet {
    //member variables
    public void powerUp() {
        //Draw power from the wall
    }
    ...
}
那么如何使用该接口呢?像这样:

//lots of other code
ElectricOutlet out = new Appliance(); //plug the appliance into the outlet
out.powerUp; //power it up!
当然,它不一定是一个可以插入插座的设备。它可以是一台电视、一台笔记本电脑或一台割草机,但从插座的角度来看,它们的行为都是一样的。那么这如何应用于编程呢?以完全相同的方式:

List<String> list = new ArrayList<String>(); // create a new List of Strings
List List=new ArrayList();//创建一个新的字符串列表
我刚刚创建了一个新的(空)字符串列表。如果ArrayList不能提供正确的性能,并且LinkedList工作得更好,我可以返回并将该行更改为:

List<String> = new LinkedList<String>(); //should work better now
List=newlinkedlist()//现在应该更好了
之所以可以这样做,是因为ArrayList和LinkedList都实现了列表接口,因此它们提供了相同的行为(API),即使内部实现可能不同。然而,从列表的角度来看,内部工作是什么并不重要,只要接口在那里就行。这允许类之间有很大的独立性,并允许更多的重用