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(); } }</pre>
四.引用
(1)Java Default Methods(2)anonymous function
(3)Inheritance Wiki
來自:http://blog.zheezes.com/java-8-new-features-of-default-method.html