用了java这么久,对接口和抽象类使用一直很模糊。为什么接口和抽象类不能实例化,为什么接口可以多个实现而抽象类只能单继承,特别是java8之后,抽象类和接口里面都可以写代码后,就更加分不清了,今天重新整理一下。

什么是抽象类(abstract class)

使用abstract修饰符修饰的类。官方点的定义就是:如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就是抽象类。

实际点来说,一个抽象类不能实例化,因为“没有包含足够多的信息来描述一个具体的对象”。但终归属于类,所以仍然拥有普通类一样的定义。依然可以在类的实体(直白点就是能在{}里面)定义成员变量,成员方法,构造方法等。

那么可能初学者会问:既然不能实例化,那么在类里面定义成员方法,成员变量有什么用。

抽象类在实际应用中,更多的是因为类中有抽象方法。抽象方法:只声明,不实现。具体的实现由继承它的子类来实现。实际点就是:被abstract修饰的方法,只有方法名没有方法实现,具体的实现要由子类实现。方法名后面直接跟一个分号,而不是花括号。例如:

abstract class Animal{public abstract void run();
}class Person extends Animal{@Overridepublic void run() {System.out.println("Person.run");}
}

一个类中含有抽象方法(被abstract修饰),那么这个类必须被声明为抽象类(被abstract修饰)。

什么是接口(interface)

官方定义:接口在java中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而继承接口的抽象方法。

从定义上看,接口是个集合,并不是类。类描述了属性和方法,而接口只包含方法(未实现的方法)。接口和抽象类一样不能被实例化,因为不是类。但是接口可以被实现(使用 implements 关键字)。实现某个接口的类必须在类中实现该接口的全部方法。虽然接口内的方法都是抽象的(和抽象方法很像,没有实现)但是不需要abstract关键字。

接口中没有构造方式(因为接口不是类)

接口中的方法必须是抽象的(不能实现)

接口中除了static、final变量,不能有其他变量

接口支持多继承(一个类可以实现多个接口)

例如:

声明两个职业 接口:

public interface ItWorker {String name = "worker";public void coding();
}
public interface Teacher {String name = "teacher";public void teaching();
}

Person实现两种职业接口:

public class Person implements ItWorker,Teacher{@Overridepublic void coding() {System.out.println("I'm a"+ItWorker.name);}@Overridepublic void teaching() {System.out.println("I'm a"+Teacher.name);}}

抽象类和接口有什么意义

对于接口

接口的最主要的作用是达到统一访问,就是在创建对象的时候用接口创建,【接口名】 【对象名】=new 【实现接口的类】,这样你像用哪个类的对象就可以new哪个对象了,不需要改原来的代码,就和你的USB接口一样,插什么读什么,就是这个原理。

对于接口的作用,在一些小的项目上,很难看出其发挥的优势。这就使一些经常的做小项目的开发人员,做时间久了就感觉不到它有什么好的,有时候写起来还麻烦,干脆不用了。其实,在一些大项目上,接口的作用是发挥地相当的明显的。

比如:如果你开发业务逻辑代码,当你好不容易的实现了它全部的功能,突然用户需求要改,你在修改你代码的同时,调用你代码的其它人也会改,如果代码关联性强的话,会有很多人都要改动代码,这样一来二去,程序会变得相当的不稳定,而且可能还会出现更多的新Bug,所有人都可能会陷入混乱。

但如果使用接口的话,在你使用它之前,就要想好它要实现的全部功能(接口实际上就是将功能的封装)。确定下这个接口后,如果用户需求变了,你只要重新写它的实现类,而其它人只会调用你的接口,他不管你是怎么实现的,它只需要接口提供的功能。这样,很可能只需要把你的代码修改就可以了,其他人什么都不用做。

同时:这样做的话,使得开发人员能够分工明确,只要确定下来接口了,就可以同时进行开发,提高开发效率。另外,使用接口还有使用方便,可读性强,结构清晰
等优点。

对于抽象类

一般来说我们使用普通类来实现接口,这个普通类就必须实现接口中所有的方法,这样的结果就是普通类中就需要实现多余的方法,造成代码冗余。但是如果我们使用的是抽象类来实现接口,那么就可以只实现接口中的部分方法,并且当其他类继承这个抽象类时,仍然可以实现接口中有但抽象类并未实现的方法。

总结

我们可以把接口看成一个工具,当我们实现一个接口时,就意味着能使用这一工具,当我们实现多个接口时,就能使用多种工具,就像上面Person可以是多种职业,所以它可以同时实现Teacher和ItWorker接口。

而抽象类则可以看成是一个祖先,所以一个类只能继承一个祖先,如上Animal是Person的祖先,所以Person具有Animal的一切属性。

java抽象类和接口有什么意义相关推荐

  1. 没有体现JAVA接口功能_深入浅出分析Java抽象类和接口【功能,定义,用法,区别】...

    本文实例讲述了Java抽象类和接口.分享给大家供大家参考,具体如下: 对于OOP编程来说,抽象是它一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:抽象类和接口. 这两者有相似之处也有很 ...

  2. java抽象类和接口_Java抽象类和接口类

    Java中接口和抽象类的区别是什么?什么时候用接口?什么时候用抽象类?抽象类和接口存在的意义是什么?能解决哪些编程问题? 1)类关键字修饰符: 抽象类使用abstract修饰,含有抽象方法(使用abs ...

  3. java定义一个door的类_再探Java抽象类与接口的设计理念差异

    原文:http://blog.csdn.net/sunboard/article/details/3831823 1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是 ...

  4. JAVA抽象类和接口的深入探讨

    Java 语言中,抽象类(abstract class) 和接口(interface) 是抽象思想的两种体现形式.初学者很容易把这两者搞混,所以Java面试中考抽象类和接口的区别的面试题也常有出现的. ...

  5. java 抽象类和接口2--什么时候用接口什么时候用抽象类

    java 抽象类和接口1–基本概念 https://blog.csdn.net/qq_26296197/article/details/81315685 从生活的角度看 把编程映射会日常生活进行对照, ...

  6. JAVA学习经验--总结JAVA抽象类和接口

    * --总结JAVA抽象类和接口  * 1.抽象类:  *             1>抽象类可以修饰方法,修饰类,但不能修饰属性,不能被实例化  *             2>抽象类可 ...

  7. java接口vm和dto的区别_第十八节:详解Java抽象类和接口的区别

    前言 对于面向对象编程来说,抽象是它的特征之一. 在Java中,实现抽象的机制分两种,一为抽象类,二为接口. 抽象类为abstract class,接口为Interface. 今天来学习一下Java中 ...

  8. JAVA抽象类和接口类的区别

    JAVA抽象类和接口类的区别 1.声明方式不同.抽象类为abstract class,接口类为interface. 2.继承抽象类关键字为extends,实现接口关键字为implements. 3.继 ...

  9. 再探Java抽象类与接口的设计理念差异

    Java抽象类与接口都可以实现功能与实现的分离,都对多态提供了很好的支持,那么我们什么时候应该使用抽象类或接口呢?在以前的一篇文章初探Java抽象类与接口中谈到了他们语法的区别,在博客通过模板方法模式 ...

最新文章

  1. tableau可视化数据分析60讲(二)-tableau入门篇之各模块功能介绍
  2. 有赞客户行为收集与实时处理系统设计
  3. 万维网服务器协议提供web,万维网的HTTP和FTP协议.doc
  4. 判断android图片是否硬解码(方法)
  5. mysql数据库特征_如何掌握MySQL数据库中动态表的特征
  6. 电子科大16秋计算机应用基础在线作业一,电子科大16秋《计算机应用基础(本科)》在线作业3...
  7. 关于“服务器提交了协议冲突. Section=ResponseStatusLine问题
  8. mr图像翻转的原因_MR成像技术讲解
  9. PAT乙级1028 人口普查 (20 分)
  10. 当子元素设置position absolute的时,父元素必须设置position属性
  11. 简单易用的国产GIS工具软件
  12. 维控触摸屏编程手册_维控触摸屏AB PLC地址编辑说明
  13. 我的世界服务器哪个有自动铺路,我的世界自动铺路指令是什么
  14. android访问服务器405,android
  15. 乌镇互联网大会:马化腾强势宣布,明年将推“VR微信”
  16. L1、L2正则regularization和weight decay
  17. idgenerator 会重复吗_随机 ID 生成器
  18. 电脑进入pe时蓝屏_进PE蓝屏的几个原因
  19. matlab 汉字是方块,linux下Matlab 2020中文字体方框问题解决方法
  20. p2p sdk接收文件服务端epoll模型源码

热门文章

  1. 手机如何打开c语言文件类型,Android中如何使用代码打开各种类型的文件
  2. 【JAVA黑马程序员笔记】四 P314到P384(特殊流、多线程编程、网络编程模块、lambda表达式、接口组成更新、方法引用、函数式接口)
  3. 交换机或路由器的配置模式
  4. Error 1267 Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT
  5. matlab学习-第五章-代数方程求解和其它符号工具
  6. pandas对dataframe的两列取交集并集
  7. 短视频类APP盈利与开发模式个人拙见
  8. 微博实名制下的新商规
  9. 搭建ELK日志分析系统详解
  10. 关于HTML中下拉框的一些属性