在传统的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

}

}

作者链接:字母哥博客

以上就是java9开始 接口中可以定义private私有方法的详细内容,更多关于Java定义private私有方法的资料请关注脚本之家其它相关文章!

java定义private_java9开始——接口中可以定义private私有方法相关推荐

  1. java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用

    1 简介 本文将讲解Java 8 Stream中的两个方法:skip()和limit().这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和 ...

  2. abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  3. java private 接口_java接口中 定义 private 私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  4. Java私有方法解释_java接口中 定义 private 私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  5. java接口中只能定义常量和抽象方法_接口中只能定义常量和抽象方法。( )_学小易找答案...

    [判断题]在可见光吸光光度法中,为保证吸光度测量的灵敏度,入射光始终选择 λ max. [判断题]接口中只能定义常量和抽象方法.( ) [单选题]类与对象的关系是 ( ) [单选题]某物质的摩尔吸光系 ...

  6. java接口能定义非抽象方法吗_接口中只能定义常量和抽象方法,对么

    接口中只能定义常量和抽象方法,对.在Java语言中,接口是一个抽象类型,是抽象方法的集合,通常以关键字interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口中只能定义常量 ...

  7. 1)编写Animal接口,接口中声明run()方法; 2)定义Bird类和Fish类实现Animal接口; 3)编写Bird类和Fish类的测试程序,并调用其中的run()方法

    /*1)编写Animal接口,接口中声明run()方法:   2)定义Bird类和Fish类实现Animal接口:   3)编写Bird类和Fish类的测试程序,并调用其中的run()方法 */ in ...

  8. python中不被定义_一日一技:在Python中双下划线私有方法不能被调用的原理

    一日一技:在Python中双下划线私有方法不能被调用的原理 在使用Python编写面向对象的代码时,我们会常常使用"继承"这种开发方式.例如下面这一段代码: class Info: ...

  9. java e.getmessage() null,浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别...

    Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String str ...

最新文章

  1. Jenkins配置MSBuild实现自动部署(MSBuild+SVN/Subversion+FTP+BAT)
  2. Kubernetes入门——深入浅出讲Docker
  3. 帮盖尔优化SQL-----子查询优化的经典案例
  4. protobuf入门教程(六):导入定义(import)
  5. vue add element报错_Vue 源码解析 -- new Vue -gt; mountComponent 001
  6. 沙场白帽老兵聊未来的挖洞方向及其它
  7. webservice发布及远程调用
  8. linux中板子烧写环境配置,3、在Linux下搭建51单片机的开发烧写环境(makefile版)...
  9. 无法启动此程序因为计算机中丢失msvcr71
  10. 【linux】通过xshell上传文件
  11. 基础物理-物质的组成
  12. walking机器人入门教程-rviz插件-多点导航插件的航点保存和加载
  13. 学1个月爬虫就月赚6000?告诉你爬虫的真实情况!
  14. 数据库原理和应用(2)—— 数据库系统的组成
  15. C语言:goto循环语句
  16. 数据结构:通过hash表方法创建母猪信息录入系统
  17. 读书笔记---阶级逆袭——三代人的卵巢彩票
  18. Java课程设计——象棋(201521123042 姚佳希)
  19. 数字宫殿方法记忆设计模式
  20. 非线性方程线性化求参数的简单例子

热门文章

  1. 你需要知道的那些 redis 数据结构(前篇)
  2. 华为确认与三家EDA公司停止合作;开源安卓恶意软件窃取用户隐私信息;三星高通回应7纳米EUV工艺问题……...
  3. 再次“重新定义” 华为争做数据基础设施领航者
  4. Jonathan Bryce说:OpenStack属于全世界,并不属于一个公司,也不会属于一个国家……...
  5. mysql 主从 跳过_mysql主从同步如何跳过错误
  6. Flowable 数据库表结构 ACT_ID_INFO
  7. python-解码 decode 报错的问题
  8. mysql数据迁移neo4j_neo4j数据库迁移---------Neo4j数据库导入导出的方法
  9. Java == 与 equals 的不同
  10. C语言条件判断 if / else - C语言零基础入门教程