浅谈Java中接口与抽象类的异同

抽象类接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似。期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别。硬着头皮,做出一波小总结。或许,学习了之后的知识,理解会更加深刻吧,奥利给!

语法上的区别

  • 一个类最多只能继承一个抽象类,但是可以继承多个接口

  • 接口中的变量声明默认是final的,但是抽象类中可以包含非final的变量。

  • 接口中的成员必须都是public的,而抽象类的成员可以是普通类成员的常用风格,即public,private和protected都可以修饰。

  • 接口应用关键字implements来实现,抽象类应使用关键字 extends进行扩展。

  • 一个普通类要是想要实现一个接口,就必须实现接口中的所有方法,但是继承抽象类的情况,可以让继承类用abstract修饰,从而不直接实现抽象类中的抽象方法。

  • 接口只能继承接口,而抽象类能继承其他类或者多个接口,且抽象类可以在不提供接口方法实现的情况下实现接口。

  • 抽象类中可以拥有构造方法,但不能用于创建实例,仅仅供子类去调用构造方法而已。而接口中不允许有构造方法

深入理解

  • JDK1.8之前,接口中全部为隐式抽象方法,不能有具体方法实现, 而抽象类可以有普通方法;JDK1.8之后,接口是允许声明默认方法或静态方法来提供具体的方法实现的。

在默认方法在接口中出现之前,抽象类相比于接口有一个明显的优势在于:有更好的前向兼容性(forward-compatibility),即在不破坏既有代码的情形下继续在类中添加新的功能。但是默认方法的出现,让接口也能够实现这个效果。这个在上一篇提到过:浅谈Java的默认和静态方法

  • 抽象类是面向"对象"的,它需要提供的是"对象"应该具有的基本属性或基本的功能行为,就像人具有年龄的属性,会干活等等。从相同抽象类继承的对象享有相同的基本特征,学生,老师,警察叔叔……他们都具有年龄,也都会干活,无非是可能大家年龄不同,干的活不一样罢了。而这些其实就是一种"is-a"的概念,也就是"学生类是人类的一种"。
abstract class People{
private int age;
public abstract void doSomething();
}
  • 而接口是面向"功能"的,它需要定义对象具有的功能,而不管是什么对象,我只需要知道你能干什么就行,我才不管你是谁。就像学习的功能,不管是机器还是学生都具备,他们就可以就都可以实现这个接口,而不关心他们自身的类型。那么一个对象的功能或者技能肯定是很多的,这时,接口的多实现就显得非常的合理。不同于"is-a"的关系,接口代表的是一种"has-a"的概念,表示"对象具有学习的技能"
interface studyable {
void howToStudy(); default void info() {
System.out.println("study is important for everyone..");
}
}
  • 接口和抽象类都可以实现多态,多态的好处有目共睹,利用向上转型及动态绑定,即在运行时才确定对象的类型,大大增加了扩展性。
public static void main(String[] args) {
studyable[] studyables = new studyable[]{new Robot(), new Student()};
for (studyable s : studyables) {
s.howToStudy();
s.info();
}
System.out.println("*************************************");
People[] peoples = new People[]{new Student(), new Teacher()};
for (People p : peoples) {
p.doSomething();
} }
//测试结果
Robot comes out
Student comes out!
robot need to practice
study is important for everyone..
student will read book..
study is important for everyone..
*************************************
Student comes out!
Teacher comes out!
student should study..
teacher should teach..

参考链接:what is the difference between an interface and abstract class

浅谈Java中接口与抽象类的异同的更多相关文章

  1. 浅谈java中接口与抽象类之间的异同

    刚学习java的时候,总觉得接口和抽象类很像,但又说不上具体有什么区别.今天静下来,翻翻书,查查资料,做个小结.首先举两个例子,看看interface和abstract class 在“外形”上有啥异 ...

  2. Java中接口与抽象类的异同

    定义(以下是百度百科中的定义): Java接口:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具 ...

  3. java中接口和抽象类的异同点

    抽象类和接口的区别:A:成员区别 抽象类: 成员变量:可以变量,也可以常量 构造方法:有 成员方法:可以抽象,也可以非抽象 接口: 成员变量:只可以常量,默认修饰符:public static fin ...

  4. 浅谈Java中的深拷贝和浅拷贝(转载)

    浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: ...

  5. 浅谈Java中的深拷贝和浅拷贝

    转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...

  6. 浅谈Java中set.map.List的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  7. Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  8. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  9. 浅谈Java中的对象和引用

    浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...

随机推荐

  1. @codeforces - 418D@ Big Problems for Organizers

    目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个点连成一棵树,经过每条边需要花费 1 个单位时间. 现给出 ...

  2. Android ListView批量选择(全选、反选、全不选)

    APP的开发中,会常遇到这样的需求:批量取消(删除)List中的数据.这就要求ListVIew支持批量选择.全选.单选等等功能,做一个比较强大的ListView批量选择功能是很有必要的,那如何做呢? ...

  3. DECLARE

    -- 修正用プログラム DECLARE    CURSOR c_adv_fee_detail IS        SELECT adv_fee.fee_mgmt_num,                ...

  4. 如何把thinkphp 的url改为.html

    ThinkPHP支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行.例如,我们设置'URL_HTML_SUFFIX ...

  5. pytorch更新

    Pytorch如何更新版本与卸载,使用pip,conda更新卸载Pytorch 2018年05月22日 07:33:52 醉雨轩Y 阅读数 19047   今天我们主要汇总如何使用使用ubuntu,C ...

  6. SSM整合 mybatis多条件查询与分页

    多条件查询与分页: 通过页面的houseName.floorage获取值传到前端视图(HouseSearchVO)实体类中的houseName,floorage建立houseSearchVO对象. 通 ...

  7. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  8. 2019-3-8-win10-uwp-渲染原理-DirectComposition-渲染

    title author date CreateTime categories win10 uwp 渲染原理 DirectComposition 渲染 lindexi 2019-03-08 09:18 ...

  9. js用for循环实现乘法口诀表

    for循环可以打印一个乘法口诀表.需要使用for循环的嵌套 <script> for(var i = 0; i <= 9; i++){ // 外层循环控制行数,外层循环执行一次,内层 ...

  10. 【9103】求n的累加和

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 用高精度方法,求s=1+2+3+...+n的精确值(n以一般整数输入) Input 文件输入仅一行,输入n ...