抽象数据类型和接口
我是Java新手。 抽象数据类型和接口有什么区别。
例如我们有一个ListADT
interface MyListADT { 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是接口
What is the difference between Abstract data type and Interface.
- 在Java接口中声明的变量默认为final。 抽象类可能包含非最终变量。
- 默认情况下,Java接口的成员是公共的。 Java抽象类可以具有类似私有,受保护等类通常的类成员。请查看此链接以获取信息
这个Q&A似乎有些混乱。 问题是关于“抽象数据类型和接口”,大多数答案都是关于“抽象类”的。
术语“抽象数据类型”和抽象类指的是两个完全不同的概念,尽管它们都使用“抽象”一词。 抽象数据类型是一种自包含的用户定义类型,它将数据与一组相关操作捆绑在一起。 它的行为方式与内置类型的行为方式相同。 但是,它不从其他类inheritance,也不用作其他派生类的基础。 如果你在wiki中搜索它,你会看到“抽象数据类型被定义为构成数据类型的数据对象的数学模型以及对这些对象进行操作的函数。没有用于定义它们的标准约定可以在“命令性”和“function性”定义风格之间划分界限。“ 例如,在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引入了一种称为“ 默认方法 ”的东西,通过它我们实际上可以为接口中的方法提供实现。 为了消除这种混淆,您可以使用Java 8中的默认方法vs Abstract类来引用此stackoverflow问题接口
试着这样想:
-
Java接口是一种类型,归结为一组方法签名 。 任何愿意作为接口引用的类型都必须为这些签名提供实现。 实际上,没有行为合同。 您的实现无能为力,仍然在“实现”一个接口。
-
Java抽象类是一种类型,具有部分指定的行为,其内部实现由于某种原因必须在其inheritance者中指定。 这个类确实有行为,可以在他的inheritance者中重新定义/指定。
-
ADT是一组预期的行为 。 您假设,在调用
adt.remove(element)
您调用adt.get(element)
并接收null
。
你的问题的答案是:只是一个界面不足以成为一个ADT。
- 正确实现您的接口
MyListADT
一切都是ADT。 其外部行为必须符合ADT概念。 这意味着,要被视为ADT,您的类型必须包含实现,这将导致抽象类或普通类。 例如:java.util.List
是ADT的接口,但java.util.ArrayList
和java.util.LinkedList
实际上是ADT,因为它们的实际行为符合ADT概念。
数据与其方法的组合称为抽象数据类型(ADT)。
Java接口是一种指定(但不实现)ADT的方法。
它指定ADT方法的名称,参数和返回类型(即标题)。
接口不指定数据字段(公共常量除外),因为这是一个实现细节。
Java接口将ADT的要求指定为服务提供者(实现ADT的类)与客户端(类的用户)之间的契约。
根据[wiki] http://en.wikipedia.org/wiki/Abstract_data_type
在计算机科学中,抽象数据类型(ADT)是具有相似行为的某类数据结构的数学模型; 或者对于具有类似语义的一种或多种编程语言的某些数据类型。 抽象数据类型是间接定义的,只能通过可能对其执行的操作以及对这些操作的效果(以及可能的成本)的数学约束来定义。
对于Java编程语言
您可以将Java的List接口作为示例。 接口根本没有明确定义任何行为,因为没有具体的List类。 该接口仅定义了一组方法,其他类(例如ArrayList和LinkedList)必须实现这些方法才能被视为List。
但最重要的是它是一个概念
在java-
接口只能有抽象方法,这意味着你只能声明方法即。 方法可以有任何默认实现。但是抽象类可以同时具有抽象或完整方法。
如果你扩展的类是抽象的,那么你的子类应该被声明为抽象的,或者应该实现超类的所有抽象方法。 在-in接口的情况下,你可以实现你想要的任意数量的接口。你也应该实现你的类中所有接口的所有抽象方法,或者它应该被声明为抽象。
请关注这些链接
http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface
接口和抽象类之间有什么区别?
为了更多的清关。 语法和示例
抽象类的语法
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
数据与其方法的组合称为抽象数据类型(ADT)。
Java接口是一种指定ADT的方法。
当包含零个或多个抽象方法时,可以将类声明为抽象,或者在未实现所有方法的类中实现接口时。