6

我是 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 定义为接口。现在ADT和接口有什么区别或者ADT是一个接口

4

8 回答 8

26

这个问答似乎有些混乱。问题是关于“抽象数据类型和接口”的,大多数答案都集中在“抽象类”上。

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

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

在我看来,接口是 Java 实现“抽象数据类型”的方式

您可以在 Wiki中阅读“抽象数据类型”。除此之外,如果您想了解更多关于 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 引入了一种称为“默认方法”的东西,通过它我们实际上可以为接口中的方法提供实现。为了消除这种混淆,您可以参考这个stackoverflow问题Interface with default methods vs Abstract class in Java 8

于 2014-05-14T11:12:36.197 回答
8

试着这样想:

  • 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 概念。
于 2014-05-13T09:47:20.793 回答
5

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

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

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

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

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

于 2013-10-08T05:14:43.177 回答
4

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

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

对于 Java 编程语言

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

但底线是它是一个概念

于 2014-05-15T10:31:32.617 回答
1

在java中-

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

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

按照这些链接

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

接口和抽象类有什么区别?

于 2013-10-08T05:10:39.140 回答
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
于 2014-05-15T05:32:44.077 回答
0

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

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

当一个类包含零个或多个抽象方法时,或者当接口实现到并非所有方法都未实现的类时,您可以将其声明为抽象类。

于 2013-10-08T05:45:49.917 回答
-6
What is the difference between Abstract data type and Interface.
  1. 在 Java 接口中声明的变量默认是 final 的。抽象类可能包含非最终变量。
  2. 默认情况下,Java 接口的成员是公共的。Java 抽象类可以具有通常的类成员风格,如私有、受保护等。查看此链接以获取信息
于 2013-10-08T05:07:30.317 回答