接口优于抽象类的优势是什么?

时间:2011-04-29 17:31:29

标签: java oop

抽象类具有具体和抽象功能。 接口只有抽象函数。

两者都可以覆盖。是吗

一个人的实时优势是什么?

10 个答案:

答案 0 :(得分:38)

接口适用于您想说“我不关心您是如何做到的,但这就是您需要完成的工作。”

抽象类适用于你想说“我知道你应该做什么,我知道你应该如何在一些/很多情况下这样做。”

抽象类有一些严重的缺点。例如:

class House {

}

class Boat {

}

class HouseBoat extends /* Uh oh!! */ {
    // don't get me started on Farmer's Insurance "Autoboathome" which is also a helicopter
}

您可以通过界面了解:

interface Liveable {

}

interface Floatable {

}

class HouseBoat implements Liveable, Floatable {

}

现在,抽象类也非常有用。例如,考虑AbstractCollection类。它定义了所有集合的常用方法的默认行为,例如isEmpty()contains(Object)。如果您愿意,可以覆盖这些行为,但是...是确定集合是否为空的行为确实可能会更改?通常它会是size == 0

由于它不会经常改变,开发人员是否真的值得每一个......单个......时间......为“解决”类别中的每个方法实现该方法?更何况当您需要对其进行更改时,如果您不得不在任何地方重新实现它,那么您将会遇到代码重复和错过的错误。

答案 1 :(得分:16)

接口很有用,因为Java没有多重继承(但你可以实现任意数量的接口)。

当您需要基类的具体行为时,抽象类很有用。

答案 2 :(得分:2)

事实是 -

  1. Java不支持多重继承
  2. 可以实现多个接口
  3. 抽象类中很少有方法可以实现
  4. 这些事实可用于倾斜优势,有利于接口或抽象类。

    如果一个类必须与其他类共享多个行为,则接口获胜。 如果必须与其他类共享/覆盖方法定义,则抽象类获胜。

答案 3 :(得分:1)

类可能实现多个接口,而它可能只扩展一个类(抽象或具体),因为Java不支持多重继承。

答案 4 :(得分:1)

在OOP中(大多数独立于具体语言)抽象类是行为和结构的类层次结构的重用机制,它本身并不完整。 接口是独立于具体实现而在模块(例如类)上指定要求的机制。 所有其他差异都是技术细节,重要的是不同的用法。

答案 5 :(得分:0)

你不要覆盖界面。你实现它。

编写接口使实现者能够实现接口以及除继承基类之外的其他接口。

可以部分或完全实现抽象类。标记类抽象只会阻止您实例化该类型的对象。

答案 6 :(得分:0)

-Method没有任何实现是抽象方法,每当一个类包含一个或多个抽象方法时,它必须被声明为抽象类

-Interface是完全抽象的,不能有构造函数,实例和静态块,它只包含两种类型的成员 公共抽象方法 2.public-static-final变量

*两者都无法实例化,但可以创建引用。

*哪一个更适合取决于应用程序 -Interfaces非常有用,因为Java类不支持多重继承,但接口不支持。

- 当您需要基类的具体行为时,抽象类很有用。

答案 7 :(得分:0)

界面优于抽象类的主要优点是克服钻石的发生 问题并实现多重继承。 在java中,没有为使用类的钻石问题提供解决方案。因此,多重继承是使用java中的类的块。 因此,要实现多重继承,我们使用interface。

答案 8 :(得分:0)

class Animal
{ void move(){} }

class Bird
{ void move(){fly} }

class Fish
{ void move(){swim} }

现在,如果类Animal是抽象类,如

Animal a; 

a= new Bird(); or a = new Fish()

在这里,抽象效果很好,但如果有100个对象,如Animal a[100];

你不能写new Bird().movenew Fish().move 100次

使用界面并编写a[i].move。它将区分为鸟或鱼,并且move()将被调用

其次它支持多重继承,因为类A可以实现尽可能多的接口。

答案 9 :(得分:0)

惊人的答案!!

我也想对界面发表我的看法。

顾名思义,它是接口,意思是它将提供两个类之间的接口。

它帮助一个类或接口同时拥有多个行为。

拥有接口的人可以访问与接口一致的类的行为。

interface teacher
    {
    //methods related to teacher
    }

interface student
    {
     //methods related to student
    }
 interface employee
    {
    //methods related to employee
    }

 class Person:teacher,student,employee
    {
     //definition of all the methods in teacher,student, employee interface
     //and method for person
    }

现在有 teacher 接口的类将只能访问 Person 的 teacher 行为。 同样,具有 student 接口的类或模块将只能访问人的 student 行为。

使用抽象类,根本不可能。

希望这会增加一些额外的点。 :)

快乐编码!!!。