java8 接口的default方法和静态方法

  以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法。不同的是:默认方法可以通过实现接口的类实例化的对象来调用,而类方法就相对于工具方法了。需要注意的是,此处的静态方法只能被public修饰(或者省略不写),不能是private或者protected。

  好处:在Java 8 之前,接口不能有静态方法,因此按照惯例,接口Type 的静态工厂方法被放一个名为ypes 的不可实例化的伴生类中。例如Java Collections Framework的集合接口有45 个工具实现,分别提供了不可修改的集合、同步集合,等等。几乎所有这些实现都通过静态工厂方法在-个不可实例化的类( java . ut il. Collections ) 中导出。所有返回对象的类都是非公有的。现在的Collections Framework API 比导出45 个独立公有类的那种实现方式要小得多,每种便利实现都对应一个类。这不仅仅是指API 数量上的减少,也是概念意义上的减少:为了使用这个API,用户必须掌握的概念在数量和难度上都减少了。

interface DemoInterface {
    default void doSomething() {
        System.out.println("默认方法-->test1");
    }

    static void test() {
        System.out.println("这个是一个静态方法");
    }
}

interface Demo1Interface {
    default void doSomething() {
        System.out.println("默认方法-->test2");
    }
}

public class Test implements DemoInterface {
    public static void main(String[] args) {
        Test test = new Test();
        test.doSomething();
        DemoInterface.test();

        //NutritionFacts tFacts = new NutritionFacts.Builder(1, 2).calotes(2).build();
    }
}

  

/**
 *
 * 此类描述的是:实现两个接口时,并且两个接口的方法相同时,必须要实现
 *
 * @author: Aarony
 * @version: 2019年5月24日 上午10:03:45
 */
public class Test1 implements DemoInterface, Demo1Interface {

    public static void main(String[] args) {
        Test1 test = new Test1();
        test.doSomething();
    }

    // 假如下面是Demo1Interface,输出test2,DemoInterface 输出test1
    @Override
    public void doSomething() {
        DemoInterface.super.doSomething();
        // Demo1Interface.super.doSomething();
    }
}

  

原文地址:https://www.cnblogs.com/wucaifang/p/10916484.html

时间: 2024-07-30 19:56:00

java8 接口的default方法和静态方法的相关文章

java8-新特性--(接口的默认方法与静态方法)

Java 8用默认方法与静态方法这两个新概念来扩展接口的声明. public interface Inte{ void method(); default void defaultMethod(){ System.out.println("default"); } static void staticMehod(){ System.out.println("static"); } }   public static void main(String[]args){

Java8接口的默认方法

什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现.然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现.所以引进的默认方法.

Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法

今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的,这篇文章就来聊聊这些新特性. lambda 表达式 lambda 表达式在项目中也是用到了,这种新的语法的加入,对于使用 Java 多年的我,我觉得是如虎添翼的感觉哈,这种新的语法,大大的改善了以前的 Java 的代码,变得更加的简洁,我觉得这也是为什么 Java8 能够很快的流行起来的原因吧.

java8接口默认方法静态方法和重复注解

接口默认方法和静态方法 默认方法 interface MyInterface1 { default String method1() { return "myInterface1 default method"; } } class MyClass{ public String method1() { return "myClass method"; } } /** * 父类和接口中都有相同的方法,默认使用父类的方法,即类优先 * @author 莫雨朵 * */

Java8新特性(一)_interface中的static方法和default方法

为什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Collection中的default方法.所以准备专门写写关于java8新特性的文章,虽然现在10已经发布了.但还是要认真的去了解下新版本的变化. static方法 java8中为接口新增了一项功能:定义一个或者更多个静态方法.用法和普通的static方法一样. 代码示例 public interface

Java8 default方法

为什么需要引入default方法 在Java7以前interface只能声明方法,而不能实现方法. 在Java8中这一情况有所改变,接口中引入了default方法和static方法,interface中声明的方法默认为 public abstract 修饰,default方法 就相当于只有public 修饰,并且可以有具体的实现,一样可以覆盖(参见下面的例子):static方法在interface里和在其他地方是一样的,类名.方法名调用即可. 引入default主要目的是为了实现接口的升级.因为

Java8新特性——接口的默认方法和类方法

Java8新增了接口的默认方法和类方法: 以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法: 不同的是: 默认方法可以通过实现接口的类实例化的对象来调用,而类方法只能在本接口中调用或在实现类中实现 下面是使用实例: 1 public interface MyInter { 2 default void df(){ //声明一个接口的默认方法 3 4 System.out.println("i'am default f"); 5 sf(); //调用本

Java8接口中的默认方法

Java8新增特性,可以为接口中添加默认方法,实现这个接口的所有类都会继承这个方法,这样看起来,接口和类的界限就有点不明显了,同时也会带来多继承,菱形问题.这样设计的初衷是什么? 重所周知,java8开始支持lambda表达式,可以把函数当做参数传递,最明显的lambda表达式应用场景莫过于对collection的每一个元素应用lambda.如果想为Collection实现lambda表达式:list.forEach(…); // 这就是lambda代码 首先想到的是为Collection的父接

jdk1.8新特性 : 接口中可以有普通方法(非静态方法)和静态方法 , 颠覆了之前我的理解 : 接口中只能有共有常量和抽象方法的概念,后面必须要加一句jdk1.7和1..7之前

看到jdk某些接口中存在default方法,于是... http://shaomeng95.iteye.com/blog/998820    为什么接口只能是公有常量? public interface Jdk8新特性 { public static final String AA = "hhe"; default void test(){ System.out.println("哈哈"); } public static void hehe(){ System.o