默认方法

  Java程序的接口是将相关方法按照约定组合到一起的方式,实现接口的类必须为接口中定义的每个方法提供一个实现,或从父类中继承它的实现。

  Java8允许接口内声明静态方法,还引入了默认方法的功能。默认方法用default修饰。

  变更对Java程序的影响大体可以分成三种类型的兼容性:二进制级的兼容,源代码级的兼容以及函数行为的兼容。向接口中添加新方法是二进制级的兼容。二进制级的兼容表示现有的二进制执行文件能无缝持续链接。源代码级的兼容性表示引入变化后,现有的程序依然能成功编译通过。函数行为的兼容性表示变更发生后,程序接受同样的输入能得到同样的结果。

  

  接口包含的方法签名在它的实现类中也可以不提供实现。实际上,缺失的方法实现会作为接口的一部分由实现类继承,而无需由实现类提供。

  抽象类和抽象接口的区别

    一个类只能继承一个抽象类,但是一个类可以实现多个接口

    一个抽象类可以通过实例变量保存一个通用状态,而接口是不可以有实例变量的

  默认方法的两种应用场景:可选方法和行为的多继承。

    在Java8中,Iterator接口为remobe方法提供了一个默认的实现

 

  代理是创建一个类,通过该类的成员变量直接调用该类的方法。

  声明为final的类不能被其它的类继承。

  若一个类使用相同的函数签名从多个地方继承了方法,此时应按照如下规则:

    类或父类中显式声明的方法优先级最高

    若类或父类中没有声明方法,则提供最具体实现的默认方法的接口优先级最高

    若冲突依旧无法解决,则只能显示地指定在类中应使用哪个接口中的方法(Java引入了Class.super.method()方法调用父类接口中的方法)

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

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

public class C implements B, A{
  void hello(){
    B.super.hello();
  }
}
时间: 2024-08-03 15:02:26

默认方法的相关文章

接口的默认方法

Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法.这种能力是向后兼容的,以便旧接口可以使用Java 8的lambda表达式功能. 例如,List和Collection没有foreach方法 public interface vehicle { default void print(){ System.out.println("I am a vehicle!"); } } 静态默认方法 public interface ve

Java 8 默认方法和多继承深入解析

以前经常谈论的Java对比c++的一个优势是Java中没有多继承的问题. 因为Java中子类只能继承(extends)单个父类, 尽管可以实现(implements)多个接口,但是接口中只有抽象方法,方法体是空的,没有具体的方法实现,不会有方法冲突的问题. 这些都是久远的说法了,自从今年Java 8发布后, 接口中也可以定义方法了(default method). 之所以打破以前的设计在接口中增加具体的方法, 是为了既有的成千上万的Java类库的类增加新的功能, 且不必对这些类重新进行设计. 比

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新特性——接口的默认方法和类方法

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

Java 8 - Interface Default Method接口默认方法

Java 8 相比于Java 7 推出了几大特色(features)(接口默认方法)default methods in interface, (接口静态方法)static method in interface, 函数编程(functional programming), lamda expression, stream API. 这里首先介绍以下默认接口方法 1.什么是默认接口方法 java 8 允许在接口定义并编写实现方法.例子: interface Collection{ void ad

java8之lambda表达式(默认方法)

许多开发语言都将函数表达式集成到了其集合库中.这样比循环方式所需的代码更少,并且更加容易理解.以下面的循环为例: for(int i = 0; i < list.size(); i++)      System.out.println(list.get(i)); 事实上有一种更好的方式.API开发人员可以提供一个forEach方法,用来将一个函数应用到集合的每个元素上.下面是使用这种方式编写的一个简单调用: package java8test; import java.util.Arrays;

Java8接口中的默认方法

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

Java8默认方法

Java8引入的接口默认方法实现一个新的概念.此功能是为了向后兼容性增加,使旧接口可用于利用JAVA8. lambda表达式的能力,例如,列表或集合接口不具备forEach方法声明.从而增加了这样的方法只会打破收集框架实现. Java8引入了默认的方法使列表/Collection接口可以拥有forEach默认方法,并实行类实现这些接口不需要实现相同功能. 语法 public interface vehicle { default void print(){ System.out.println(

深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

最近看了一下java 8的一些新特性,其中最重要的莫过于Lambda表达式了,通过一阵子的学习,原本准备自己写一篇博客的,后来阅读了一位学长翻译过来的博客(原文是Brain Goetz的State of Lambda,下面会给出原文链接),觉得写的十分完美,把我想要写的和我没想到的都罗列了出来,就把这个分享给大家了. 注:原译文见  http://lucida.me/blog/java-8-lambdas-insideout-language-features/ 英语原版见:http://cr.

纠结的默认方法

[编程导论(Java)·4.3Java接口] 在[0.3.1 Java简介]中,有这么一段话:"请注意:Java并非作为教学语言设计的.世界各地的大学在讲授Java的过程中均遇到一些教学上的困难(如Java语言和API的快速升级),这些困难是计算机科学教育中一般性的挑战." Java8中引入的默认方法,充分展示了Java平台概念的一致性与JDK向前兼容之间的矛盾,而且以牺牲概念的一致性而满足JDK向前兼容. 其后果是原有的Java语言设计思路被破坏,Java接口与抽象类的区别被抹杀.