【java基础 16】抽象类和接口的区别
导读:前两天闲着没事儿,看了本书,然后写了点代码,在接口里面写了默认方法实现,因为书上说这个特性是从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】抽象类和接口的区别的更多相关文章
- java基础之抽象类与接口的区别
在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...
- java基础之抽象类和接口的区别
抽象类和接口的区别 A:成员区别 抽象类: 成员变量:可以是变量,也可以是常量 构造方法:有 成员方法:可以是抽象方法,也可以是非抽象方法 接口: 成员变量:只能是静态常量(不写修饰符,默认是 sta ...
- 3、java基础:抽象类与接口的区别
抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...
- Java基础之抽象类与接口
Java基础之抽象类与接口 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候 ...
- java基础(四)-----抽象类与接口
抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 一.抽象类 我们 ...
- 程序猿的日常——Java基础之抽象类与接口、枚举、泛型
再次回顾这些基础内容,发现自己理解的又多了一点.对于一些之前很模糊的概念,渐渐的清晰起来. 抽象类与接口 抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化.接口仅仅是描述 ...
- JAVA基础知识|抽象类与接口类
一.抽象类 抽象类:拥有抽象方法的类就是抽象类,抽象类要使用abstract声明 抽象方法:没有方法体的方法,必须要使用abstract修饰 为什么要使用抽象类,抽象方法? 举例来说,如果你定义了一个 ...
- Java基础之抽象类和接口
今天来说说抽象类和接口的实现以及它们的区别.我们知道抽象类和接口都是对具体事物的抽象,接口在实现上比抽象类更加抽象,抽象类中可以有普通方法和变量,而接口中只有抽象方法和不可变常量.但是从另一个角度看, ...
- java基础之抽象类与接口的形式参数和返回值
抽象类与接口形式参数和返回值问题 1.形参问题 /* 1.形式参数: 基本类型(太简单,不是我今天要讲解的) 引用类型 (1)类名:(匿名对象的时候其实我们已经讲过了) 需要的是该类的对象 (2)抽象 ...
- Java 基础:抽象类与接口
1.什么是抽象 当父类的某些方法不确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract来修饰该类[抽象类]. 我们都知道,父类是将子类所共同拥有的属性和方法进行抽取,这些属 ...
随机推荐
- Ruby菜鸟入门指南
写这篇文章的初衷源于我的伙伴们在上手Ruby过程中,表现实在是太让人拙计了.由于项目的急功近利,需要迅速入门Ruby并上手项目.所以很多开发者在实际开发过程中,不熟悉Ruby的表达方式,也会沿用其他语 ...
- jspscriptlet标签
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...
- 二、antd pro 删除eslint检测
删除package.json 里 " pre-commit": "npm run lint-staged" 这个对象就可以.
- 使用ErrorProvider组件验证文本框输入
实现效果: 知识运用: ErrorProvider组件的BlinkStyle属性 //指示错误图标的闪烁时间 public ErrorBlinkStyle BlinkStyle{ get;set; } ...
- targetcli save error
iscsi configuration unable to save python error “ValueError: 'Implict and Explict' is not in list” / ...
- 面向对象OO第一单元三次作业总结
(一)第一单元的作业围绕着多项式的求导,从简单到复杂,主要的要求是 作业一:只有两种格式的因子:带符号整数(+02)和幂函数(x^+02). 作业二:在作业一的基础上添加了:sin(x)和cos(x) ...
- 《剑指offer》51:数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000 ...
- NOIP2018
非常糟糕.从未意识到过考场debuff这么严重. 果不其然,高档选手强如txc实力AK:而像我这样的中档选手就是重在考场发挥和自我调整了吧. 究竟要付出多少代价才能领会一个教训 看来要尝试更自闭一点
- pandas中数据聚合【重点】
数据聚合 数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值. 数据分类处理: 分组:先把数据分为几组 用函数处理:为不同组的数据应用不同的函数以转换数据 合并:把不同组得到的结果合 ...
- 如何使用jmeter做接口测试
1.传参:key=value形式 2.传参:json格式 3.jmeter上传文件 4.jmeter传cookie 或者使用 HTTP Cookie管理器