default怎么修饰接口中的方法详解

一、default修饰接口中的方法

在实现HandlerInterceptor接口时,我发现不实现HandlerInterceptor接口的方法也不会报错

仔细想来,还是我对接口的理解不清晰。

打开源码发现HandlerInterceptor接口中的方法都是default

在以前的接口编写中,我总是省略权限修饰符,因为在接口中的方法中默认是public abstract

那么再来对接口进行总结。

那么也就是说,实现类要覆盖接口中的抽象方法就能实例化,而HandlerInterceptor接口中的方法都是default

在JDK8增加的default修饰接口方法时,有什么作用呢?

实现类会继承接口中的default方法

还有两个要注意的点

一言以蔽之,更接近实现类的优先级更高,如: 实现类 > 抽象类 > 接口

1. 如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法

2. 如果子类继承父类,父类中有b方法,该子类同时实现的接口中也有b方法(被default修饰),那么子类会继承父类的b方法而不是继承接口中的b方法

二、Java中的“多继承“?

在学习C++时,多继承会带来非常著名的菱形继承问题

那么为什么Java接口为何能多继承?

1.Java接口是行为性的,也就是说接口只是定义某个行为的名称

2.具体的实现动作,都在实现类本身这里。

从JDK8开始,接口中可以写default方法了。这其实是java自己就给自己出了一个问题。

接口可以书写默认方法了,然后又因为接口之间是可以多继承的,因而实质上Java 8的接口多继承其实也会涉及到实现多继承的问题。

解决接口default方法冲突的三步骤:

  • 方法签名相同时,才表示出现了冲突。
  • 类中的方法优先级最高。类或者父类中的方法实现优先级大于任何接口的默认方法
  • 其实,子接口的默认方法优先级更高。
  • 若最终还是无法判断,那么实现类必须通过显示复写的方式复写默认方法,然后再自己通过xxx.super.xxx()的方式来指定具体使用哪个接口的实现

总之,Java8在语言层面上,对若出现接口default方法冲突的解决方案是:不作为。其实不作为也是一种作为,它让编译器去提示调用者必须显示的override这个冲突的方法,让coder自己去决定调用逻辑

三、关于抽象类与接口的思考

如果现在问我接口和抽象类有什么区别,我会觉得去说两者之间具体的使用细节是舍本逐末了,应该从设计理念出发。

于是引出我对此的理解

抽象类:抽象体,对于个体(事物)的抽象。

接口:抽象面,对于事物某一特性(行为)的抽象。接口只是定义某个行为的名称。

在Java的设计中,经常可以看到两者组合起来使用。如Servlet

什么叫Servlet?实现了Servlet接口的类就是一个Servlet。

可以发现,抽象类GenericServlet实现了Servlet接口。

接口的好处是什么?

规范。

抽象类的好处是什么?

捕捉子类的通用特性,减少冗余代码,同时起到规范的作用。

这样两者结合起来的好处是什么(GenericServlet)?

规范,同时减少了编程人员的所需要编写的代码,抽象类给出模板。

到此这篇关于default怎么修饰接口中的方法详解的文章就介绍到这了,更多相关default修饰方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法

    Python的字符集处理实在蛋疼,目前使用UTF-8居多,然后默认使用的字符集是ascii,所以我们需要改成utf-8 查看目前系统字符集 复制代码 代码如下: import sys print sys.getdefaultencoding() 执行: 复制代码 代码如下: [root@lee ~]# python a.py ascii 修改成utf-8 复制代码 代码如下: import sys   sys.setdefaultencoding('utf-8')   print sys.get

  • Python使用defaultdict读取文件各列的方法

    本文实例讲述了Python使用defaultdict读取文件各列的方法.分享给大家供大家参考,具体如下: #!/usr/bin/python """USAGE: python *.py align_SNP_site out_file""" import sys #import time from collections import Counter #t0=time.clock() info=open(sys.argv[1]) fast=sys.

  • python 字典 setdefault()和get()方法比较详解

    dict.setdefault(key, default=None) --> 有key获取值,否则设置 key:default,并返回default,default默认值为None dict.get(key, default=None) --> 有key获取值,否则返回default.default默认值为None. 例子:循环迭代message字符串中每个字符,计算每个字符出现的次数 import pprint message = "It is a good day, is not

  • Java 8中default方法能做什么?不能做什么?

    什么是default方法? Java 8 发布以后,可以给接口添加新方法,但是,接口仍然可以和它的实现类保持兼容.这非常重要,因为你开发的类库可能正在被多个开发者广泛的使用着.而Java 8之前,在类库中发布了一个接口以后,如果在接口中添加一个新方法,那些实现了这个接口的应用使用新版本的接口就会有崩溃的危险. 有了Java 8,是不是就没有这种危险了?答案是否定的. 给接口添加 default 方法可能会让某些实现类不可用. 首先,让我们看下 default 方法的细节. 在Java 8中,接口

  • Python中字典的setdefault()方法教程

    前言 在python基础知识中有说过,字典是可变的数据类型,其参数又是键对值.setdefault()方法和字典的get()方法在一些地方比较相像,都可以得到给定键对应的值.但setdefault()方法可以在字典中并不包含有给定键的情况下,为给定键设定相应的值. Python 字典的 setdefault 方法原型如下: dict.setdefault(key, default=None) 如果给定的 key 在字典中则返回该值,如果不在字典中,就将 key 插入到字典中,并将值设置为指定的

  • Java map.getOrDefault()方法的用法详解

    Map.getOrDefault(Object key, V defaultValue)方法的作用是: 当Map集合中有这个key时,就使用这个key值: 如果没有就使用默认值defaultValue. 代码示例如下: HashMap<String, String> map = new HashMap<>(); map.put("name", "cookie"); map.put("age", "18"

  • python字典setdefault方法和get方法使用实例

    这篇文章主要介绍了python字典setdefault方法和get方法使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在python的字典对象中,可以直接使用键名获取键值,像这样: >>> d = {"x":1,"y":2} >>> d["x"] >>> d["y"] >>> 但如果键名不存在,则

  • Java8新特性之默认方法(default)浅析

    一.什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现.然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现.所以引进的默认方法

  • default怎么修饰接口中的方法详解

    一.default修饰接口中的方法 在实现HandlerInterceptor接口时,我发现不实现HandlerInterceptor接口的方法也不会报错 仔细想来,还是我对接口的理解不清晰. 打开源码发现HandlerInterceptor接口中的方法都是default 在以前的接口编写中,我总是省略权限修饰符,因为在接口中的方法中默认是public abstract. 那么再来对接口进行总结. 那么也就是说,实现类要覆盖接口中的抽象方法就能实例化,而HandlerInterceptor接口中

  • Java集合操作之List接口及其实现方法详解

    在介绍List接口之前,我们先来看看 Collection 接口,因为Collection接口是 List / Set / Queue 接口的父接口,List / Set / Queue 的实现类中很多的操作方法其实还是调用Collection类定义的方法. 一.Collection接口 在Collection接口中,定义了如下的方法: 其中方法可以分为以下几类: 数据操作类方法:add/addAll/remove/removeAll/clear/retainAll/iterator 判断类方法

  • Pandas中resample方法详解

    Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法. 方法的格式是: DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start',kind=None, loffset=None, limit=None, base=0) 参数详解是: 参数 说明 freq 表示重采样频率,

  • TS 项目中高效处理接口返回数据方法详解

    目录 写在前面 问题 解答 区别 总结 必备高效神器 写在前面 在 TypeScript 项目中,TypeScript 对接口返回数据的处理,是日常项目开发中一个比较棘手的问题. 那我们该如何 高效 的解决这个问题呢? 问题 项目中使用 ts 都会碰到如下场景:从接口请求过来的数据该如何进行处理? const fetchInfo = async (url: string, id: string) => { return $http.get(url, params); } const res =

  • angularJS中$apply()方法详解

    对于一个在前端属于纯新手的我来说,Javascript都还是一知半解,要想直接上手angular JS,遇到的阻力还真是不少.不过我相信,只要下功夫,即使是反人类的设计也不是什么大的问题. Okay,废话不多说.为了弄明白angular JS为何物,我先是从Scope开始.那么什么是Scope呢?借用官方文档的一段话: 复制代码 代码如下: "scope is an object that refers to the application model. It is an execution c

  • 将angular.js项目整合到.net mvc中的方法详解

    前言 之前的开发选择的是完全舍弃服务端,仅保留最简单web服务器提供angular经打包的静态资源,此外所有的业务与数据请求都访问一个分离的WebApi来实现.不过最近碰到一个需求,有必要使用多个客户端,而各客户端本身都是webpack打包出来的js而已,没必要每个客户端都自己建一个站点,这就有必要搭建一个服务端,根据参数动态渲染不同客户端的脚本来服务多个客户端了.主要需要解决两个问题,一是防止前后端路由冲突各自有效工作,二是如何实现一套比较合理的部署方案.笼统一点看待这个问题,无非就是要实现如

  • Java Web Fragment在项目中使用方法详解

    Web Fragment 是什么 - 它是在 servlet 3.0开始支持的,可以把一个dy web项目拆分为多个项目,解耦合,使其在项目中开发效率提高,下面我演示简单的项目创建过程 用eclipse右键new->other->web->web fragment project 项目结构 web-fragment.xml 配置详细内容 <?xml version="1.0" encoding="UTF-8"?> <web-fra

  • Java8中新特性Optional、接口中默认方法和静态方法详解

    前言 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性. Java 8是Java的一个重大版本,有人认为,虽然这些新特性领Java开发人员十分期待,但同时也需要花不少精力去学习.下面本文就给大家详细介绍了Java8中新特性Optional.接口中默认方法和静态方法的相关内容,话不多说了,来一起看看详细的介绍吧. Optional Optional 类(java.util.Optional) 是一个

  • 在C# 8中如何使用默认接口方法详解

    前言 C# 8 中新增了一个非常有趣的特性,叫做 默认接口方法 (又称虚拟扩展方法),这篇文章将会讨论 C# 8 中的默认接口方法以及如何使用. 在 C# 8 之前,接口不能包含方法定义,只能在接口中定义方法签名,还有一个就是接口的成员默认是 public 和 abstract , 在 C# 8 之前,接口不能包含字段,也不能包含private, protected, 或者 internal 的方法成员.如果你在接口中引入了一个新成员,默认情况下你必须更新实现该接口的所有子类. 在 C# 8 中

  • java中的抽象类和接口定义与用法详解

    目录 一.抽象类 1.什么叫抽象类? 2.抽象类的特点: 3.成员特点: 二.接口 1.接口是什么? 2.接口的特点 3.接口的组成成员 4.类与抽象的关系: 5.抽象类与接口的区别: 一.抽象类 1.什么叫抽象类? 例如在生活中我们都把狗和猫归为动物着一类中,但当只说动物时,我们是不知道是猫还是狗还是其他的.所以动物就是所谓的抽象类,猫和狗则是具体的类了.因此在Java中,一个没有方法体的方法应该定义为抽象类,而类中有抽象方法,则必须为抽象类. 2.抽象类的特点: 抽象类与抽象方法必须用abs

随机推荐