Java抽象类与接口的区别

转载自 Java抽象类与接口的区别

抽象类

抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。以JDK中的GenericServlet为例:

public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {// abstract methodabstract void service(ServletRequest req, ServletResponse res);void init() {// Its implementation}// other method related to Servlet
}
HttpServlet类继承GenericServlet时,它提供了service方法的实现:
public class HttpServlet extends GenericServlet {void service(ServletRequest req, ServletResponse res) {// implementation}protected void doGet(HttpServletRequest req, HttpServletResponse resp) {// Implementation}protected void doPost(HttpServletRequest req, HttpServletResponse resp) {// Implementation}// some other methods related to HttpServlet
}


接口

接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。以Externalizable接口为例

public interface Externalizable extends Serializable {void writeExternal(ObjectOutput out) throws IOException;void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}

当你实现这个接口时,你就需要实现上面的两个方法:

public class Employee implements Externalizable {int employeeId;String employeeName;@Overridepublic void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {employeeId = in.readInt();employeeName = (String) in.readObject();}@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeInt(employeeId);out.writeObject(employeeName);}
}

抽象类和接口的对比

参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有构造器 接口不能有构造器
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。

什么时候使用抽象类和接口

  • 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
  • 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
  • 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。

Java8中的默认方法和静态方法

Oracle已经开始尝试向接口中引入默认方法和静态方法,以此来减少抽象类和接口之间的差异。现在,我们可以为接口提供默认实现的方法了并且不用强制子类来实现它。这类内容我将在下篇博客进行阐述。

原文链接:  javacodegeeks  翻译:  ImportNew.com  jessenpan
译文链接:  http://www.importnew.com/12399.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gateway坑点:gateway有Controller时会直接处理对应的路径并返回

前言 使用gateway过程中,因为在gateway中加入了一个标注RestController的类,导致请求直接由gateway中的RestController的类处理并返回。花费了几小时才发现问题原因,特此记录 问题 以gateway作为网关转发请求得到的响应,所有字…

电脑任务栏跑到右边去了_电脑没有声音怎么解决 电脑没有声音解决方法【详解】...

电脑没有声音怎么办? 这个话题在我耳边已经听到过了无数次了,处理故障也是由以前的摸索解决到现在可以快速的找到原因。但对于新手朋友来说可能不知道从哪里入手,对于电脑没有声音怎么办,也给不出一个对策,今天围绕这个问题&…

rabbitmq-java生产者消费者

【README】 本文使用java 连接rabbitmq&#xff0c;模拟生产者&#xff0c;消费者场景 【1】项目搭建 1&#xff09;maven项目&#xff0c;依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance…

Java 8新特性——default方法(defender方法)介绍

转载自 Java 8新特性——default方法&#xff08;defender方法&#xff09;介绍 我们都知道在Java语言的接口中只能定义方法名&#xff0c;而不能包含方法的具体实现代码。接口中定义的方法必须在接口的非抽象子类中实现。下面就是关于接口的一个例子&#xff1a; 1 2 3 4 5 6 …

对于高并发的理解及实践方案

目录01 如何理解高并发&#xff1f;02 高并发系统设计的目标是什么&#xff1f;2.1标题宏观目标高并发绝不意味着只追求高性能&#xff0c;这是很多人片面的理解。2.2 微观目标2.2.1 性能指标2.2.2 可用性指标2.2.3 可扩展性指标03 高并发的实践方案有哪些&#xff1f;3.1 通用…

ubuntu ifconfig_Ubuntu 设置固定 IP 最简单的方法!

因为鼠标共享软件需要使用网络连接&#xff0c;台式机的 IP 总是变化导致笔记本每次重启都要重新配置 IP&#xff0c;所以我给 ubuntu 设置了固定 IP&#xff0c;方法很简单&#xff0c;直接再系统设置里面配置就可以了。1. 查看默认网络配置打开系统「Setting」&#xff0c;打…

rabbitmq-发布订阅模式

【README】 本文po出 mq的发布订阅模式&#xff0c;及代码示例&#xff1b; 【1】intro 1&#xff09; 角色&#xff1a; 有4个角色&#xff0c; 包括 生产者&#xff0c;消费者&#xff0c; 交换机 exchange&#xff08;X&#xff09;&#xff0c; 队列&#xff1b; 2&#…

深入Java类型信息:RTTI和反射

转载自 「深入Java」类型信息&#xff1a;RTTI和反射 1.RTTI Run-Time Type Infomation 运行时类型信息 为什么需要RTTI&#xff1f; 越是优秀的面向对象设计&#xff0c;越是强调高内聚低耦合&#xff0c;正如依赖倒转原则所说&#xff1a;“无论是高层模块还是低层模块&#…

设计费收费标准2002修订_@设计师,2019景观园林设计收费标准,注意查收!

From&#xff1a;景观邦(ID&#xff1a;LA_bang)一、设计费量的定制&#xff1a;设计费在10万以上的(包括10万)省外工程方能承接。其工作内容有:景观概念规划设计、方案设计、初步设计、施工图设计、效果图绘制及多媒体制作等。二、设计费的取费标准&#xff1a;居住区、道路、…

rabbitmq-路由模式-routingkey

【README】 本文po出 rabbitmq路由模式&#xff1b; 【1】intro to 路由模式 特点1&#xff09;队列与交换机的绑定&#xff0c;不能是任意绑定&#xff0c; 而是指定一个路由key-routingkey&#xff1b; 特点2&#xff09;消息的发送方向在向 exchange-交换机发送消息时&…

一文理清HashMap的实现及细节

前言 最近阅读了许多HashMap实现及源码分析的文章&#xff0c;特意此文记录HashMap的知识点。 HashMap 底层由 数组 链表 组成&#xff0c;在 jdk1.7 和 1.8 中具体略有不同。 JDK1.7的HashMap 数据结构&#xff1a;图片来源 核心成员变量 图片来源 初始化桶大小&…

java提高篇之详解内部类

转载自 java提高篇之详解内部类内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类&#xff0c;对内部类也只是略知一二)。第一次见面内部类我们从外面看是非常容易理解的&#xff0c;无非就是在一个类的内部在定义一个类。123456789101112…

rabbitmq-通配符模式

【README】 本文介绍 通配符模式&#xff0c;及代码示例 【1】intro to rabbitmq通配符模式 0&#xff09;通配符模式-交换机类型为 Topic&#xff1b; 1&#xff09;与路由模式相比&#xff0c;相同点是 两者都可以通过 routingkey 把消息转发到不同的队列&#xff1b; 不同…

中海达手部链接电脑安装软件_山东水文局:较大含沙量条件下中海达ADCP外接测深仪测流系统试验成功...

近日&#xff0c;黄委山东水文水资源局与中海达海洋公司联合&#xff0c;在黄河泺口水文站较大含沙量环境下进行了ADCP外接测深仪、GNSS测流试验&#xff0c;试验取得了圆满成功。泺口水文站简介1泺口水文站概况泺口水文站位于山东省济南市天桥区黄河泺口浮桥南岸&#xff0c;隶…

一文搞懂ThreadLocal及相关的内存泄露问题

首先&#xff0c;看一张整体的结构图&#xff0c;来帮助理解 什么是ThreadLocal ThreadLocal用于创建线程局部变量&#xff0c;如果创建一个ThreadLocal变量&#xff0c;那么访问这个变量的每个线程都会有这个变量的一个副本&#xff0c;在实际多线程操作的时候&#xff0c;…

resnet50加入fpn_FPN+SSD同时兼顾速度和精度的检测器(二)

本文首发于知乎专栏“人工智能从入门到逆天杀神”&#xff0c;本文以及本专栏所有算法源代码都可以在神力AI平台获取&#xff0c;如果你没有GPU但需要预训练模型或者你想获取更多开箱即用的AI算法&#xff0c;欢迎加入我们的会员&#xff0c;一杯咖啡即可带你入门AI&#xff0c…

Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)

转自&#xff1a; https://juejin.cn/post/6844903903130042376 文末有源代码&#xff0c;非常棒 摘要&#xff1a; 本篇博文是“Java秒杀系统实战系列文章”的第十篇&#xff0c;本篇博文我们将采用RabbitMQ的死信队列的方式处理“用户秒杀成功生成订单后&#xff0c;却迟…

主流Java数据库连接池比较及前瞻

转载自 主流Java数据库连接池比较及前瞻主流数据库连接池 常用的主流开源数据库连接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等 C3p0: 开源的JDBC连接池&#xff0c;实现了数据源和JNDI绑定&#xff0c;支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibern…

有序数组中查找第一个比target大的数

思路&#xff1a;二分法 时间复杂度&#xff1a;O(logn) 空间复杂度&#xff1a;O(1) 代码&#xff1a; public class Solution{public int search(int[] nums, int target){int lf0, rtn.length-1;while(lf<rt){int mid lf(rt-lf)/2;if(n[mid]>t){rt mid-1;}else{lf…

2020最新Java线程池入门(超详细)

转 https://blog.csdn.net/weixin_43893397/article/details/104361154 【1】代码示例 /*** 线程池测试-自定义线程池创建方式* since 2021/03/23 */ public class ThreadPoolMain2 {public static void main(String[] args) throws Exception {newMethod();}public static…