Java 8新特性之default method

jopen 10年前

.前言

Java 8终于在2014-03-19正式发布,最大的特性是支持”Lambda”表达式,Java面向对象的特性退化,但编码与执行效率大大提高,同时带来了一个非常实用的副产品”Default Methods”

.实现与继承

继承”(Inheritance)是面向对象程序设计广泛引入的一个概念,C++中只有继承,且C++允许多重继承,即可以继承多个父类,这种设计导致程序可能会出现菱形继承等冲突,但C++还是坚持把问题交给软件开发者,不认为这是语言的问题,而是设计的问题。

Java作为面向对象偏学院派的的设计语言,对C++进行了简化和优化,将继承分割为两个概念实现”(interface)继承”(extends),严格的区分了interfaceextends的作用和行为,一个对象(class)可以实现多个接口(interface),但只能继承一个父类。一定程度上简化了设计,从语言上避免了复杂的继承问题,也对应了学术意义上继承的两个侧面,一是表现的继承(interface),一是行为的继承(extends)。但真实的编码中则产生了一些不便,由于单例继承,导致需要复写很多代码。

这个理念的鸿沟,终于在Java 8中被打破了,Java不再坚持严格的interface,允许interface完成一些方法,比如List的方法filter, forEach, sorted,直接在interface中完成,而不是在每一个实现List的抽象类中复写同样的代码。少了一些学术思想,多了一些实用意义。

.default方法

interface实现代码是通过”Default Methods”来完成的,主要的特性如下:

(1)interface能实现一些default方法,用于完成interface自身能实现的功能,而不必再所有抽象类中复写一遍。

(2)interface能够继承(extends)interface,能覆盖(Override)interfacedefault方法。

(3)class能实现(implements)多个interface,但必须保证所有的interface不存在同样的方法(包括名称和参数),避免出现运行时冲突。

(4)class可以覆盖(Override)interfacedefault方法。

简单的例子如下:

package com.zheezes.demo.lang.intmet;     /*  * 1.interface can define default method  */  interface Inter1 {      default void show() {          System.out.println(Inter1.class.getSimpleName());      }  }     interface Inter2 {      default void show() {          System.out.println(Inter2.class.getSimpleName());      }  }     /*  * 1.interface can extends from another  * 2.interface can override parent's method  */  interface Inter3 extends Inter1 {      @Override      default void show() {          System.out.println(Inter3.class.getSimpleName());      }  }     interface Inter4 {      default void showlo() {          System.out.println(Inter4.class.getSimpleName());      }  }     /*  * 1.class can implements more then 1 interface  * 2.class can't implements some interface which has same method  * or you will get error: "can't implements two interface which has same method, or you will get  * "Duplicate default methods named show with the parameters () and ()  * are inherited from the types Inter2 and Inter3"  */  class Clazz1 implements Inter3/* , Inter2 */, Inter4 {      public void test() {          Clazz1 demo = new Clazz1();          demo.show(); // print "Inter3"          demo.showlo(); // print "Inter4"      }  }     class Clazz2 implements Inter1 {      /*       * 1.class can override interface's default method       * 2.implement method must be public       * or you will get error: "Cannot reduce the visibility of the inherited method from Inter1"       */      @Override      /*private*/ public void show() {          System.out.println(Clazz2.class.getSimpleName());      }         public void test() {          Clazz2 demo = new Clazz2();          demo.show(); // print "Clazz2"      }  }     public class Demo1 {      public static void main(String[] args) {          new Clazz1().test();          new Clazz2().test();      }  }

.引用

(1)Java Default Methods
(2)anonymous function
(3)Inheritance Wiki


来自:http://blog.zheezes.com/java-8-new-features-of-default-method.html