目录

1.抽象类

2.接口

3.抽象类与接口的联系与区别


1.抽象类

定义: 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

这么说可能不好理解,我们来换个说法: 抽象类无法被实例化,也就是我们不能去创建它的对象

例 : 动物类就是一个抽象类,因为你不能说出具体是哪种动物

再来看一个概念 : 抽象方法
• 抽象方法是一种特殊的方法:它只有声明,而没有具体的实现.
• 抽象方法必须用abstract关键字进行修饰.
例 :

public abstract void eat();

● 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法。
● 用abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。
那为什么抽象类不能被实例化,还会有构造方法呢?
这是因为 : 1. 构造方法具体是为类中属性赋值的,抽象类中是有属性的,我们调用构造为属性赋值
2. java规定类必须有构造方法,如果没有自行定义,那么就是无参的,如果没有构造方法,子类继承抽象类的时候,会先用super调用父类的构造,所以父类肯定得有构造
抽象类的用法 : 抽象类只能用作基类,表示的是一种继承关系。继承抽象类的非抽象类必须实现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一样。否则,该类也必须声明为抽象类。
注意: 1.继承一个抽象类必须重写里面的所有抽象方法,除非子类也是一个抽象类(例如鸟类继承动物类)
2. 抽象类中不一定有抽象方法, 但有抽象方法的类一定是抽象类
代码示例 :

public abstract class Animals {   //动物类int root;        //脚public Animals() {     //无参构造}public Animals(int root) {  //有参构造this.root = root;}public abstract void eat();  //抽象方法}

接着给出它的两个子类

public class Dog extends Animals{  //狗类public Dog(){super(4); //狗4只脚}@Overridepublic void eat() {      //重写eat方法System.out.println("狗吃狗粮");}}
public class Cat extends Animals{  //猫类public Cat() {super(4); //猫4只脚}@Overridepublic void eat() {System.out.println("猫吃猫粮");}
}

我们说,抽象类,抽象方法,在软件开发过程中都是设计层面的概念。也就是说设计人员会设计出抽象类,抽象方法,程序员都是来继承这些抽象类并覆盖抽象方法,实现具体功能

2.接口

接口的定义:使用 interface 关键字用来声明一个接口。

从本质上来讲,接口是一种特殊的抽象类,这种抽象类中只包含常量方法的定义,没有变量和方法的实现。也就是说,它里面只定义了一些功能,并没有实现,所以也不能被实例化

为什么会有接口?(接口存在的意义) : 因为类只能有一个父类,使用接口我们可以实现多继承这样的逻辑

接口的特性 : 
• 接口中方法可以是抽象的,静态的,默认的.声明的属性默认为 public static final 的;
• 接口不是被类继承了,而是要被类实现。
• 接口不能实例化对象(无构造方法),但可以声明对象的引用。(多态性)
• 多个类可以实现同一个接口。
• 一个类可以实现多个接口,但只能继承一个类。
• 与继承关系类似,接口与实现类之间存在多态性。
一个接口能继承其它多个接口
• 当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
       另外, 在jdk 8 之后 ,我们可以在接口中声明一个default(默认)方法,在类实现这个接口的时候,接口中这个默认的方法也会被继承进类,供我们使用
例 : 我们在上面抽象类 animals 的两个子类里来实现一个接口
定义接口 : 
public interface Things {     //接口final int count = 10;   //常量void sleep(); //抽象方法default void setA(){  //默认方法System.out.println("默认功能");}}

两个子类实现 :

public class Dog extends Animals implements Things{  //狗类@Overridepublic void eat() {System.out.println("狗吃狗粮");}@Overridepublic void sleep() {System.out.println("狗睡狗窝");}}
public class Cat extends Animals implements Things{  //猫类@Overridepublic void eat() {System.out.println("猫吃猫粮");}@Overridepublic void sleep() {System.out.println("猫睡猫窝");}}

测试 :

    public static void main(String[] args) {Dog dog = new Dog();dog.sleep();dog.setA();System.out.println(dog.count);System.out.println("-------------------");Cat cat = new Cat();cat.sleep();cat.setA();System.out.println(cat.count);}

运行结果 : 

3.抽象类与接口的联系与区别

抽象类 与 接口 中都可以定义抽象方法,这些方法都是没有方法体的,也就是需要我们去继承或者实现对应的抽象类或者接口,然后重写这个方法,也就是定义功能

而我们的类只能有一个父类,所以接口的出现,无疑解决了这种单继承的局限性,类是可以去实现多个接口的

另外,抽象类中可以定义普通的方法,接口中也可以定义default方法

什么是抽象类,接口?他们的区别?(详解)相关推荐

  1. axios请求接口http_使用axios请求接口,几种content-type的区别详解

    axios的使用 安装(一般使用框架的话, 脚手架都集成了) $ npm install axios 请求示例 // POST axios.post('/user', { firstName: 'Fr ...

  2. HashTable和HashMap的区别详解

    HashTable和HashMap的区别详解 一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同 ...

  3. OpenGL,GLUT,FreeGLUT,GLFW,GLEW,GLAD,GL3W,GLAD,GLM,GLSL的区别详解

    OpenGL,GLUT,FreeGLUT,GLFW,GLEW,GLAD,GL3W,GLAD,GLM,GLSL的区别详解 很多同学在初学计算机图形学时,都要去配置OpenGL环境,其中涉及多个库的选择和 ...

  4. 串口、COM口、UART口, TTL、RS-232、RS-485区别详解

    目录 一.什么是串口.COM口.UART口, TTL.RS-232.RS-485 摘要: 1.串口.COM口解释: 2.实物照片及解释 二.TTL.RS-232.RS-485的电平形式 1.TTL介绍 ...

  5. java和c++的区别_JAVA和C++区别详解

    JAVA和C++区别详解 来源:-- 作者:-- 浏览:811 时间:2016-08-10 14:18 标签: 摘要: 1)java是解释性语言,java程序在运行时类加载器从类路经中加载相关的类,然 ...

  6. python for item in items,python 字典item与iteritems的区别详解

    综述迭代器 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值).但对于无法 ...

  7. [ASP.NET]ASP.NET中的Inherits、CodeFile、CodeBehind的区别详解及OWIN及IDENTITY

    篇一 : ASP.NET中的Inherits.CodeFile.CodeBehind的区别详解 Inherits.CodeFile.CodeBehind 在 ASP.NET 中使用代码隐藏方法来设计W ...

  8. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  9. 关于numpy中eye和identity的区别详解

    https://www.jb51.net/article/175386.htm np.identity(n, dtype=None) np.eye(N, M=None, k=0, dtype=< ...

最新文章

  1. android 自定义 styleable 属性
  2. NSURLConnection 实现webView显示HTTPS页面
  3. php 5w的并发需要多少台服务器_php使用异步编程是怎样的?
  4. Qt关于Tcp通信步骤的总结
  5. matlab 价格统计,matlab中的金融数据统计
  6. Windows下Nginx的启动、停止等基本命令
  7. sql GROUP BY子句使用实例
  8. 卡尔曼滤波的理解、推导和应用
  9. nyoj-155-求高精度幂(java大数)
  10. mysql实现自动更新时间戳
  11. SQL SERVER 获得当前系统时间
  12. Sharepoint Solution Gallery Active Solution时激活按钮灰色不可用的解决方法
  13. ubuntu屏幕截图工具
  14. 历史库存sap_SAP历史库存MB5B的详解
  15. 美年旅游_自由行_自由行分页PageHelper
  16. java web 图片 加载_Java web开发中加载图片路径的两种方式
  17. android 平板z97,高清配置 翰智Z97-W通话版平板评测
  18. NTL密码算法开源库——大整数ZZ类(四)
  19. 微信公众号通过第三方平台完成授权
  20. JAVA实现Doc与Docx互转

热门文章

  1. python代码写名字_python代码实现给儿子儿女取名字
  2. 视频教程-老孙的游戏课 第6篇 生存射手-Unity3D
  3. xshell突然连接不上
  4. 黑苹果 10G 网卡(intel Aquantia)解决方案及big sur 11.x 下驱动方式
  5. 职场饭局上被别人夸奖,该如何回复才能不尬场?|智测优聘总结
  6. 移动文件夹ubuntu
  7. 但得有心能自奋,何愁他日不雄飞
  8. Python 写入csv中文乱码问题
  9. 亲身经历!4个月写完硕士毕业论文一稿过,我是如何做到的?
  10. 创建存储过程create procedure