我们知道我们只能声明方法签名,也不能创建接口的实例。那么我们为什么需要界面不必要加载到JVM中。这也是一种性能下降。我们正在创建接口和几个实现该接口的类,并定义接口的所有方法。实际上我们从这个界面取得了什么。能不能给我一些例子。
答案 0 :(得分:9)
接口是你强迫你的客户端实现一些指定的东西,实现将留给客户端。而且java不支持多继承,你可以通过扩展多个类来实现多个接口。
例如:List
声明add(..)
方法,List的所有实现都为它提供了实现。
比较简单。
您定义了一个接口Animal
和一个方法speak()
,这意味着所有Animal必须与不同的实现进行对话。男人会说话,狗会吠叫,狮子会咆哮。
为什么我们要去创建类Animal额外。我们可以在每个班级中声明speak()。我们将从Animal类获得什么,并在所有子类中实现speak()。我仍然没有得到这个概念
主要优点是继承和多态[OOP的核心概念]
你也在这里指定 Animal的行为。
你可以拥有
Animal obj = new Man();
Animal obj = getAnimalForThisCriteria(something here);//this will return some animal at runtime so you can catch instance using Animal.
你可能有三种不同的马,狗,狮子用同样的方法,但没有办法告诉他们都是动物,除非他们扩展或实现共同的类或界面,这里有结构的概念
答案 1 :(得分:4)
将接口与类分开允许清除在对象的接口及其实现之间的分离。没有它们,你就没有标准的方法来表明某些类根本不应该包含实现细节。
其次,由于Java不支持多重继承,因此接口是部分解决方法,允许继承类的外部特性。
答案 2 :(得分:1)
接口适用于您只关心对象的功能,而不是它如何实现它们。
假设您正在为机器人编写高级控制代码。你不关心机器人是如何工作的,你只想告诉它前进,后退,左转或右转等等。如果没有接口,你会实现一个名为AbstractRobot
的抽象类,将所有方法都作为抽象方法。此时你基本上已经创建了一个接口,但是以抽象类的形式,但是比所需的“重”。
最后,一个类可以符合多个接口,但只能从一个类继承。这允许一些依赖于多重继承的设计模式。
答案 3 :(得分:0)
我会用简单的语言解释一下。
考虑你最喜欢的电脑游戏,反恐精英吧。 在这个游戏中,玩家(恐怖分子或反恐怖主义者)使用武器。
如果我们教会玩家如何使用weapon
(类似于界面),它可以使用AK47
,Maverick
,Shotgun
,{{1}等任何武器(类似于继承Weapon接口的类)。
这样做的好处是考虑Sniper
(实现武器)是在未来的版本中开发的。然后当前玩家将能够使用它而无需任何修改 - 因为它知道如何使用武器界面: - )
这只是一个简单的例子。使用接口还有很多其他原因。
答案 4 :(得分:0)
简单。我认为Interfaces和Abstract类是出于同样的目的。区别在于如果扩展Abstract类,则无法在Java中扩展其他类。原因:Java不支持多重继承。同时,您可以为类实现任意数量的接口。
答案 5 :(得分:0)
我认为接口最重要的用途是将代码(anonymous inner class或lambda)作为参数传递给方法。
示例:
假设我们想要创建一个可以返回运行一段代码所需的执行时间的方法。我们希望将代码作为参数传递给此方法。
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
});
答案 6 :(得分:0)
接口只不过是新实现的指南 它为新实现提供了一些指令,并对对象的功能进行了分类。详细说明如果我们创建一个接口,那么我们就会为实现创建一个指令。
答案 7 :(得分:0)
接口的类比是将使用接口的类视为电插座,并将实现视为插件。只要插座适合插座,插座就不关心插头后面的东西。在伪代码术语中,它可以这样写:
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
我刚刚创建了一个新的(空)字符串列表。如果事实证明ArrayList没有提供正确的性能,并且LinkedList工作得更好,我可以返回并将该行更改为:
List<String> = new LinkedList<String>(); //should work better now
我可以这样做,因为ArrayList和LinkedList都实现了List接口,因此即使内部实现可能不同,它们也提供相同的行为(API)。然而,从列表的角度来看,只要界面存在,内部工作原理并不重要。这允许类之间的很多独立性,并允许更多的重用。