发布于 2016-07-14 11:36:02 | 156 次阅读 | 评论: 0 | 来源: 网友投递

这里有新鲜出炉的Java函数式编程,程序狗速度看过来!

Java程序设计语言

java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。


这篇文章主要介绍了Java8中的default方法详解,Java 8新增了default方法,它可以在接口添加新功能特性,而且还不影响接口的实现类,需要的朋友可以参考下

Java 8新增了default方法,它可以在接口添加新功能特性,而且还不影响接口的实现类。下面我们通过例子来说明这一点。



public class MyClass implements InterfaceA {

 public static void main(String[] args){

 }

 

 @Override

 public void saySomething() {

  // TODO Auto-generated method stub

 }

}

interface InterfaceA{
 public void saySomething();
}

上面的代码显示了MyClass类实现了InterfacesA接口的saySomething()方法。现在我们为InterfacesA接口新增一个sayHi()方法。这么做的话,MyClass类是无法通过编译的,除非我们提供了sayHi()的实现方法。

Default方法是非常有用的,通过在接口定义的方法的访问修饰符前加上关键字default,那么实现类就无需提供该方法的实现了。比如:



public class MyClass implements InterfaceA {

 public static void main(String[] args){

 }

 

 @Override

 public void saySomething() {

  // TODO Auto-generated method stub

 }

}

interface InterfaceA{
 public void saySomething();
 default public void sayHi(){
  System.out.println("Hi");
 }
}

要注意,我们必须提供所有的default方法的实现。因此,default方法使我们的代码更加灵活,在接口中也可以写方法实现了。实现的方法会作为默认的方法实现。
那么,多接口存在冲突该怎么办?

由于Java类可以实现多个接口,那么就可能存在这样的情况:两个或多个接口都有一个同名的default接口方法,从而造成冲突。因为Java虚拟机在程序运行时,并不清楚你要使用哪一个default方法。这会导致编译错误。

让我们来看看下面的例子。



public class MyClass implements InterfaceA, InterfaceB {

 public static void main(String[] args){

  MyClass mc = new MyClass();

  mc.sayHi();

 }

 

 @Override

 public void saySomething() {

  // TODO Auto-generated method stub

 }

}

interface InterfaceA{
 public void saySomething();
 default public void sayHi(){
  System.out.println("Hi from InterfaceA");
 }
}

interface InterfaceB{
 default public void sayHi(){
  System.out.println("Hi from InterfaceB");
 }
}

它是通不过编译的,会报以下错误:
“Duplicate default methods named sayHi with the parameters () and () are inherited from the types InterfaceB and InterfaceA.”
除非在MyClass类中重写了sayHi()方法:



public class MyClass implements InterfaceA, InterfaceB {

 public static void main(String[] args){

  MyClass mc = new MyClass();

  mc.sayHi();

 }

 

 @Override

 public void saySomething() {

  // TODO Auto-generated method stub

 }

 

 @Override

 public void sayHi(){

  System.out.println("implemetation of sayHi() in MyClass");

 }

}

interface InterfaceA{
 public void saySomething();
 default public void sayHi(){
  System.out.println("Hi from InterfaceA");
 }
}

interface InterfaceB{
 default public void sayHi(){
  System.out.println("Hi from InterfaceB");
 }
}

如果想指定调用哪一个接口的sayHi()方法,我们可以这么做:



public class MyClass implements InterfaceA, InterfaceB {

 public static void main(String[] args){

  MyClass mc = new MyClass();

  mc.sayHi();

 }

 

 @Override

 public void saySomething() {

  // TODO Auto-generated method stub

 }

 

 @Override

 public void sayHi(){

  InterfaceA.super.sayHi();

 }

}

interface InterfaceA{
 public void saySomething();
 default public void sayHi(){
  System.out.println("Hi from InterfaceA");
 }
}

interface InterfaceB{
 default public void sayHi(){
  System.out.println("Hi from InterfaceB");
 }
}

答案是不是很简单呢?



最新网友评论  共有(0)条评论 发布评论 返回顶部
推荐阅读
最新资讯

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务