导读:前两天闲着没事儿,看了本书,然后写了点代码,在接口里面写了默认方法实现,因为书上说这个特性是从java8开始的,我还特地给测了一下java7. 没过几天,就有一个技术分享会,刚好也是讲java8特性,然后,顿时就觉得世界观被毁了!怎么回事呢,看下文吧:

还记得,当年我刚面试的时候,面试官问我接口和抽象类什么区别,我张口就来了传说中的标准答案,那时候是解释不清楚接口和抽象类各自的用途的和来源的,就记得我说了很重要的一条就是:抽象类里面可以有方法实现,而接口是不可以的。哈哈哈哈,java8出来之后,我竟无言以对!

一、基本概念

1.1,抽象类

从语义的角度来看,抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象,体现了is-a的逻辑。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类设计的随意性。

从根本上来说,抽象类体现的是一种模板模式的设计,它作为子类的通用模板,允许其子类在它的基础上扩展、改造,但是,子类总体上会大致保留抽象类的行为方式!(就跟个如来佛似的,孙悟空那么厉害,我允许你蹦跶蹦跶蹦,但你这猴子,还得听我的是不)

1.2,接口

抽象类是从多个类中抽象出来的模板,将抽象更进一步,就可以折腾出一个更高逼格的别样“抽象类”——接口!体现了has-a的逻辑。

接口定义了某一批类所需要遵守的规范,它并不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,满足实际需要。它体现的是一种规范和实现向分离的设计哲学。

八卦模式:接口让我想起了邓爷爷的一句话:管他黑猫白猫,抓到耗子就是好猫!接口就是这样子的一个体现:管你动物类植物类,接口实现了就是好的! 要是当年如来佛公布一个去西天的接口,然后定义了一个取经的方法,会发生什么?  (群魔乱舞,各显神通,但是这妖魔神仙多了,嘿嘿。。。。) 拿要是他老人家公布的是一个去西天的抽象类,然后定义了一个取经的方法,又会发生什么?

二、思考过程

2.1,体现在内存分配

因为接口里面只能是类成员变量、类方法或默认方法、内部类等,而抽象类里面的变量和方法可以是实例成员变量或方法。我就在想,如果使用接口的话,那么方法和变量势必会在JVM启动时,就会被加载分配到内存,从而增加程序启动的开销,反之抽象类就不一样了。   不过,我这个想法被否了,说是现在的虚拟机经过一带一带的改进,从这个角度上来说,使用接口和抽象类的内存影响差不多!除非我刻意写了坏味道的代码。。。本宝宝表示不懂啊

2.2,体现在多继承

因为一个类可以同时实现很多个接口,而一个类不可以同时继承多个类

2.3,体现在访问控制层面

又回到了接口可用的访问控制,方法只能是静态或默认,变量只能是静态 final等,而接口默认的访问控制是public。反之抽象类,可以是public、private、protected等!

知道我为什么这么纠结这个抽象类和接口的区别吗?因为从java8出来之后,有人问你觉得抽象类还有存在的必要吗,抽象类可以实现的,接口都可以做到!然后,那时我还是个宝宝,但后来越想越不对,所谓存在即合理对吧!

三、主要异同点

3.1,相同点

1,都不能被实例化,位于继承树的顶端,用于被其他类实现和继承

2,都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法

3.2,不同点

1,目的和作用不同

接口是系统与外界交互的窗口(模块或系统之间提供服务窗口,有听说是调用抽象类的不?)它体现的是一种规范。对于接口的实现者,它规定了实现者必须提供的服务;对于接口的调用者,它则规定了调用者可以调用的服务,以及如何调用这些服务。当在一个程序中使用接口时,接口时多个模块间的耦合标准;当在多个程序中时,它就是多个程序之间的通信标准。

抽象类是系统中多个子类的共同父类,它可以被当成系统实现过程中的中间产品,这个产品已经实现了系统的部分功能,但它并不是一个成熟的产品,必须由其子类去进一步完善!

PS:有没有感觉接口的设计层面和抽象类不一样?想一想机房收费系统,接口可以作为独立的一层去设计,而没有抽象类层!

2,在用法上不同

抽象类可以包含普通方法;接口不能定义静态方法(注意区别java8接口可以有静态和默认方法实现);抽象类可以定义普通成员变量;抽象类可以拥有构造器,让其子类利用它完成抽象类的初始化操作;接口无法拥有初始化块;接口可以弥补java单继承的不足。

四、总结

我总觉得抽象类和接口比起来,接口更好用,先不说抽象类继承破坏了父类的封装性(用组合模式解决)再着就是目前的使用过程中得到的体会,比如说Animal A=new Dog();这个向上转型,还有就是如果程序真的出了点问题需要改的话,那么势必也会改到这一行代码,现在Spring容器通过IOC创建对象,这个可能就不算事儿了!

【java基础 16】抽象类和接口的区别的更多相关文章

  1. java基础之抽象类与接口的区别

    在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...

  2. java基础之抽象类和接口的区别

    抽象类和接口的区别 A:成员区别 抽象类: 成员变量:可以是变量,也可以是常量 构造方法:有 成员方法:可以是抽象方法,也可以是非抽象方法 接口: 成员变量:只能是静态常量(不写修饰符,默认是 sta ...

  3. 3、java基础:抽象类与接口的区别

    抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...

  4. Java基础之抽象类与接口

    Java基础之抽象类与接口 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候 ...

  5. java基础(四)-----抽象类与接口

    抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 一.抽象类 我们 ...

  6. 程序猿的日常——Java基础之抽象类与接口、枚举、泛型

    再次回顾这些基础内容,发现自己理解的又多了一点.对于一些之前很模糊的概念,渐渐的清晰起来. 抽象类与接口 抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化.接口仅仅是描述 ...

  7. JAVA基础知识|抽象类与接口类

    一.抽象类 抽象类:拥有抽象方法的类就是抽象类,抽象类要使用abstract声明 抽象方法:没有方法体的方法,必须要使用abstract修饰 为什么要使用抽象类,抽象方法? 举例来说,如果你定义了一个 ...

  8. Java基础之抽象类和接口

    今天来说说抽象类和接口的实现以及它们的区别.我们知道抽象类和接口都是对具体事物的抽象,接口在实现上比抽象类更加抽象,抽象类中可以有普通方法和变量,而接口中只有抽象方法和不可变常量.但是从另一个角度看, ...

  9. java基础之抽象类与接口的形式参数和返回值

    抽象类与接口形式参数和返回值问题 1.形参问题 /* 1.形式参数: 基本类型(太简单,不是我今天要讲解的) 引用类型 (1)类名:(匿名对象的时候其实我们已经讲过了) 需要的是该类的对象 (2)抽象 ...

  10. Java 基础:抽象类与接口

    1.什么是抽象 当父类的某些方法不确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. 我们都知道,父类是将子类所共同拥有的属性和方法进行抽取,这些属 ...

随机推荐

  1. 【Python图像特征的音乐序列生成】GitHub已经有人将mingus改到了Python3版本

    https://github.com/bspaans/python-mingus/issues/45 注意此时的安装方法应该是: git clone https://github.com/edudob ...

  2. 2018.4.8 Mac/Win 破解StartUml软件

    Mac破解 在桌面选择前往----前往文件夹-----输入"/应用程序/StarUML.app/Contents/www/license/node/LicenseManagerDomain. ...

  3. epoch,iteration,batch,batch_size

    epoch:训练时,所有训练图像通过网络训练一次​(一次前向传播+一次后向传播):测试时,所有测试图像通过网络一次​(一次前向传播).Caffe不用这个参数. batch_size:1个batch包含 ...

  4. exportfs: /mnt/demo requires fsid= for NFS export

    解决方法:/mnt/demo 10.0.1.57(fsid=0,rw,async) //加入fsid=0参数就可.

  5. javaweb基础(23)_jsp自定义标签

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  6. 功能强大的CURL

      linux下的curl,有着非同一般的魔力,有人称它为下载工具,我更倾向于叫它“文件传输工具”因为它好像无所不能.从常见的 FTP, HTTP, TELNET, 等协议,还支持代理服务器,cook ...

  7. C语言单链表的实现

    // //  main.c //  gfhjhgdf // //  Created by chenhao on 13-12-23. //  Copyright (c) 2013年 chenhao. A ...

  8. 基于matlab的蓝色车牌定位与识别---识别

    接着昨天的工作,把最后一部分识别讲完. 关于字符识别这块,一种最省事的办法是匹配识别,将所得的字符和自己的标准字符库相减,计算所得结果,值最小的即为识别的结果.不过这种方法是在所得字符较为标准的情况, ...

  9. nginx日志相关优化安全

    一.编写脚本实现nginx access日志轮询 配置日志切割脚本,如下: [root@nginx shell]# cat cut_nginx_log.sh #!/bin/bash #Author:M ...

  10. 实验二 JSP基本动态元素的使用

    实验二  JSP基本动态元素的使用 实验性质:验证性          实验学时:  2学时      实验地点: 一 .实验目的与要求 1.掌握JSP中声明变量.定义方法.java程序片及表达式的使 ...