Java 8新特性之default method

jopen 10年前發布 | 21K 次閱讀 Java 8 Java開發

.前言

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(); } }</pre>

.引用

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


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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!