java9开始——接口中可以定义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
  }
}

作者链接:字母哥博客

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

时间: 2020-10-12

java接口私有方法实现过程解析

这篇文章主要介绍了java接口私有方法实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题描述: 我们需要抽取一个共有方法,用来解决两个默认方法之间重复代码的问题 但是这个共有方法不应该让实现类使用,应该是私有化的. 解决方案: 从java 9开始,接口当中允许定义私有方法. 1.普通私有方法,解决多个默认方法之间重复代码问题 格式: private 返回值类型方法名称(参数列表){ 方法体 } 2.静态私有方法,解决多个静态方法之

Java9垃圾回收方法finalize() 原理解析

1: finalize() 方法 finallize() 方法是Object类的方法, 用于在类被GC回收时 做一些处理操作, 但是JVM并不能保证finalize(0 ) 方法一定被执行, 由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间这段时间是任意长的.我们并不能依赖finalize()方法能及时的回收占用的资源,可能出现的情况是在我们耗尽资源之前,gc却仍未触发,因而通常的做法是提供显示的close()方法供客

Java9以后的垃圾回收的具体用法

1: finalize() 方法 finallize() 方法是Object类的方法, 用于在类被GC回收时 做一些处理操作, 但是JVM并不能保证finalize(0 ) 方法一定被执行, 由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间这段时间是任意长的.我们并不能依赖finalize()方法能及时的回收占用的资源,可能出现的情况是在我们耗尽资源之前,gc却仍未触发,因而通常的做法是提供显示的close()方法供客

java9学习笔记之模块化详解

前言 截止到目前JDK的版本已经更新到10了,虽然java9的生命周期才半年,但是我认为这个版本带来的变革是不可磨灭的,它是第一次深层次的针对架构以及依赖上的革新.下面我们就来学习一下. 模块化的功能有几个目的: 让Java的SE程序更加容易轻量级部署 改进组件间的依赖管理,引入比Jar粒度更大的Module 改进性能和安全性 如果用更加简单解释,那就是"解决Classpath地狱问题,改进部署能力".Module的内容比较多,为了由浅入深,我按照一些问题和我的理解来介绍模块化. 一.

Java中的private、protected、public和default的区别(详解)

(1)对于public修饰符,它具有最大的访问权限,可以访问任何一个在CLASSPATH下的类.接口.异常等.它往往用于对外的情况,也就是对象或类对外的一种接口的形式. (2)对于protected修饰符,它主要的作用就是用来保护子类的.它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西. (3)对于default来说,有点的时候也成为friendly(友员),它是针对本包访问而设计的,任何处于本包下的类.接口.异常等,都可以相互访问,即使是父类没有用prote

利用java反射机制调用类的私有方法(推荐)

试想一下,如果你可以轻易地调用一个类的私有方法,那么是不是说你的封装都失效了?最近在看java的反射机制,发现居然可以利用java的反射机制去调用其他类的私有方法,至于这能干什么,那就见人见智了.. 我写的一段简易实例代码如下: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * @author thomaslwq * @version 创建时间:Sep 4, 201

java private关键字用法实例

这篇文章主要介绍了java private关键字用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 package java04; /* * 问题描述:定义Person的年龄时,无法阻止不合理的数值设置进来 * 解决方案:用private关键字将需要保护的成员变量进行修饰 * * 一旦使用了private进行修饰,那么本来类当中仍然可以随意访问. * 但是超出本类范围之外的就补不能直接访问了 * * 简介访问private成员变量,就是定义

Java的外部类为什么不能使用private和protected进行修饰的讲解

Java的外部类为什么不能使用private和protected进行修饰 对于这个问题,一直没有仔细思考,今天整理一下: 对于顶级类(外部类)来说,只有两种修饰符:public和默认(default).因为外部类的上一单元是包,所以外部类只有两个作用域:同包,任何位置.因此,只需要两种控制权限:包控制权限和公开访问权限,也就对应两种控制修饰符:public和默认(default). 如果类使用了private修饰符,说明是个内部类.内部类的上一级是外部类,那么对应的有四种访问控制修饰符:本类(p

Java 基础之内部类详解及实例

 Java 基础之内部类详解及实例 内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类 如同一个人是由大脑.肢体.器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液.跳动) 显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类 而心脏又在人体当中,正如同是内部类在外部内当中  实例1:内部类的基本结构 //外部类 class Out { private int age = 12; //内部类 class In { public vo

C#接口在派生类和外部类中的调用方法示例

本文实例讲述了C#接口在派生类和外部类中的调用方法.分享给大家供大家参考,具体如下: C#的接口通过interface关键字进行创建,在接口中可以包含属性,方法等成员变量.接口的派生类可以对接口中的方法进行实现.一个类可以继承多个接口对这些接口中的方法进行实现,一个接口也可以派生多个类接口中的方法可以由这些类中的一个或多个进行实现.在接口的派生类中可以直接调用接口中的方法. 在派生类中调用举例: //接口 public interface IPersonalService { //接口中的方法

浅谈Java堆外内存之突破JVM枷锁

对于有Java开发经验的朋友都知道,Java中不需要手动的申请和释放内存,JVM会自动进行垃圾回收:而使用的内存是由JVM控制的. 那么,什么时机会进行垃圾回收,如何避免过度频繁的垃圾回收?如果JVM给的内存不够用,怎么办? 此时,堆外内存登场!利用堆外内存,不仅可以随意操控内存,还能提高网络交互的速度. 背景1:JVM内存的分配 对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下: 新生代:一般来说新创建的对象都分配在这里. 年老代:经过几次垃圾回收,新生代的对象就会放在年老代里

Java开发之内部类对象的创建及hook机制分析

本文实例讲述了Java内部类对象的创建及hook机制.分享给大家供大家参考,具体如下: Java中的内部类虽然在状态信息上与其外围类在状态信息是完全独立的(可直接通过内部类实例执行其功能),但是外围类对象却是内部类对象得以存在的基础. 内部类对象生成的时候,必须要保证其能够有外围类对象进行挂靠(hook),从而java提供了严格的内部类对象生成的语法. 一般惯用两种方法,生成内部类对象. Method1: 使用  外围类实例.new  内部类名称() 的标准方法. Example 1: publ

Ruby中的public、private、protected区别小结

重点关注private与protected public 默认即为public,全局都可以访问,这个不解释 private C++, "private" 意为 "private to this class", 但是Ruby中意为 "private to this instance". 意思是:C++中,对于类A,只要能访问类A,就能访问A的对象的private方法. Ruby中,却不行:你只能在你本对象的实例中访问本对象的private方法. 因

浅析php面向对象public private protected 访问修饰符

PHP中有三种访问修饰符,分别是:     public(公共的.默认)     protected(受保护的)     private(私有的)public(公共的.默认)在PHP5中如果类没有指定成员的访问修饰符,默认就是public的访问权限.protected(受保护的)被声明为protected的成员,只允许该类的子类进行访问.private(私有的 ) 被定义为private的成员,对于类内部所有成员都可见,没有访问限制.对类外部不允许访问. 图解demo 复制代码 代码如下: cl

浅谈php中的访问修饰符private、protected、public的作用范围

1. private 只能在类内部使用 2. protected 可以在类内部和继承类里使用.类外部不能使用[即实例化后的对象无法调用] 3. public 全部范围适用. 4.子类复写父类中的方法时,子类中的 访问修饰符的范围要大于等于 父类的[ 继承只能发扬光大,至少保持不变.不可以丢失东西.] 以上这篇浅谈php中的访问修饰符private.protected.public的作用范围就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

java开发之内部类的用法

在java的开发中,java开发人员建议,尽量少用内部类,要把内部类提出他所处的那个类,单独生成一个类.直接来代码: 复制代码 代码如下: package com.b510; /**  * 内部类之间的调用  *   * @author Hongten  *   * @time 2012-3-19 2012  */ public class InnerClassTest { public static void main(String[] args) {         // 这是InnerCl