抽象数据类型和接口

时间:2013-10-08 05:04:15

标签: java

我是Java新手。抽象数据类型和接口之间有什么区别。

例如我们有一个ListADT

interface MyListADT<T> {
    void add(T var);
    void add(T var,int pos);
    void display();
    T remove(int pos);
    void clear();
    boolean contains(Object o);
}

我们将ADT定义为接口。 NoW ADT和接口有什么区别或者ADT是接口

8 个答案:

答案 0 :(得分:21)

这个Q&amp; A似乎有些混乱。问题是关于&#34;抽象数据类型和界面&#34;并且大多数答案都是关于&#34;抽象类&#34;。

术语&#39;抽象数据类型&#39;抽象类指的是两个完全不同的概念,尽管它们都使用了“抽象”这个词。抽象数据类型是一种自包含的用户定义类型,它将数据与一组相关操作捆绑在一起。它的行为方式与内置类型的行为方式相同。但是,它不从其他类继承,也不用作其他派生类的基础。如果你在wiki中搜索它,你会看到&#34;抽象数据类型被定义为构成数据类型的数据对象的数学模型以及对这些对象进行操作的函数。没有用于定义它们的标准约定。可以在&#34;命令式&#34;之间划出广泛的划分。和&#34;功能性&#34;定义样式。&#34;例如,在Java中我们有List接口。它定义了一个数据结构,其中包含一组操作方法但不提供任何实现。

相比之下,抽象类不是抽象数据类型。抽象类是一个被声明为抽象的类 - &#39;它可能包括也可能不包括抽象方法&#39;。抽象类无法实例化,但可以进行子类化。它不是数据类型。抽象类只是一个骨架接口,它指定了其子类实现的一组服务。不幸的是,这两个概念之间的区别经常被混淆。许多人在实际引用抽象类时错误地使用术语抽象数据类型。

在我看来,接口是Java实现&#34;抽象数据类型&#34;

的方式

您可以阅读&#34; Abstract Data Type&#34;在维基。除此之外,如果你想了解更多关于java中的抽象数据类型,你可以参考这个链接http://www.e-reading.ws/bookreader.php/138175/Abstract_Data_Types_in_Java.pdf,它真的很好。

大多数人可能熟悉抽象类,但您可以从http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

了解它

为了加剧这种混淆,Java 8引入了一些名为&#34; Default Methods&#34;的东西,通过它我们实际上可以为接口中的方法提供实现。为消除这种混淆,您可以参考此stackoverflow问题Interface with default methods vs Abstract class in Java 8

答案 1 :(得分:7)

尝试这样考虑:

  • Java接口是一种类型,归结为一组方法签名。任何愿意作为接口引用的类型都必须为这些签名提供实现。实际上,没有行为合同。您的实现无能为力,仍然在“实现”接口。

  • Java抽象类是一种类型,具有部分指定的行为,其内部实现由于某种原因必须在其继承者中指定。这个类确实有行为,可以在他的继承者中重新定义/指定。

  • ADT是一组预期行为。您认为,在致电adt.remove(element)后,您拨打adt.get(element)并接听null

你的问题的答案是:只是一个界面不足以成为一个ADT。

  • 正确实现您的界面MyListADT<T>的所有内容都是ADT。其外部行为必须符合ADT概念。这意味着,要被视为ADT,您的类型必须包含实现,这将导致抽象类或普通类。例如:java.util.List<T>是ADT的接口,但java.util.ArrayList<T>java.util.LinkedList<T>实际上是ADT,因为它们的实际行为符合ADT概念。

答案 2 :(得分:5)

数据与其方法的组合称为抽象数据类型(ADT)。

Java接口是一种指定(但不实现)ADT的方法。

它指定ADT方法的名称,参数和返回类型(即标题)。

接口不指定数据字段(公共常量除外),因为这是一个实现细节。

Java接口将ADT的要求指定为服务提供者(实现ADT的类)与客户端(类的用户)之间的契约。

答案 3 :(得分:4)

根据[wiki] http://en.wikipedia.org/wiki/Abstract_data_type

在计算机科学中,抽象数据类型(ADT)是具有相似行为的某类数据结构的数学模型;或者对于具有类似语义的一种或多种编程语言的某些数据类型。抽象数据类型是间接定义的,只能通过可能对其执行的操作以及对这些操作的影响(以及可能的成本)的数学约束来定义。

对于Java编程语言

您可以将Java的List接口作为示例。接口根本没有明确定义任何行为,因为没有具体的List类。接口只定义了一组其他类(例如ArrayList和LinkedList)必须实现的方法才能被视为List。

但最重要的是它是一个概念

答案 4 :(得分:1)

在java -

接口只能有抽象方法,这意味着你只能声明方法,即。方法可以有任何默认实现。但抽象类可以有抽象或完整的方法。

如果您要扩展的类是抽象的,那么您的子类应该被声明为抽象或者应该实现超类的所有抽象方法。            在-in接口的情况下,你可以实现你想要的任意数量的接口。你也应该实现你的类中所有接口的所有抽象方法,或者它应该被声明为抽象。

点击这些链接

http://javapapers.com/core-java/abstract-and-interface-core-java-2/difference-between-a-java-interface-and-a-java-abstract-class/

http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

What is the difference between an interface and abstract class?

答案 5 :(得分:1)

更多清关。 语法和示例

抽象类的语法

public abstract class MyAbstractClass  
{  
    //code  
    public abstract void method();      
} 

抽象类的示例

public abstract class Animal  
{  
    abstract void walk();      
}  

public class Dog extends Animal  
{  
    void walk()  
    {  
         //Implementation is done here  
    }  
}  

界面语法

public interface NameOfInterface
{
   //Any number of final, static fields
   //Any number of abstract method declarations\
}

界面示例

interface Animal {

   public void eat();
   public void travel();
}

实施界面

public class MammalInt implements Animal{

   public void eat(){
      System.out.println("Mammal eats");
   }

   public void travel(){
      System.out.println("Mammal travels");
   } 

   public int noOfLegs(){
      return 0;
   }

   public static void main(String args[]){
      MammalInt m = new MammalInt();
      m.eat();
      m.travel();
   }
}

扩展界面

//Filename: Sports.java
public interface Sports
{
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

//Filename: Football.java
public interface Football extends Sports
{
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

//Filename: Hockey.java

public interface Hockey extends Sports
{
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

扩展多个界面

public interface Hockey extends Sports, Event

扩展并实现两者

interface A can extends interface B 
class A can extends class B         
class A implements interface A   
class A extends class B implements interface A

答案 6 :(得分:0)

数据与其方法的组合称为抽象数据类型(ADT)。

Java接口是一种指定抽象数据类型(ADT)的方法。

当一个类包含零个或多个抽象方法时,或者当一个接口被实现到一个没有实现所有方法的类时,你可以将它声明为抽象。

答案 7 :(得分:-6)

What is the difference between Abstract data type and Interface.
  1. Java接口中声明的变量默认为final。一个 抽象类可能包含非最终变量。
  2. 默认情况下,Java接口的成员是公共的。 Java摘要 class可以拥有像private这样的类成员的通常风格, 受保护等。 查看此link了解信息