这是真的:java接口中可以定义private 方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法。只允许我们定义public访问权限的方法、抽象方法或静态方法。但是从Java 9 开始,Interface 接口中允许定义私有方法和私有静态方法。下面我们就来为大家介绍其语法规则,和为什么要有这样的设计。
其实在Java 8之前,还有另一个被广为人知的知识点:接口中所有的方法必须是abstract 抽象方法。但是,从java 8开始接口中可以包含非abstract 方法,如下文中的default方法。这个不是我们本文要为大家介绍的内容,如不熟悉,请自行补课。
一、Java 9接口定义私有方法
从Java 9开始,我们可以在Interface接口中添加private的私有方法和私有静态方法。这些私有方法将改善接口内部的代码可重用性。例如,如果需要两个默认方法来共享代码,则私有接口方法将允许它们共享代码,但不将该私有方法暴露给它的实现类调用(后文中会给大家举一个例子)。
在接口中使用私有方法有四个规则:
-
接口中private方法不能是abstract抽象方法。因为abstract抽象方法是公开的用于给接口实现类实现的方法,所以不能是private。
-
接口中私有方法只能在接口内部的方法里面被调用。
-
接口中私有静态方法可以在其他静态和非静态接口方法中使用。
-
接口中私有非静态方法不能在私有静态方法内部使用。
interface CustomInterface { public abstract void abstractMethod(); //抽象方法不能是私有的 public default void defaultMethod() { privateMethod(); //可以调用接口中的私有方法 privateStaticMethod(); //可以调用接口中的私有静态方法 System.out.println("普通方法被调用"); } public static void staticMethod() { privateStaticMethod(); //public静态方法可以调用private静态方法 System.out.println("静态方法被调用"); } private void privateMethod() { System.out.println("private私有方法被调用"); } private static void privateStaticMethod() { System.out.println("private私有静态方法被调用"); } }
按照上面四个规则,上面的代码定义都是正确的
二、一个例子:分别计算奇数与偶数的和
接口定义如下,下文中add方法采用了java8 的Stream流操作,分别使用lambda表达式作为过滤条件,并求和。核心是:addEvenNumbers偶数求和函数和addOddNumbers奇数求和函数,都调用了add接口私有方法。
public interface CustomCalculator { default int addEvenNumbers(int... nums) { //非抽象,java8 开始可以定义default方法 return add(n -> n % 2 == 0, nums); //过滤偶数并求和,调用private私有方法 } default int addOddNumbers(int... nums) { //非抽象,java8 开始可以定义default方法 return add(n -> n % 2 != 0, nums); //过滤奇数并求和,调用private私有方法 } //按照过滤条件过滤奇数或偶数并sum求和:java9开始可以定义private私有方法 private int add(IntPredicate predicate, int... nums) { return IntStream.of(nums) //java8 Stream流 .filter(predicate) //java8 predicate及过滤器 .sum(); //sum求和 } }
接口实现类MainCalculator 实现CustomCalculator接口
public class MainCalculator implements CustomCalculator { public static void main(String[] args) { CustomCalculator demo = new MainCalculator (); int sumOfEvens = demo.addEvenNumbers(1,2,3,4,5,6,7,8,9); System.out.println(sumOfEvens); //过滤所有偶数并求和,结果是20 int sumOfOdds = demo.addOddNumbers(1,2,3,4,5,6,7,8,9); System.out.println(sumOfOdds); //过滤所有奇数并求和,结果是25 } }
欢迎关注我的博客,里面有很多精品合集
本文转载注明出处(必须带连接,不能只转文字):字母哥博客 - zimug.com
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
本文分享自微信公众号 - 字母哥课堂(zimug_blog)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
MySQL事务与MVCC如何实现的隔离级别
前言 其实数据库章节基本上的知识点我都写过一遍了,包括这篇事务和MVCC的,但是国庆期间我翻阅资料的时候我发现之前写的还差点意思,例子举得也差点意思,那我就根据我自己最新的理解,加上之前的总结相当于重写了,希望你也有新的收获。 数据库事务介绍 事务的四大特性(ACID) 原子性(atomicity): 事务的最小工作单元,要么全成功,要么全失败。 一致性(consistency): 事务开始和结束后,数据库的完整性不会被破坏。 隔离性(isolation): 不同事务之间互不影响,四种隔离级别为RU(读未提交)、RC(读已提交)、RR(可重复读)、SERIALIZABLE (串行化)。 持久性(durability): 事务提交后,对数据的修改是永久性的,即使系统故障也不会丢失。 事务的隔离级别 读未提交(Read UnCommitted/RU) 又称为脏读,一个事务可以读取到另一个事务未提交的数据。这种隔离级别岁最不安全的一种,因为未提交的事务是存在回滚的情况。 读已提交(Read Committed/RC) 又称为不可重复读,一个事务因为读取到另一个事务已提交的修改数据,导致在当前...
- 下一篇
Java虚拟机浅谈——垃圾收集器与内存分配策略
在C语言中,有些由内存需要程序员在代码中进行手动回收,但是在Java中,没有这样的声明式操作。有没有人有去想过,Java到底做了什么可以自动进行垃圾回收呢?Java中的垃圾回收,是一点都不需要程序员关心,万无一失的吗? 本文将从:Jvm中的垃圾收集器和内存分配策略。虚拟机中对已经死亡的对象都有哪些垃圾回收是算法,两部分 和大家谈谈Java虚拟机的垃圾收集器与内存分配策略。 重垃圾收集器和内存分配策略 垃圾收集(Garbage Collection,GC),并不是随着Java一起诞生的。GC的历史比Java来得更加久远,早在1960年的时候,MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,人们就在思考GC需要完成的三件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 在经过半个世纪的发展后,对于这三个问题的答案越来越清晰,总结成就是:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。 在Java程序编写的过程中,我们可以知道代码的逻辑是怎样的,但是具体的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)