Java 8新特性之default method
一.前言
Java 8终于在2014-03-19正式发布,最大的特性是支持”Lambda”表达式,Java面向对象的特性退化,但编码与执行效率大大提高,同时带来了一个非常实用的副产品”Default Methods”。
二.实现与继承
“继承”(Inheritance)是面向对象程序设计广泛引入的一个概念,C++中只有继承,且C++允许多重继承,即可以继承多个父类,这种设计导致程序可能会出现菱形继承等冲突,但C++还是坚持把问题交给软件开发者,不认为这是语言的问题,而是设计的问题。
Java作为面向对象偏学院派的的设计语言,对C++进行了简化和优化,将继承分割为两个概念”实现”(interface)与”继承”(extends),严格的区分了interface和extends的作用和行为,一个对象(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)父interface的default方法。
(3)class能实现(implements)多个interface,但必须保证所有的interface不存在同样的方法(包括名称和参数),避免出现运行时冲突。
(4)class可以覆盖(Override)interface的default方法。
简单的例子如下:
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