接口和抽象有什么区别?

接口和抽象是 Java 面向对象设计的两个基础机制。

接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到API 定义和实现分离的目的

  • 接口不能实例化,
  • 接口不能包含任何非常量成员,任何 field 隐含 public field final的意义
  • 非静态方式实现,要么是抽象方法,要么是静态方法。

抽象类不能实例化,用 abstract 关键字修饰 class, 其主要目的是代码重用

  • 抽象类和普通 Java 类在形式上没有太大区别。 可以有一个或者多个抽象方法,- 抽象类大多用于抽取 Java 类共用方法实现或者共同成员变量。然后通过继承的方式到达代码复用的目的。

接口和抽象区别

  • 接口 Java 类实现 interface 使用 implements 关键词
  • 继承 抽象类是使用 extends 关键词
  1. 支持多重继承:接口支持;抽象类不支持;类不支持;
  2. 支持抽象函数:接口语义上支持;抽象类支持;类不支持;
  3. 允许函数实现:接口不允许;抽象类支持;类允许;
  4. 允许实例化:接口不允许;抽象类不允许;类允许;
  5. 允许部分函数实现:接口不允许;抽象类允许;类不允许。
  6. 定义的内容:接口中只能包括public函数以及public static final常量;抽象类与类均无任何限制。
  7. 使用时机:当想要支持多重继承,或是为了定义一种类型请使用接口;

当打算提供带有部分实现的“模板”类,而将一些功能需要延迟实现请使用抽象类;当你打算提供完整的具体实现请使用类。

public class ArrayLis extends AbsractLis implements Lis, RandomAccess, Cloneable, java.io.Serializable{      //...}

抽象的极限性

Java 不支持多继承。 Java 类可以实现多个接口,因为接口是抽象方法的集合,采用声明抽象方法的方式,但是并不能通过扩展多个抽象类来重用逻辑。

还有一些场景,需要抽象与具体实例化无关的通用逻辑,比如 Utils 类,但是如果采用抽象类,这样就存在单继承的问题。

面向对象设计

面向对象的基本要素:封装,继承,多态。

  • 封装的目的是隐藏事务内部的实现细节,以便提高安全性和简化编程。封装提供了合理边界,避免外部调用者接触内部细节。比如,多线程编程是,暴露内部状态,冗余导致并发修改的问题。
  • 继承是代码复用的基础机制,继承是一种紧耦合的关系,父类代码修改,子类行为会跟着变动。如果过度滥用,会起到不好的效果。
  • 多态,说到多态,会立即想到重写(override) 和重载 (overload),向上转型。
  1. 重写是父子类中相同名字和参数的方法,不同的实现。
  2. 重载是相同名字方法,但是不同的参数。

要注意的是 方法名称和参数一致,但是返回值不同,这样不是重载,编译会报错!!!

public int doSomething() {    return 0;}// 输入参数不同,意味着方法签名不同,重载的体现public int doSomething(Lis srs) {  return 0;}// return类型不一样,编译不能通过public short doSomething() {   return 0;}

面向对象设计原则

  • 单一职责原则 , 类或者对象最好是单一职责,如果发现某个类中承担着多种义务,可以考虑拆分重构。
  • 开闭原则,对扩展是开放的,但是对修改是关闭的。程序设计应保证平滑的扩展性,尽量避免因为新增同类功能而修改已实现。 这样可以减少回归问题。(回归测试)。
  • 里式转换原则, 进程继承抽象时,凡是可以用父类或者基类的地方,都可以用子类转换。简单的说,子类对象可以赋给父类对象,但父类对象不能赋值给子类对象。
  • 接口分离原则,在进行类和接口设计时,如果在一个接口中定义了太多方法,子类可能只需要实现其中部分方法,这样就破坏了程序的内聚性,可采用接口分离方式,进行解耦。这样实现了高内聚,低耦合。
  • 依赖反转,实体应该依赖于抽象而不是实现。也就是说,高层次模块,不应该依赖低层次模块。而是基于抽象接口。抽象接口不应该依赖具体,而具体要依赖于抽象。
 interface Coder {        void wearSweater(Sweater sweater);  }  class XiaoMing implements Coder{      @Override      public void wearSweater(Sweater sweater) {      }  }  interface Sweater {  }  class TneckSweater implements Sweater {  }Coder xiaoming = new XiaoMing();Sweater tneckSweater = new TneckSweater();xiaoming.wearSweater(tneckSweater);  

依赖反转

开闭原则改造如下代码:

public class VIPCenter {    void serviceVIP(T extend User user>) {        if (user insanceof SlumDogVIP) {            // 穷X VIP,活动抢的那种            // do somthing         } else if(user insanceof RealVIP) {           // do somthing        }        // ...}

修改关闭,扩展开放的原则:

public class VIPCenter {    private Map providers;       void serviceVIP(T extend User user) {          providers.get(user.getType()).service(user);       }}interface ServiceProvider{       void service(T extend User user) ;}class SlumDogVIPServiceProvider implements ServiceProvider{        void service(T extend User user){              // do somthing        }}class RealVIPServiceProvider implements ServiceProvider{        void service(T extend User user) {             // do something         }}

本文使用 mdnice 排版

idea重写接口没有@override_接口和抽象有什么区别?相关推荐

  1. idea重写接口没有@override_乐字节|Java8核心实战-接口默认方法

    JAVA8已经发布很久,是自java5(2004年发布)之后Oracle发布的最重要的一个版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性,对于国内外互联网公司来说,Java8是以后技术 ...

  2. idea重写接口没有@override_【自学C#】|| 笔记 19 接口

    一.接口 在日常生活中,手机.笔记本电脑.平板电脑等电子产品提供了不同类型的接口用于充电或者连接不同的设备. 不同类型接口的标准不一样,例如电压.尺寸等. 在C#语言中,接口也会定义一种标准,如果需要 ...

  3. 第三周 Java语法总结__static关键字__代码块__继承__this和super的区别__重写__final关键字__多态__抽象__接口__形参问题__包__权限修饰符__内部类

    文章目录 6.static关键字 1)静态static关键字的特点: 2)关于static关键字的使用注意事项 3)什么时候将变量定义为成员变量: 7.文档说明书: 8.代码块 9.继承 1)继承的概 ...

  4. 方法的重写和重载,接口和抽象类区别

    方法的重写和重载,接口和抽象类区别,新手入门必看!!!!!要记住 方法的重写和重载 重写 重载 接口和抽象类 说明 方法的重写和重载 重写 在Java程序中,类的继承关系可以产生一个子类,子类继承父类 ...

  5. java基础2:this、static、final、abstract关键字、代码块、生成API工具包、继承、多态、方法重载和重写,抽象类、接口、常见异常、java权限修饰符、选择排序思想和程序和内部类

    1.this关键字 this表示当前类对象的地址空间值的引用.就是说,this代表了new出来的对象 其最大作用就是解决了构造器中局部变量隐藏成员变量.即用this.变量名 = 变量名 区分. 2.s ...

  6. PHP接口与抽象类区别:接口用来扩展应用 抽象用来总结归纳

    1.理解 抽象类:比如男人,女人这两个类,那我们可以为这两个类设计一个更高级别的抽象类 人. 接口:我们可以坐着吃饭,可站着吃饭,可以用筷子吃饭,那么可以把这些吃饭的动作抽象成一个接口 吃饭 一个类只 ...

  7. java 抽象接口类,Java接口(interface)和Java抽象类(abstract class)的区别(详诉版)

    1.概述 一个软件设计的好坏,我想很大程度上取决于它的整体架构,而这个整体架构其实就是你对整个宏观商业业务的抽象框架, 当代表业务逻辑的高层抽象层结构合理时,你底层的具体实现需要考虑的就仅仅是一些算法 ...

  8. python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...

    主要内容 首先,本章说明抽象基类的常见用途:实现接口时作为超类使用 说明抽象基类如何检查具体子类是否符合接口定义,以及如何使 用注册机制声明一个类实现了某个接口,而不进行子类化操作 最后, 说明如何让 ...

  9. java 接口重写_java如何实现接口中的重写

    普通类implements接口 1.普通方法,抽象方法都得重写: 2.默认方法可重写,也可不重写. 抽象类implements接口 在线视频教程分享:java教学视频 由抽象类来实现接口,则不必重写接 ...

最新文章

  1. unity模块切换_(一)Unity3D模块介绍
  2. T-SQL MD5算法实现
  3. Linux---系统日志
  4. 使用预训练的卷积神经网络(猫狗图片分类)
  5. 数据中心成投资新宠 今年或再创历史纪录
  6. Python多线程之构建线程池
  7. Qt 5.12 LTS(长期维护版本)中Qt Quick的性能改进
  8. 用limit 实现java的简单分页
  9. 如何编程得到数据库信息
  10. Hyperloop,让发布简洁高效
  11. window java 环境_Windows配置java环境
  12. poj 3295 Tautology (构造)
  13. arraylist扩容是创建新数组吗 java_手撕ArrayList底层,透彻分析源码
  14. adb uninstall
  15. 每个开发人员应该拥有的K8S工具
  16. python里打印空格_python打印空格
  17. 【Python学习笔记②】——基础的数据结构【两万字总结 + 字符串、列表、元组、字典 + 增删查改】
  18. python数据分析师书籍_做数据分析不得不看的书有哪些?
  19. 四平方和定理(每个正整数均可表示为4个平方数的和)
  20. 数据库分类及常用数据库

热门文章

  1. mysql数据库日志太多_数据库Log太多如何清理但是不影响mysql原本的表数据。
  2. c语言做简单的水果店程序,怎么开发一款生鲜水果小程序?水果店+小程序该如何组合运营?...
  3. 东财计算机应用基础在线作业一,东财《计算机应用基础》综合作业
  4. Linux下使用Nohup后台运行程序
  5. Git学习小记之分支原理
  6. 设置Mysql5.6允许外网访问详细流程
  7. Centos7开放及查看端口
  8. Android开发笔记(七十三)代码混淆与反破解
  9. 美研计算机案例,美国研究生申请案例:耶鲁大学录取:计算机硕士【2010】
  10. java 连接数据库查询_JAVA连接数据库,查询功能怎么写