抽象类和接口的相同点与不同点

抽象类和接口的相同点与不同点,,哪位能给出详细的说法,,要实用一点的..谢谢..

一、两者相同点

1、不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

2、抽象类里的抽象方法必须全部被子类所实现,子类不能全部实现父类抽象方法,那么该子类还只能是抽象类。一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

二、两者不同点 

1、默认的方法实现

抽象类可以有默认的方法实现;接口,Java8规定可以为接口提供默认实现的方法并且不用强。

2、实现

制子类来重写子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要重写抽象类中的抽象方法;接口子类使用关键字implements 来实现接口,它需要重写接口中没有默认。 

3、构造器

抽象类可以有构造器,接口不能有构造器。

4、与正常Java类的区别

除了不能实例化抽象类之外,和普通Java类没有任何区别;接口是完全不同的类型外。

5、访问修饰符

抽象方法可有public.protected和default、abstract修饰符。不能用privatestatic.synchronize、 native 修饰;

接口属性默认修饰符是publicstatic final (必须赋初值) ,方法默认修饰符是publicabstract. Java8 开始出现静态方法,多加static关键字。

6、main方法

并且可以运行它;接口没有main方法,因此不能运行它。

7、多继承

抽象类可以继承一个类和实现多个接口;接口只可以继承一个或多个接口。

8、速度

抽象类比接口速度快;接口是稍微有点慢,因为它需要花时间去寻找在类中的实现方法。

9、添加新方法

如果往抽象类中添加新的方法,可以给它提供默认的实现,不需要改变现代码;如果往接口中添加方法,并且该方法没有默认实现,必须改变实现该接口的类。

扩展资料:

抽象类的运用意义

在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。

这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。

由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。

为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2019-10-15

一、两者相同点

1、不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

2、抽象类里的抽象方法必须全部被子类所实现,子类不能全部实现父类抽象方法,那么该子类还只能是抽象类。一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

二、两者不同点 

1、默认的方法实现

抽象类可以有默认的方法实现;接口,Java8规定可以为接口提供默认实现的方法并且不用强。

2、实现

制子类来重写子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要重写抽象类中的抽象方法;接口子类使用关键字implements 来实现接口,它需要重写接口中没有默认。 

3、构造器

抽象类可以有构造器,接口不能有构造器。

4、与正常Java类的区别

除了不能实例化抽象类之外,和普通Java类没有任何区别;接口是完全不同的类型外。

扩展资料:

抽象类的运用意义

在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。

这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。

由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。

为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。

参考资料来源:百度百科-抽象类

本回答被网友采纳
第2个回答  推荐于2017-05-23
相同点

* 都不能被直接实例化,都可以通过继承实现其抽象方法。
* 都是面向抽象编程的技术基础,实现了诸多的设计模式。

不同点

* 接口支持多继承;抽象类不能实现多继承。
* 接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
* 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
* 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。
* 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。
* 接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。本回答被网友采纳
第3个回答  2019-05-18

相同点: 

    他们都能不能生成实例,都有抽象方法。 

    接口是特殊的抽象类。 

    接口和抽象类的继承都使用的关键字是extends。

不同点: 

    接口的定义的变量默认是public static final型,且必须给其赋初值。所以在实现类中不能重新定义,也不能改变其值。而在抽象类中其值在子类中可以重新定义也可以重新赋值。

    接口的方法默认的都是public abstract类型的。 

    抽象类中可以有构造器,但是接口中除了抽象方法什么都没有。 

    名字不同,接口写的是public interface  Shape{}; 

    而抽象类写的是public  abstract class Shape{}; 

    接口里全部都是抽象方法。

    而抽象类里可以有抽象方法也可以有其他的方法。

    接口里的属性都是静态的。

    但是抽象类的属性可以是任意的。 

    还可以从继承的角度看,接口可以多继承,一个接口可以继承多个接口。

    但是抽象类却不能,只能是继承一个父类,不能继承多个父类。要是能继承多个父类的话会在父类和子类的方法中有发生冲突。

相似回答