`

Java 8特性探究(2):深入解析默认方法

    博客分类:
  • J2SE
 
阅读更多

文章源自:http://developer.51cto.com/art/201404/435591.htm

什么是默认方法,为什么要有默认方法

简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。 

为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口 添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了使接口没有引入与现有的实现不兼容发展。

简单的例子

一个接口A,Clazz类实现了接口A。

public interface A { 
    default void foo(){ 
       System.out.println("Calling A.foo()"); 
    } 
} 
   
public class Clazz implements A { 
    public static void main(String[] args){ 
       Clazz clazz = new Clazz(); 
       clazz.foo();//调用A.foo() 
    } 
} 

代码是可以编译的,即使Clazz类并没有实现foo()方法。在接口A中提供了foo()方法的默认实现。

java 8抽象类与接口对比

这一个功能特性出来后,很多同学都反应了,java 8的接口都有实现方法了,跟抽象类还有什么区别?其实还是有的,请看下表对比。

相同点 不同点

1.都是抽象类型;

2.都可以有实现方法(以前接口不行);

3.都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)

1.抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);

2.抽象类和接口所反映出的设计理念不同。其实抽象类表示的是"is-a"关系,接口表示的是"like-a"关系;

3.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

多重继承的冲突说明

由于同一个方法可以从不同接口引入,自然而然的会有冲突的现象,默认方法判断冲突的规则如下:

1.一个声明在类里面的方法优先于任何默认方法(classes always win)

2.否则,则会优先选取最具体的实现,比如下面的例子 B重写了A的hello方法。

public interface A { 
    default void hello() { 
       System.out.println("Hello world from A"); 
    } 
} 

public interface B extends A {
    default void hello() {
        System.out.println("Hello world from B");
    }
}
   
public class Clazz implements B, A { 
    public static void main(String[] args){ 
       Clazz clazz = new Clazz(); 
       clazz.hello();
    } 
} 

输出结果是:Hello World from B

如果想调用A的默认函数,则用到新语法X.super.m(...),下面修改C类,重写一个hello方法,如下所示:

public class Clazz implements B, A { 
    public void hello() {
        A.super.hello();
    }
    public static void main(String[] args){ 
       Clazz clazz = new Clazz(); 
       clazz.hello();
    } 
} 

输出结果是:Hello World from A

总结

默认方法给予我们修改接口而不破坏原来的实现类的结构提供了便利,目前java 8的集合框架已经大量使用了默认方法来改进了,当我们最终开始使用Java 8的lambdas表达式时,提供给我们一个平滑的过渡体验。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    SPRING技术内幕:深入解析SPRING架构与设计原理

    总结来说,深入解析Spring架构与设计原理,不仅需要对Spring的核心概念有透彻的理解,还需要对框架的各个模块和源码有深入的探究。这对于任何一名想要精进Java开发技能的开发者来说,都是不可或缺的知识。通过阅读...

    java8-new-features

    #### 二、深入解析默认方法 **默认方法**: - **定义**:在接口中定义的方法,通过`default`关键字指定其为默认方法,允许接口提供具体实现。 - **目的**:默认方法的存在使得接口可以在不破坏现有实现类的前提下...

    JAVA核心技术讲解

    第八版,即(Core Java 8th Edition),是针对Java 8这一版本进行深入解析的经典教材。Java 8作为Java发展历程中的一个重要里程碑,引入了许多新的特性和改进,使得它在功能性和效率上都有了显著提升。 首先,Java 8...

    狂神说JVM探究.rar

    【狂神说JVM探究】是一份集合了多种格式的学习资料,主要涵盖了Java虚拟机(JVM)的基础知识。这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键...

    java8源码-java8-source-code-read:java8源码阅读

    2. **接口的默认方法**:Java 8允许接口中定义默认方法,这种方法有一个默认的实现,可以避免对已有接口的破坏性修改。这增强了接口的功能,使其能够提供一些基本的行为。 3. **Stream API**:Stream API是Java 8中...

    java从入门到精通(韩顺平视频)笔记整理

    - **HelloWorld程序解析**:通过一个经典的示例介绍了Java语法的基本结构,包括public关键字、类定义、main方法及其执行语句。 #### 第2讲:变量与数据类型 - **数据类型**:Java提供了丰富的基本数据类型,包括...

    JAVA 反编译软件

    2. **Class文件结构**: 每个Java类都对应一个`.class`文件,其中包含了类的元数据、方法定义、字段等信息。了解这些结构对于反编译至关重要。 3. **JVM指令集**: 字节码是由一系列基于JVM的指令构成的,如`aload_0`...

    tom-spring源码文档,阿里java面经.rar

    《深入分析Spring源码》与《最全的阿里Java面经》是两个涵盖Java和Spring技术领域的关键资源,对于理解Spring框架以及准备阿里巴巴的Java面试具有极高的价值。以下是这两个文档可能涉及的重要知识点: 1. **Spring...

    JAVA编程指南.pdf

    8. **打印输出类名陷阱**:System.out.println()打印对象时默认调用toString(),可能需要覆盖该方法以得到期望的输出。 9. **随机数的问题**:如果不正确地设置随机数种子或使用默认种子,可能会得到重复的序列。 ...

    java线程知识详解

    本文将深入解析Java线程的核心概念、创建方式、生命周期、同步机制以及线程管理策略。 首先,Java线程的创建主要有两种方式:通过实现Runnable接口和继承Thread类。实现Runnable接口使得类可以与其他接口一起实现,...

    Spring源代码解析(一):IOC容器.doc

    理解Spring的IOC容器,尤其是BeanFactory接口,有助于深入探究Spring如何管理对象的生命周期、依赖关系和装配过程。通过源代码阅读,我们可以看到Spring如何优雅地将这些复杂的概念转化为可扩展和灵活的代码,从而更...

    JAVA记事本源码加WORD文档

    在IT领域,编程是创造和实现计算机程序的过程,而Java是一种广泛应用的面向对象的编程语言。这个"JAVA记事本源码加WORD...总的来说,这是一个很好的学习资源,对于想要在Java编程领域提升自己的人来说,值得深入探究。

    java毕业设计之智能手机家庭图书管理系统源码.zip

    首先,项目基于Java 1.8版本,这是Oracle公司推出的Java Development Kit(JDK)的一个重要版本,它引入了许多新特性,如Lambda表达式、默认方法、接口的实例字段、类型推断等,这些都极大地提升了Java的编程效率和...

    lucene 全文检索系统 java源码 (信息检索技术)

    **Lucene 全文检索系统:Java 源码与信息检索技术详解** ...通过这份包含 Lucene Java 源码和可执行程序的压缩包,你可以深入学习并掌握 Lucene 的核心概念和技术,从而提升你在信息检索领域的专业能力。

    Optimizeit Profiler简明操作手册

    - 使用“+”按钮展开节点,深入探究方法调用细节。 - 选择关键节点进行细化分析,例如`Graphics2D.fill3DRect`方法的具体调用路径。 通过上述步骤,可以有效地利用Optimizeit Profiler对Java程序进行深度的性能...

    JDK1.8-API.zip

    《深入解析JDK1.8 API》 JDK1.8是Java开发工具包的一个重要版本,它引入了许多创新特性,极大地提升了开发效率和代码质量。API(Application Programming Interface)文档是开发者理解JDK核心库的关键资源,它详细...

    Struts2源码下载

    Struts2是一个非常著名的Java Web开发框架,它基于MVC(Model-View-Controller)设计模式,极大地简化了Java Web应用程序的开发。源码下载对于开发者来说是学习和理解框架内部工作原理的重要途径,能够帮助我们深入...

    myeclipse反编译工具

    综上,myeclipse反编译插件是Java开发者的重要工具,它使开发者能够对已编译的代码进行深入探究,增强开发和调试的效率,尤其是在处理第三方库或旧项目时。了解并熟练使用这样的工具,对于提升开发能力,尤其是解决...

    jdk10api.rar

    本篇将主要围绕JDK 10的API(Application Programming Interface)展开,结合中英文对照的CHM文档,深入解析其关键知识点。 首先,API文档是理解任何编程语言或库的核心工具,它详细列举了所有可用的类、接口、方法...

    spring-boot-demo-master.zip

    《Spring Boot实战:深入解析与应用实践》 Spring Boot作为Spring框架的重要组成部分,以其便捷的启动方式、自动配置和一站式的解决方案,深受开发者喜爱。在本文中,我们将深入探讨Spring Boot的核心特性,以及...

Global site tag (gtag.js) - Google Analytics