Java基础|Java8接口新特性

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

1 接口特性

  1. 接口不是类,不能使用 new 实例化一个接口;
  2. 不能构造接口的对象,但可声明接口的变量;
  3. 接口变量必须引用实现了接口的类对象;
  4. 可以使用 instanceof 检查一个对象是否实现了某个特定的接口;
  5. 可以建立类的继承关系一样,接口可以继承接口进行扩展;
  6. 接口中不能包含实例域或静态方法,但可包含常量;
  7. 接口中声明的方法自动地设置为 public;
  8. 接口中的域(即常量)自动地设置为 public static final;

2 Java8接口-新特性

  1. 静态方法。
    JavaSE8 允许在接口中增加静态方法
  2. 默认方法。
    可以为接口方法提供一个默认实现,必须使用 default 修饰符标记这个方法;
  3. 解决默认方法冲突问题:
    如果接口中将一个方法定义为默认方法,然后在超类或另一个接口中定义了同样的方法。就要解决冲突,规则如下:
    ① 超类优先。如果超类提供了一个具体方法,同名且有相同参数类型的默认方法会被忽略。
    ②接口冲突。如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型相同的方法,必须覆盖这个方法来解决冲突。
    ③类优先原则。如果一个类扩展了一个超类,同时实现了一个接口,并且从超类和接口继承了相同的方法。此种情况使用类优先原则,接口的默认方法会被忽略。

3 具体用例

接口PersonInfo

/**
 * @version $Id: PersonInfo.java, v 0.1 2017年6月9日 下午5:19:14
 */
public interface PersonInfo {
    //方法都自动设置为public
    void printAge();

    //常量自动设置为 public static final
    String DEFAULT_NAME = "TIANCI";

    int    DEFAULT_AGE  = 18;

    String DEFAULT_SEX  = "男";

    //javaSE8可以有静态方法
    static void printSex() {
        System.out.println(DEFAULT_SEX);
    };

    //javaSE8 可以为接口方法提供默认实现,default进行标记
    default void printName() {
        System.out.println(DEFAULT_NAME);
    };
}

接口PersonHobby

/**
 * @version $Id: PersonHobby.java, v 0.1 2017年6月9日 下午5:41:59
 */
public interface PersonHobby {
    String DEFAULT_HOBBY = "运动";

    default void printName() {
        System.out.println("hobby name is:" + DEFAULT_HOBBY);
    }
}


类Person

/**
 * Person类实现了两个接口,两个接口中都有默认的实现方法printName()
 * 造成冲突,解决冲突的办法就是在类中覆盖这个方法
 * 方法具体实现可以是重写,也可以选择调用具体接口的默认实现方法
 * @version $Id: Person.java, v 0.1 2017年6月9日 下午5:19:00
 */
public class Person implements PersonInfo, PersonHobby {

    private String age;
    private String name;

    {
        age = "age init from Person.";
        name = "name init form Person.";
    }

    @Override
    public void printAge() {
        System.out.println(age);
    }

    //两个接口都有该方法默认实现,进行覆写来解决冲突
    //方法具体实现可以是重写,也可以选择调用具体接口的默认实现方法
    public void printName() {
        /*调用具体的接口默认实现
        PersonInfo.super.printName();*/
        /* 调用具体的接口默认实现
        PersonHobby.super.printName();*/
        System.out.println(name);
    }
}

测试代码

/**
 * @version $Id: Test.java, v 0.1 2017年6月9日 下午5:45:44
 */
public class Test {
    public static void main(String[] args) {
        Person person1 = new Person();
        //可以使用接口声明变量,变量必须引用实现了接口的类对象
        //但对象的能力只拥有声明的接口类型中的能力
        //如person3和person4没有printAge()的能力
        PersonInfo person2 = new Person();
        PersonHobby person3 = new Person();
        PersonHobby person4 = person1;

        person1.printName();
        person1.printAge();
        System.out.println("-------");
        person2.printName();
        person2.printAge();
        System.out.println("-------");
        person3.printName();
        person4.printName();
        /*    
         * 对象的能力只拥有声明的接口类型中的能力
         * person3和person4没有printAge()能力,下面方法不可用
         * person3.printAge();
         * person4.printAge();
        */
        //使用接口调用接口中声明的静态方法
        System.out.println("----接口中静态方法---");
        PersonInfo.printSex();
        System.out.println("----访问接口中常量---");
        System.out.println(PersonInfo.DEFAULT_AGE);
        System.out.println(PersonInfo.DEFAULT_NAME);
        System.out.println(PersonInfo.DEFAULT_SEX);
        System.out.println(PersonHobby.DEFAULT_HOBBY);
    }
}

测试结果:

name init form Person.
age init from Person.
-------
name init form Person.
age init from Person.
-------
name init form Person.
name init form Person.
----接口中静态方法-------访问接口中常量---
18
TIANCI
男
运动
Java8新特性 Stream允许我们以声明式的方式处理数据集合,可以将Stream看作是遍历数据集合的高级迭代器。Stream 与Lambda表达式结合使用,将使编码效率大大提高,可读性增强。Stream与IO中的是不同的概念操作案例:使用stream将集合中的手机按照序号num从小到大排序:Stream流的操作顺序Stream语法Lambda表达式是一个匿名函数,可以将Lambda表达式理解为一段可以传递的代码(将代码段数据一样传递)。使用Lambda表达式可以写出更简洁,更灵活的代码。 阅读详情

相关推荐

Java教程:一文详解函数式编程

如果接口里只有一个抽象方法,那么就是函数式接口,可以使用注解(@FunctionalInterface)检测该接口是否是函数式接口,即只能有一个抽象方法。注意事项函数式接口里可以定义默认方法默认方法方法体,不是抽象方法,符合函数式接口的定义要求。函数式接口里可以定义静态方法:静态方法也不是抽象方法,是一个有具体方法实现的方法,同样也符合函数式接口的定义的。...

CZ-001的博客 2196

Java8接口新特性

1、Java8之前接口定义:只可以定义抽象方法,不能定义非抽象方法的特殊类型2、Java8接口的定义:即可以定义抽象方法,也可以定义非抽象方法如果需要定义非抽象方法,那么当前方法需要使用static或者default修饰3、改变的原因:改变之前:如果定义了一个接口接口已经参与使用,后续想给接口增加一个功能,只能添加抽象方法,但是接口已经在使用,新增一个抽象方法之后,使用过该接口的类型就报错。

KIZIJJJ的博客 853

告别手动操作!用Python脚本批量处理Siemens NX零件文件(导入/导出/移除参数)

本文详细介绍了如何利用Python脚本实现Siemens NX零件文件的批量处理,包括导入、导出和移除参数等操作。通过NX Open API和Python UF接口,工业设计师可以大幅提升工作效率,告别繁琐的手动操作。文章提供了完整的实战指南,涵盖环境配置、核心功能实现以及性能优化技巧,特别适合需要进行Siemens-NXUG二次开发的工程师参考。

weixin_28222493的博客 216

Java基础30(Java 8 特性 Java8中Interface接口 Lambda 表达式 Stream流)

interface接口 的设计目的是面向接口编程,提高扩展性。●Java8中,接口中除了抽象方法外,还可以定义default默认方法和static静态方法。○default修饰的默认方法,属于实例方法,可以被实现类调用或重写。○static修饰的静态方法,属于类的静态方法。但它不能被子类继承,只能用interface接口名称调用。

qq_52897007的博客 1123

java8接口新特性

java8接口

weixin_64032525的博客 462

java基础8java8新特性接口

Java8新特性Java8中的接口不仅可以定义抽象方法,也可以定义非抽象类方法;定义的抽象类方法没有方法体,默认使用public abstract修饰,非抽象方法拥有方法体必须使用static和default修饰(实现类可以不重写就直接被调用)。 Static:static不可以与abstract共存,外界是只能通过接口名称.静态方法来访问一个静态方法。 Lamabda表达式:(参数列表)->{方法体},使用该表达式的前提为接口必须是一个函数式接口。使用@FunctionalInterface注

ccw_dy123的博客 400

Java基础Java8新特性接口中使用default和static关键字

**Java 1.8接口有两个方面的增强:接口中可以添加使用default或者static修饰的方法** 1. `增加default方法`:又叫做`接口扩展方法`,即在不破坏java现有实现架构的情况下能往接口里增加新方法, default关键字可以给接口添加一个非抽象的方法实现,子类可以直接调用! >如果想对接口增加一个新方法,那么需要对实现该接口的所有类进行修改,如果接口实的现类很多,就会带来很大的工作量,而且还很容易破坏以前的代码,带来一些问题。如果把新的方法定义为default方法,就可以避免

墩墩分墩 1186

Java基础——Java8+新特性——接口的default方法

Java 8 引入的接口特性,允许在接口中定义。

qq_46274911的博客 1353

java基础:java8新特性函数式接口

java8函数式接口使用

程序员一博 384

Java基础之JDK1.8接口新特性

Java的JDK1.8中:   1、接口中使用default来修饰普通方法与使用static来修饰普通方法的意义用于避免子类重复实现同样的代码 1 package test; 2 /** 3 * 泛型的使用 4 * @author Administrator 5 * 6 */ 7 public class TestType { 8 9...

173

Java基础Java8新特性—快速学会常见的函数式接口及应用

有且只有一个抽象方法接口`被称为函数式接口,函数式接口适用`于函数式编程`的场景,Lambda就是Java中函数式编程的体现,可以使用`Lambda表达式创建一个函数式接口的对象`,一定要确保接口中`有且只有一个抽象方法`,这样Lambda才能顺利的进行推导 函数式接口中只允许有一个`抽象方法`,但是可以有多个`static方法和default方法`

墩墩分墩 1032

Java基础——抽象类,接口和内部类(含JDK8接口新特性

目录一 .抽象类1. 介绍1.1基本用法1.2 抽象类的匿名子类2. 注意事项二. 接口1.介绍1.1 JDK7及以前用法1.2 JDK8用法2. Comparable接口2.1 用法2.2 注意事项3.Cloneable接口3.1 用法3.2 注意事项三. 内部类1. 介绍2.局部内部类3.匿名内部类4.静态内部类 一 .抽象类 1. 介绍 1.1基本用法 随着继承层次中一个个新子类的定义,类变...

mazouri的博客 3250

Java8新特性-函数式接口(lambda基础

Java 8 函数式接口 - Functional Interface 阅读目录 什么是函数式接口(Functional Interface) 函数式接口用途 关于@FunctionalInterface注解 函数式接口里允许定义默认方法 函数式接口里允许定义静态方法 函数式接口里允许定义java.lang.Object里的public方法 JDK中的函数式接口举例 参考资料 ...

大帅的博客 5958

Java基础知识-java8新特性-函数式接口

函数式接口的定义作用与使用

2301_79949966的博客 346

4、java基础:JDK8接口新特性以及接口和抽象类区别

在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的。由于这些修饰符都是默认的,所以在JDK8之前,下面的写法都是等价的。 public interface JDK8BeforeInterface { public static final int field1 = 0; ...

weixin_33720956的博客 173

java基础--21(java8新特性--Lambda,函数式接口,流)

1.java8重要的新特性 lambda表达式 函数式接口 接口中可以定义非抽象方法 Stream 1.Lambda表达式  Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理:函数式开发者非常熟悉这些概念。 很多JVM平台上的语言(Groovy、Sc...

最后的武艺集大成者 674

Java基础_Java8新特性,函数式接口_26

1.jdk8新特性:Lambda表达式-->对象 2.Lambda表达式先睹为快: Test m = ()-> System.out.println("___"); m.testMethod(); Lambda表达式本质上就是:接口的实现类的具体的对象 (1)->箭头操作符 Lambda操作符 (2)() lambda的形参列表 == 接口中的方法的形参列表 (3)->右侧 Lambda体 == 就是重写的接口的哪个方法方法体的内容 3.Lambda表

qq_44173324的博客 147

JAVA8新特性、Lambda表达式、函数式接口方法引用、Stream、时间API(JAVA基础十五)

讲解java8新特性;Lambda表达式的语法、基础使用;函数式接口的概念和基本使用;Stream流的概念、特点、中间操作和终止操作;新时间API和Date类型的互相转换。

Java.L的博客 322

2024年最全【Java8新特性接口中的默认方法和静态方法,你都掌握了吗?(1),java面试笔试题字符串

至此,文章终于到了尾声。技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;项目经历:只写明星项目,描述遵循 STAR 法则;简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取本文已被。

2301_79098686的博客 903

Java基础知识总结 | 第五篇】暴打Java8新特性—(Lambda、方法引用、Stream流、函数式接口、Date Time API、Optional类)

Java重要知识系列第五章主要围绕Java8新特性—(Lambda、方法引用、Stream流、函数式接口、Date Time API、Optional类)展开,并重点介绍了面试中常问的lambda、方法引用、stream流、以及函数式接口

踢桃的成长之路 1816
上一篇: Java基础|拆箱装箱、反射也暗藏玄机?
下一篇: Java基础|对象克隆深浅拷贝你真的搞懂了吗?
不甩锅的码农
博客等级 码龄11年 75粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不甩锅的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值