亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

30分鐘入門Java8之默認(rèn)方法和靜態(tài)接口方法學(xué)習(xí)

 更新時(shí)間:2017年04月07日 09:06:48   作者:JohnTsai  
這篇文章主要介紹了30分鐘入門Java8之默認(rèn)方法和靜態(tài)接口方法學(xué)習(xí),詳細(xì)介紹了默認(rèn)方法和接口,有興趣的可以了解一下。

前言

上一篇文章30分鐘入門Java8之lambda表達(dá)式,我們學(xué)習(xí)了lambda表達(dá)式。現(xiàn)在繼續(xù)Java8新語言特性的學(xué)習(xí),今天,我們要學(xué)習(xí)的是默認(rèn)方法和靜態(tài)接口方法。

這一Java8的新語言特性,在Android N中也得到了支持。至于如何在Android開發(fā)中配置Java8的開發(fā)環(huán)境,請(qǐng)查看上一篇文章30分鐘入門Java8之lambda表達(dá)式。

默認(rèn)方法

默認(rèn)方法讓我們能給我們的軟件庫的接口增加新的方法,并且能保證對(duì)使用這個(gè)接口的老版本代碼的兼容性。

下面通過一個(gè)簡(jiǎn)單的例子來深入理解下默認(rèn)方法:

1.一天,PM說我們的產(chǎn)品需要獲取時(shí)間和日期。于是我們就寫了一個(gè)設(shè)置和獲取日期時(shí)間的接口類 TimeClient 。

 public  interface  TimeClient { 

    void setTime(int hour,int  minute,  int  second); 

    void  setDate( int  day,  int  month,  int  year); 

    void  setDateAndTime( int  day,  int  month,  int  year, 

              int  hour,  int  minute,  int  second); 

    LocalDateTime getLocalDateTime(); 

 } 

以及這個(gè)接口的實(shí)現(xiàn)類 SimpleTimeClient :

public  class  SimpleTimeClient  implements  TimeClient {

    private  LocalDateTime localDateTime;

    public  SimpleTimeClient(){ 

      localDateTime = LocalDateTime.now(); 

    } 

    @Override 

    public  void  setTime( int  hour,  int  minute,  int  second) { 

      LocalTime localTime = LocalTime.of(hour, minute, second); 

      LocalDate localDate = LocalDate.from(localDateTime); 

      localDateTime = LocalDateTime.of(localDate,localTime); 

    } 

 

    @Override 

    public  void  setDate( int  day,  int  month,  int  year) { 

      LocalDate localDate = LocalDate.of(day, month, year); 

      LocalTime localTime = LocalTime.from(localDateTime); 

      localDateTime = LocalDateTime.of(localDate, localTime); 

    } 

 

    @Override 

    public  void  setDateAndTime( int  day,  int  month,  int  year,  int  hour,  int  minute,  int  second) { 

      LocalDate localDate = LocalDate.of(day, month, year); 

      LocalTime localTime = LocalTime.of(hour, minute, second); 

      localDateTime = LocalDateTime.of(localDate, localTime); 

    } 

 

    @Override 

    public  LocalDateTime getLocalDateTime() { 

      return  localDateTime; 

    } 

 

    @Override 

    public  String toString() { 

      return  localDateTime.toString(); 

    } 

 

    public  static  void  main(String[] args) { 

      TimeClient timeClient =  new  SimpleTimeClient(); 

      System.out.println(timeClient.toString()); 

    } 

 } 

2.可是PM說我們這個(gè)產(chǎn)品吶,不光國內(nèi)用,各種其他時(shí)區(qū)的顧客也會(huì)使用。于是給你增加了新的需求:獲取指定時(shí)區(qū)的日期和時(shí)間

以往我們都會(huì)這么做:

重寫接口,增加方法

 public interface TimeClient { 

    void setTime(int hour,int minute,int second); 

    void setDate(int day,int month,int year); 

    void setDateAndTime(int day,int month,int year,int hour, int minute,int second); 

    LocalDateTime getLocalDateTime(); 

    //新增的方法              

    ZonedDateTime getZonedDateTime(String zoneString); 

 }

這樣我們的實(shí)現(xiàn)類也要相應(yīng)的進(jìn)行重寫。

 public  class  SimpleTimeClient  implements  TimeClient {

    private  LocalDateTime localDateTime; 

    ... 

    ZonedDateTime getZonedDateTime(String zoneString){ 

     return  ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); 

    }    

    static  ZoneId getZoneId (String zoneString) { 

      try  { 

        return  ZoneId.of(zoneString); 

      }  catch  (DateTimeException e) { 

        System.err.println( "Invalid time zone: "  + zoneString + 

          "; using default time zone instead." ); 

        return  ZoneId.systemDefault(); 

      } 

    }   

  } 

這樣寫會(huì)導(dǎo)致我們要去重寫每個(gè)實(shí)現(xiàn)了 TimeClient 接口的類。而這大大增加了我們的實(shí)現(xiàn)需求的負(fù)擔(dān)。

正是為了解決Java接口中只能定義抽象方法的問題。Java8新增加了默認(rèn)方法的特性。下面讓我們來使用默認(rèn)方法實(shí)現(xiàn)需求。

 public  interface  TimeClient { 

    void  setTime( int  hour,  int  minute,  int  second); 

    void  setDate( int  day,  int  month,  int  year); 

    void  setDateAndTime( int  day,  int  month,  int  year, 

      int  hour,  int  minute,  int  second); 

    LocalDateTime getLocalDateTime();              

    static  ZoneId getZoneId (String zoneString) { 

      try  { 

        return  ZoneId.of(zoneString); 

      }  catch  (DateTimeException e) { 

        System.err.println( "Invalid time zone: "  + zoneString + 

          "; using default time zone instead." ); 

        return  ZoneId.systemDefault(); 

      } 

    } 

    //默認(rèn)方法 

    default  ZonedDateTime getZonedDateTime(String zoneString) { 

      return  ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); 

    } 

 } 

默認(rèn)方法關(guān)鍵字為 default ,以往我們只能在接口中定義只有聲明沒有實(shí)現(xiàn)的方法。有了默認(rèn)方法,我們就能編寫完整的方法。

這樣我們就不需要修改繼承接口的實(shí)現(xiàn)類,就給接口添加了新的方法實(shí)現(xiàn)。

 public  static  void  main(String[] args) { 

      TimeClient timeClient =  new  SimpleTimeClient(); 

      System.out.println(timeClient.toString()); 

      System.out.println(timeClient.getZonedDateTime( "test" )); 

    } 

繼承含有默認(rèn)方法的接口

當(dāng)我們繼承含有默認(rèn)方法的接口時(shí),一般有以下三種情況

不去管默認(rèn)方法,繼承的接口直接繼承默認(rèn)方法

 //1.不去管默認(rèn)方法 
 public  interface  AnotherTimeClient  extends  TimeClient{ 

 } 

通過下面的測(cè)試代碼,我們知道AnotherTimeClient接口直接繼承了TimeClient接口的默認(rèn)方法 getZonedDateTime

 Method[] declaredMethods = AnotherTimeClient. class .getMethods(); 

      for (Method method:declaredMethods){ 

        System.out.println(method.toString()); 

      }  

 //output: 

 //public default java.time.ZonedDateTime xyz.johntsai.lambdademo.TimeClient.getZonedDateTime(java.lang.String) 

重新聲明默認(rèn)方法,這樣會(huì)使得這個(gè)方法變成抽象方法

 //重新聲明默認(rèn)方法,使之變?yōu)槌橄蠓椒?

 public  interface  AbstractZoneTimeClient  extends  TimeClient{ 

    @Override 

    ZonedDateTime getZonedDateTime(String zoneString); 

 } 

測(cè)試可以發(fā)現(xiàn) getZonedDateTime 方法由默認(rèn)方法變?yōu)榱顺橄蠓椒?

 Method[] methods = AbstractZoneTimeClient. class .getMethods(); 

      for (Method method:methods){ 

        System.out.println(method.toString()); 

      } 

 //output:    

 //public abstract java.time.ZonedDateTime xyz.johntsai.lambdademo.AbstractZoneTimeClient.getZonedDateTime(java.lang.String) 

重新定義默認(rèn)方法,這樣會(huì)使得方法被重寫

 //3.重新定義默認(rèn)方法 

 public  interface  HandleInvalidZoneTimeClient  extends  TimeClient { 

    default  ZonedDateTime getZonedDateTime(String zoneString){ 

      try  { 

        return  ZonedDateTime.of(getLocalDateTime(), ZoneId.of(zoneString)); 

      }  catch  (DateTimeException e) { 

        System.err.println( "Invalid zone ID: "  + zoneString + 

            "; using the default time zone instead." ); 

        return  ZonedDateTime.of(getLocalDateTime(),ZoneId.systemDefault()); 

      } 

    } 

 } 

實(shí)現(xiàn) HandleInvalidZoneTimeClient 接口的類將擁有重寫過的 getZonedDateTime 方法。

靜態(tài)方法

在Java8的接口中,我們不光能寫默認(rèn)方法,還能寫靜態(tài)方法。上面的例子中正好用到了靜態(tài)方法。

 public  interface  TimeClient { 

    // ... 

    static  public  ZoneId getZoneId (String zoneString) { 

      try  { 

        return  ZoneId.of(zoneString); 

      }  catch  (DateTimeException e) { 

        System.err.println( "Invalid time zone: "  + zoneString + 

          "; using default time zone instead." ); 

        return  ZoneId.systemDefault(); 

      } 

    } 

 

    default  public  ZonedDateTime getZonedDateTime(String zoneString) { 

      return  ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString)); 

    }   

 } 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java源碼解析ConcurrentHashMap的初始化

    Java源碼解析ConcurrentHashMap的初始化

    今天小編就為大家分享一篇關(guān)于Java源碼解析ConcurrentHashMap的初始化,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 自定義Jackson的ObjectMapper如何實(shí)現(xiàn)@ResponseBody的自定義渲染

    自定義Jackson的ObjectMapper如何實(shí)現(xiàn)@ResponseBody的自定義渲染

    這篇文章主要介紹了自定義Jackson的ObjectMapper如何實(shí)現(xiàn)@ResponseBody的自定義渲染,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java使用Graphics2D繪圖/畫圖方式

    java使用Graphics2D繪圖/畫圖方式

    這篇文章主要介紹了java使用Graphics2D繪圖/畫圖方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java調(diào)用7zip解壓壓縮包的實(shí)例

    java調(diào)用7zip解壓壓縮包的實(shí)例

    下面小編就為大家?guī)硪黄猨ava調(diào)用7zip解壓壓縮包的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • spring boot--從controller到DAO操作

    spring boot--從controller到DAO操作

    這篇文章主要介紹了spring boot--從controller到DAO操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 淺談Spring Data JPA與MyBatisPlus的比較

    淺談Spring Data JPA與MyBatisPlus的比較

    本文主要介紹了淺談Spring Data JPA 與 MyBatisPlus的比較
    2024-08-08
  • 解決springcloud-gateway限流遇到的問題

    解決springcloud-gateway限流遇到的問題

    這篇文章主要介紹了解決springcloud-gateway限流遇到的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java代理模式的深入了解

    Java代理模式的深入了解

    這篇文章主要為大家介紹了Java代理模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Java 繼承原理與用法實(shí)例分析

    Java 繼承原理與用法實(shí)例分析

    這篇文章主要介紹了Java 繼承原理與用法,結(jié)合實(shí)例形式分析了java面向?qū)ο蟪绦蛟O(shè)計(jì)中繼承的概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-06-06
  • 從Java到JSON一起探索Jackson的魔力

    從Java到JSON一起探索Jackson的魔力

    Jackson是一個(gè)用于處理JSON數(shù)據(jù)的開源Java庫,這篇文章主要為大家介紹了Java是如何利用Jackson處理JSON數(shù)據(jù)的,感興趣的小伙伴可以了解一下
    2023-05-05

最新評(píng)論