什么是抽象类,接口?他们的区别?(详解)
目录
1.抽象类
2.接口
3.抽象类与接口的联系与区别
1.抽象类
定义: 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
这么说可能不好理解,我们来换个说法: 抽象类无法被实例化,也就是我们不能去创建它的对象
例 : 动物类就是一个抽象类,因为你不能说出具体是哪种动物
public abstract void eat();
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 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方法
什么是抽象类,接口?他们的区别?(详解)相关推荐
- axios请求接口http_使用axios请求接口,几种content-type的区别详解
axios的使用 安装(一般使用框架的话, 脚手架都集成了) $ npm install axios 请求示例 // POST axios.post('/user', { firstName: 'Fr ...
- HashTable和HashMap的区别详解
HashTable和HashMap的区别详解 一.HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同 ...
- OpenGL,GLUT,FreeGLUT,GLFW,GLEW,GLAD,GL3W,GLAD,GLM,GLSL的区别详解
OpenGL,GLUT,FreeGLUT,GLFW,GLEW,GLAD,GL3W,GLAD,GLM,GLSL的区别详解 很多同学在初学计算机图形学时,都要去配置OpenGL环境,其中涉及多个库的选择和 ...
- 串口、COM口、UART口, TTL、RS-232、RS-485区别详解
目录 一.什么是串口.COM口.UART口, TTL.RS-232.RS-485 摘要: 1.串口.COM口解释: 2.实物照片及解释 二.TTL.RS-232.RS-485的电平形式 1.TTL介绍 ...
- java和c++的区别_JAVA和C++区别详解
JAVA和C++区别详解 来源:-- 作者:-- 浏览:811 时间:2016-08-10 14:18 标签: 摘要: 1)java是解释性语言,java程序在运行时类加载器从类路经中加载相关的类,然 ...
- python for item in items,python 字典item与iteritems的区别详解
综述迭代器 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值).但对于无法 ...
- [ASP.NET]ASP.NET中的Inherits、CodeFile、CodeBehind的区别详解及OWIN及IDENTITY
篇一 : ASP.NET中的Inherits.CodeFile.CodeBehind的区别详解 Inherits.CodeFile.CodeBehind 在 ASP.NET 中使用代码隐藏方法来设计W ...
- java mod %区别_Java中 % 与Math.floorMod() 区别详解
%为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...
- 关于numpy中eye和identity的区别详解
https://www.jb51.net/article/175386.htm np.identity(n, dtype=None) np.eye(N, M=None, k=0, dtype=< ...
最新文章
- android 自定义 styleable 属性
- NSURLConnection 实现webView显示HTTPS页面
- php 5w的并发需要多少台服务器_php使用异步编程是怎样的?
- Qt关于Tcp通信步骤的总结
- matlab 价格统计,matlab中的金融数据统计
- Windows下Nginx的启动、停止等基本命令
- sql GROUP BY子句使用实例
- 卡尔曼滤波的理解、推导和应用
- nyoj-155-求高精度幂(java大数)
- mysql实现自动更新时间戳
- SQL SERVER 获得当前系统时间
- Sharepoint Solution Gallery Active Solution时激活按钮灰色不可用的解决方法
- ubuntu屏幕截图工具
- 历史库存sap_SAP历史库存MB5B的详解
- 美年旅游_自由行_自由行分页PageHelper
- java web 图片 加载_Java web开发中加载图片路径的两种方式
- android 平板z97,高清配置 翰智Z97-W通话版平板评测
- NTL密码算法开源库——大整数ZZ类(四)
- 微信公众号通过第三方平台完成授权
- JAVA实现Doc与Docx互转