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

接口中私有方法只能在接口内部的方法里面被调用。

接口中私有静态方法可以在其他静态和非静态接口方法中使用。

接口中私有非静态方法不能在私有静态方法内部使用。//java项目 www.fhadmin.org

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接口私有方法。//java项目 www.fhadmin.org

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接口//java项目 www.fhadmin.org

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

}

}

java private 接口_java接口中 定义 private 私有方法相关推荐

  1. 通过JAVA的反射调用类中的公有私有方法

    文章来源http://lavasoft.blog.51cto.com/62575/61002及http://blog.csdn.net/sunyujia/article/details/2501709 ...

  2. java接口_Java接口

    java接口 Interface in java is one of the core concept. Java Interface is core part of java programming ...

  3. Retrofit2.5是如何解析在接口类中定义的请求方法?

    前言 Retrofit的核心在于它的create方法中使用了动态代理,在这里面主要是loadServiceMethod方法: 以下代码基于Retrofit2.5.0(跟2.3.0代码存在明显不同) p ...

  4. 设计一个接口, 并设计一个实现类实现该接口,演示它们的使用。具体,创建一个名称为Person的接口,在接口中定义两个方法sayHello()和sayBye()。

    设计一个接口, 并设计一个实现类实现该接口,演示它们的使用. 具体,创建一个名称为Person的接口,在接口中定义两个方法sayHello()和sayBye().然后,创建两个实现了Person接口的 ...

  5. java 数组定义方法_java中定义数组的方法有哪些

    java中定义数组的方法有哪些 发布时间:2020-06-25 18:10:36 来源:亿速云 阅读:130 作者:Leah 这篇文章运用简单易懂的例子给大家介绍java中定义数组的方法,代码非常详细 ...

  6. java泛型方法作用_java泛型的作用与使用方法是什么?

    泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变 ...

  7. java 获取sqlsession_获取Java的MyBatis框架项目中的SqlSession的方法

    从XML中构建SqlSessionFactory从XML文件中构建SqlSessionFactory的实例非常简单.这里建议你使用类路径下的资源文件来配置. String resource = &qu ...

  8. 一个java程序中什么是主类_下列哪个是Java应用程序主类中正确的main方法?_学小易找答案...

    [判断题]用佛尔哈德法测定Ag + 时,不用先除去氮的低价氧化物.汞盐等杂质. [单选题]下列哪个是Java应用程序主类中正确的main方法? [判断题]javac.exe 命令文件存放在 JDK 安 ...

  9. python中定义数组的方法

    数组:数组(Array)是一种线性表数据结构.它用一组连续的内存空间,存储一组具有相同类型的数据. 注:Python中没有数组的数据结构,所以采用列表来表示数组这种数据结构 举个例子: a = [1, ...

  10. error LNK2005: “找到一个或多个多重定义的符号” 已经在 xxxx.obj 中定义 的解决方法

    error LNK2005: "找到一个或多个多重定义的符号" 已经在 xxxx.obj 中定义 的解决方法 参考文章: (1)error LNK2005: "找到一个或 ...

最新文章

  1. jquery 事件:2
  2. DOM获取元素位置的三大系列offset/scroll/client
  3. ECCV 2018 | Pixel2Mesh:从单帧RGB图像生成三维网格模型
  4. Centos7 使用 chronyd 进行时钟同步
  5. python之爬虫学习记录与心得
  6. 在https上面使用ws不加密_ASP.NET Core 3.1 中使用JWT认证
  7. exec和source的区别
  8. PPT - 如何在PPT里面实现数字的随机抽奖?
  9. 计算机毕设分词,基于词表的中文分词算法
  10. xp系统internet信息服务器地址,XP系统下Internet信息服务IIS的安装方法
  11. con 元器件符号_protel中常用元件电器符号
  12. 头歌-自己动手画CPU(第五关)-寄存器文件设计-Logisim
  13. python模型保存与恢复_tensorflow1.0学习之模型的保存与恢复(Saver)_python
  14. cmak(kafka Manager) 编译教程
  15. 漫画制作软件EasyComic V1.7发布
  16. Android文件存储编程实验,Android编程中File文件常见存储与读取操作demo示例
  17. 计算机网络——网络安全(湖科大 教书匠)
  18. 用计算机代替人说话,人工智能是用计算机来模拟人的智能,代替人的部分脑力劳动...
  19. lol哪个服务器能玩无限火力,lol无线火力玩什么快乐?无限火力最快乐的英雄排行...
  20. 用js代码判断质数_Js关于质数的判定

热门文章

  1. 【算法与数据结构】最大子序列和问题
  2. 使用Httpwatch分析响应时间--转
  3. MySQL——复杂的多表查询——以超市交易数据为例
  4. Python数据结构与算法(第三天)
  5. 【Xmind】,让你的大脑解放出来
  6. 【模型部署】风控模型部署相关知识
  7. var_export()函数的使用举例(后续添加其他的php输出函数)
  8. .如何在Linux上安装Postman应用程序?
  9. 巨杉数据库 CTO 王涛:区块链+数据库,底层技术融合是否带来更大爆发?
  10. 机器学习中的训练集,验证集及测试集的关系