我要告诉你: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
}
}
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
我要告诉你:java接口中可以定义private私有方法的更多相关文章
- java 接口中的成员变量与方法
java接口中变量的默认修饰符为 public static final int i = 3; 相当于 public static final int i = 3; java接口中方法的默认修饰符为 ...
- 教你在Java接口中定义方法
基本上所有的Java教程都会告诉我们Java接口的方法都是public.abstract类型的,没有方法体的. 但是在JDK8里面,你是可以突破这个界限的哦. 假设我们现在有一个接口:TimeClie ...
- “全栈2019”Java第八十九章:接口中能定义内部类吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java接口中的成员变量默认为(public、static、final)、方法为(public、abstract)
interface”(接口)可将其想象为一个“纯”抽象类.它允许创建者规定一个类的基本形式:方法名.自变量列表以及返回类型,但不实现方法主体.接口也可包含基本数据类型的数据成员,但它们都默认为publ ...
- Java接口中的方法
接口中可以含有变量和方法.但是,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法 ...
- SuperDiamond在JAVA项目中的三种应用方法实践总结
SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...
- Java编程中获取键盘输入实现方法及注意事项
Java编程中获取键盘输入实现方法及注意事项 1. 键盘输入一个数组 package com.wen201807.sort; import java.util.Scanner; public clas ...
- java8新特性——接口中的静态方法与默认方法
以前我们知道,接口中的方法必须时抽象方法,而从 java8 开始接口中也可以有方法的实现了,叫做默认方法. 一 .默认方法(default修饰) 在 java8 中,因为存在函数式接口,一个接口中只能 ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
随机推荐
- Codeforces1249E By Elevator or Stairs?
题意 给定整数c和数组a,b,\(a_i\)表示通过爬楼梯的方法从第\(i\)层到\(i+1\)层需要的时间,\(b_i\)表示通过坐电梯的方法从第\(i\)层到\(i+1\)层需要的时间,坐电梯前需 ...
- C010:书号分解ISBN
代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int prefix,groupIndentifier ...
- 20190930-01 Redis的事务 000 031
- 图解选择排序及算法优化(Java实现)
选择排序 前言 原理:每次循环对比找出最小/大值,将最值的元素交换至左侧 思想:直接选择排序(Straight Select Sort)算法思想:第一趟从n个元素的数据序列中选出关键字最小/大的元素并 ...
- java 求水仙花数
package com.yc.bean; public class ShuiXianHua { public static void main(String[] args) { /** * 题目:打印 ...
- CSS 简介,学习 CSS 必看
CSS 表示的是层叠样式表,学习 CSS 之前我们必须要掌握 HTML 和 XHTML 概述 CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 ...
- 记tp5.1使用composer PhpOffice的xlsx表格文件导入数据库
在项目环境下composer require phpoffice/phpspreadsheet在项目中引用use PhpOffice\PhpSpreadsheet\IOFactory; 下面是 上传x ...
- 原生js实现懒加载并节流
像淘宝网站等,页面中有着大量图片,一次性全部加载这些图片会使浏览器发送大量请求和造成浪费.采用懒加载技术,即用户浏览到哪儿,就加载该处的图片.这样节省网络资源.提升用户体验.减少服务器压力. 方法1: ...
- javac中不引人注目的编码小坑
来看下面这段java程序: public class Test{ public static void main(String[] args){ System.out.println("哈哈 ...
- 掌握Rabbitmq几个重要概念,从一条消息说起
RabbitMQ 是功能强大的开源消息代理.根据官网称:也是使用量最广泛的消息队列.就像他的口号“Messaging that just works”,开箱即用使用简单,支持多种消息传输协议(AMQP ...