日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Java8defaultmethods默認(rèn)方法的概念與代碼解析

一、基本概念  

創(chuàng)新互聯(lián)建站專注于都昌企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城系統(tǒng)網(wǎng)站開發(fā)。都昌網(wǎng)站建設(shè)公司,為都昌等地區(qū)提供建站服務(wù)。全流程按需策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)

Default methods enable you to add new functionality to the interfaces of your libraries and ensure binary compatibility with code written for older versions of those interfaces.

默認(rèn)方法使您能夠添加新的功能到你現(xiàn)有庫(kù)的接口中,并確保與采用老版本接口編寫的代碼的二進(jìn)制兼容性。

什么是默認(rèn)方法(default methods)

即接口可以有實(shí)現(xiàn)方法,而且不需要實(shí)現(xiàn)類去實(shí)現(xiàn)其方法。只需在方法名前面加個(gè)default關(guān)鍵字即可,這些方法默認(rèn)是

為什么要有默認(rèn)方法

為什么要有這個(gè)特性?首先,之前的接口是個(gè)雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當(dāng)需要修改接口時(shí)候,需要修改全部實(shí)現(xiàn)該接口的類,目前的java 8之前的集合框架沒有foreach方法,通常能想到的解決辦法是在JDK里給相關(guān)的接口添加新的方法及實(shí)現(xiàn)。然而,對(duì)于已經(jīng)發(fā)布的版本,是沒法在給接口添加新方法的同時(shí)不影響已有的實(shí)現(xiàn)。所以引進(jìn)的默認(rèn)方法。他們的目的是為了解決接口的修改與現(xiàn)有的實(shí)現(xiàn)不兼容的問題

二、 java 8抽象類與接口的區(qū)別

相同點(diǎn):

1.都是抽象類型;

2.都可以有實(shí)現(xiàn)方法(java8才可以)

3.都可以不需要實(shí)現(xiàn)類或者繼承者去實(shí)現(xiàn)所有方法

不同點(diǎn)

1.抽象類不可以多重繼承,接口可以(無(wú)論是多重類型繼承還是多重行為繼承);

2.抽象類和接口所反映出的設(shè)計(jì)理念不同。其實(shí)抽象類表示的是"is-a"關(guān)系,接口表示的是"like-a"關(guān)系;

3.接口中定義的變量默認(rèn)是public static final 型,且必須給其初值,所以實(shí)現(xiàn)類中不能重新定義,也不能改變其值;抽象類中的變量默認(rèn)是 friendly 型,其值可以在子類中重新定義,也可以重新賦值。

三、多重繼承的沖突說(shuō)明

由于同一個(gè)方法可以從不同接口引入,自然而然的會(huì)有沖突的現(xiàn)象,默認(rèn)方法判斷沖突的規(guī)則如下:

1.一個(gè)聲明在類里面的方法優(yōu)先于任何默認(rèn)方法(classes always win)

2.否則,則會(huì)優(yōu)先選取***體的實(shí)現(xiàn),比如下面的例子 B重寫了A的hello方法。

四、如何擴(kuò)展或?qū)崿F(xiàn)帶有默認(rèn)方法的接口?

當(dāng)前擴(kuò)展一個(gè)默認(rèn)方法的接口時(shí),你可以采用以下三種方式:

1:讓擴(kuò)展類繼承默認(rèn)方法,根據(jù)不管是否存在默認(rèn)方法

2:重新聲明默認(rèn)方法,使其變?yōu)橐粋€(gè)抽象方法(注意,擴(kuò)展類的實(shí)現(xiàn)類必須實(shí)現(xiàn)此方法)

3:重新定義默認(rèn)方法,覆蓋(override)父類的默認(rèn)方法

五、默認(rèn)方法樣例代碼

 
 
  1. import java.time.DateTimeException;
  2. import java.time.LocalDateTime;
  3. import java.time.ZoneId;
  4. import java.time.ZonedDateTime;
  5. public interface TimeClient {
  6.     void setTime(int hour, int minute, int second);
  7.     void setDate(int day, int month, int year);
  8.     void setDateAndTime(int day, int month, int year, int hour, int minute,
  9.             int second);
  10.     LocalDateTime getLocalDateTime();
  11.     static ZoneId getZoneId(String zoneString) {
  12.         try {
  13.             return ZoneId.of(zoneString);
  14.         } catch (DateTimeException e) {
  15.             System.err.println("Invalid time zone: " + zoneString
  16.                     + "; using default time zone instead.");
  17.             return ZoneId.systemDefault();
  18.         }
  19.     }
  20.     default ZonedDateTime getZonedDateTime(String zoneString) {
  21.         return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
  22.     }
  23. }
 
 
  1. import java.time.LocalDate;
  2. import java.time.LocalDateTime;
  3. import java.time.LocalTime;
  4. import java.util.ArrayList;
  5. import java.util.Collections;
  6. import java.util.Comparator;
  7. import java.util.List;
  8. public class SimpleTimeClient implements TimeClient {
  9.     private LocalDateTime dateAndTime;
  10.     public SimpleTimeClient() {
  11.         dateAndTime = LocalDateTime.now();
  12.     }
  13.     public void setTime(int hour, int minute, int second) {
  14.         LocalDate currentDate = LocalDate.from(dateAndTime);
  15.         LocalTime timeToSet = LocalTime.of(hour, minute, second);
  16.         dateAndTime = LocalDateTime.of(currentDate, timeToSet);
  17.     }
  18.     public void setDate(int year, int month, int day) {
  19.         LocalDate dateToSet = LocalDate.of(year, month, day);
  20.         LocalTime currentTime = LocalTime.from(dateAndTime);
  21.         dateAndTime = LocalDateTime.of(dateToSet, currentTime);
  22.     }
  23.     public void setDateAndTime(int year, int month, int day, int hour,
  24.             int minute, int second) {
  25.         LocalDate dateToSet = LocalDate.of(year, month, day);
  26.         LocalTime timeToSet = LocalTime.of(hour, minute, second);
  27.         dateAndTime = LocalDateTime.of(dateToSet, timeToSet);
  28.     }
  29.     public LocalDateTime getLocalDateTime() {
  30.         return dateAndTime;
  31.     }
  32.     public String toString() {
  33.         return dateAndTime.toString();
  34.     }
  35.     public static void main(String... args) {
  36.         TimeClient client = new SimpleTimeClient();
  37.         // 顯示當(dāng)前日期時(shí)間
  38.         System.out.println(client.toString());
  39.         // 設(shè)置日期
  40.         client.setTime(11, 12, 22);
  41.         System.out.println(client);
  42.         // 設(shè)置時(shí)間
  43.         client.setDate(2012, 11, 12);
  44.         System.out.println(client);
  45.         System.out.println("Time in Asia/Shanghai: "
  46.                 + client.getZonedDateTime("Asia/Shanghai").toString());
  47.     }
  48. }

六、整合默認(rèn)方法、靜態(tài)方法到已經(jīng)存在的接口

默認(rèn)方法使您能夠添加新的功能到已經(jīng)存在的接口,確保與采用老版本這些接口編寫的代碼的二進(jìn)制兼容性。特別是,默認(rèn)的方法使您能夠在已經(jīng)存在的接口中添加使用lambda表達(dá)式作為參數(shù)的方法。下面的樣例代碼說(shuō)明通過默認(rèn)方法和靜態(tài)方法,Comparator 接口是如何提供豐富的功能的。

在java8中,Compartor接口提供了豐富的功能,提供了差不多近20個(gè)默認(rèn)或靜態(tài)方法,在以前的版本中僅僅提供了compare(T o1, T o2)一個(gè)比較接口方法

下面的代碼是有關(guān)撲克牌游戲中的洗牌,針對(duì)牌排序,打散,發(fā)牌的部分源代碼

 
 
  1. package defaultmethods;
  2. //撲克牌接口類
  3. public interface Card extends Comparable {
  4.     
  5.     public enum Suit { 
  6.         DIAMONDS (1, "Diamonds"), 
  7.         CLUBS    (2, "Clubs"   ), 
  8.         HEARTS   (3, "Hearts"  ), 
  9.         SPADES   (4, "Spades"  );
  10.         
  11.         private final int value;
  12.         private final String text;
  13.         Suit(int value, String text) {
  14.             this.value = value;
  15.             this.text = text;
  16.         }
  17.         public int value() {return value;}
  18.         public String text() {return text;}
  19.     }
  20.     
  21.     public enum Rank { 
  22.         DEUCE  (2 , "Two"  ),
  23.         THREE  (3 , "Three"), 
  24.         FOUR   (4 , "Four" ), 
  25.         FIVE   (5 , "Five" ), 
  26.         SIX    (6 , "Six"  ), 
  27.         SEVEN  (7 , "Seven"),
  28.         EIGHT  (8 , "Eight"), 
  29.         NINE   (9 , "Nine" ), 
  30.         TEN    (10, "Ten"  ), 
  31.         JACK   (11, "Jack" ),
  32.         QUEEN  (12, "Queen"), 
  33.         KING   (13, "King" ),
  34.         ACE    (14, "Ace"  );
  35.         private final int value;
  36.         private final String text;
  37.         Rank(int value, String text) {
  38.             this.value = value;
  39.             this.text = text;
  40.         }
  41.         public int value() {return value;}
  42.         public String text() {return text;}
  43.     }
  44.     
  45.     public Card.Suit getSuit();
  46.     public Card.Rank getRank();
  47. }
 
 
  1. package defaultmethods;
  2. import java.util.Comparator;
  3. import java.util.List;
  4. import java.util.Map;
  5. //牌桌接口類
  6. public interface Deck {
  7.     
  8.     List getCards();
  9.     Deck deckFactory();
  10.     int size();
  11.     void addCard(Card card);
  12.     void addCards(List cards);
  13.     void addDeck(Deck deck);
  14.     void shuffle();
  15.     void sort();
  16.     void sort(Comparator c);
  17.     String deckToString();
  18.     Map deal(int players, int numberOfCards)
  19.         throws IllegalArgumentException;
  20. }
 
 
  1. package defaultmethods;
  2. import java.util.Comparator;
  3. //先根據(jù)rank,再根據(jù)suit進(jìn)行比較
  4. public class SortByRankThenSuit implements Comparator {
  5.     public int compare(Card firstCard, Card secondCard) {
  6.         int compVal = firstCard.getRank().value()
  7.                 - secondCard.getRank().value();
  8.         if (compVal != 0)
  9.             return compVal;
  10.         else
  11.             return firstCard.getSuit().value() - secondCard.getSuit().value();
  12.     }
  13. }
 
 
  1. package defaultmethods;
  2. //撲克牌實(shí)現(xiàn)類
  3. public class PlayingCard implements Card {
  4.     private Card.Rank rank;
  5.     private Card.Suit suit;
  6.     public PlayingCard(Card.Rank rank, Card.Suit suit) {
  7.         this.rank = rank;
  8.         this.suit = suit;
  9.     }
  10.     public Card.Suit getSuit() {
  11.         return suit;
  12.     }
  13.     public Card.Rank getRank() {
  14.         return rank;
  15.     }
  16.     public boolean equals(Object obj) {
  17.         if (obj instanceof Card) {
  18.             if (((Card) obj).getRank() == this.rank
  19.                     && ((Card) obj).getSuit() == this.suit) {
  20.                 return true;
  21.             } else {
  22.                 return false;
  23.             }
  24.         } else {
  25.             return false;
  26.         }
  27.     }
  28.     public int hashCode() {
  29.         return ((suit.value() - 1) * 13) + rank.value();
  30.     }
  31.     //實(shí)現(xiàn)比較接口
  32.     public int compareTo(Card o) {
  33.         return this.hashCode() - o.hashCode();
  34.     }
  35.     //重載toString
  36.     public String toString() {
  37.         return this.rank.text() + " of " + this.suit.text();
  38.     }
  39.     public static void main(String... args) {
  40.         new PlayingCard(Rank.ACE, Suit.DIAMONDS);
  41.         new PlayingCard(Rank.KING, Suit.SPADES);
  42.     }
  43. }
 
 
  1. package defaultmethods;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.stream.Collectors;
  9. //牌桌實(shí)現(xiàn)類
  10. public class StandardDeck implements Deck {
  11.     //撲克牌列表
  12.     private List entireDeck;
  13.     public StandardDeck(List existingList) {
  14.         this.entireDeck = existingList;
  15.     }
  16.     public StandardDeck() {
  17.         this.entireDeck = new ArrayList<>();
  18.         for (Card.Suit s : Card.Suit.values()) {
  19.             for (Card.Rank r : Card.Rank.values()) {
  20.                 this.entireDeck.add(new PlayingCard(r, s));
  21.             }
  22.         }
  23.     }
  24.     public Deck deckFactory() {
  25.         return new StandardDeck(new ArrayList());
  26.     }
  27.     public int size() {
  28.         return entireDeck.size();
  29.     }
  30.     public List getCards() {
  31.         return entireDeck;
  32.     }
  33.     public void addCard(Card card) {
  34.         entireDeck.add(card);
  35.     }
  36.     public void addCards(List cards) {
  37.         entireDeck.addAll(cards);
  38.     }
  39.     public void addDeck(Deck deck) {
  40.         List listToAdd = deck.getCards();
  41.         entireDeck.addAll(listToAdd);
  42.     }
  43.     public void sort() {
  44.         Collections.sort(entireDeck);
  45.     }
  46.     public void sort(Comparator c) {
  47.         Collections.sort(entireDeck, c);
  48.     }
  49.     public void shuffle() {
  50.         Collections.shuffle(entireDeck);
  51.     }
  52.     //為每位玩家分牌
  53.     public Map deal(int players, int numberOfCards)
  54.             throws IllegalArgumentException {
  55.         int cardsDealt = players * numberOfCards;
  56.         int sizeOfDeck = entireDeck.size();
  57.         
  58.         if (cardsDealt > sizeOfDeck) {
  59.             throw new IllegalArgumentException("Number of players (" + players
  60.                     + ") times number of cards to be dealt (" + numberOfCards
  61.                     + ") is greater than the number of cards in the deck ("
  62.                     + sizeOfDeck + ").");
  63.         }
  64.         //把牌分成幾份
  65.         int slices=players+1;
  66.         if(cardsDealt == sizeOfDeck)
  67.             slices=players;
  68.         //根據(jù)玩家的個(gè)數(shù),每個(gè)玩家分到的撲克牌數(shù)進(jìn)行分牌
  69.         Map> dealtDeck = entireDeck.stream().collect(
  70.                 Collectors.groupingBy(card -> {
  71.                     int cardIndex = entireDeck.indexOf(card);
  72.                     if (cardIndex >= cardsDealt)
  73.                         return (players + 1);
  74.                     else
  75.                         return (cardIndex % players) + 1;
  76.                 }));
  77.         System.out.println(dealtDeck);
  78.         // Convert Map> to Map
  79.         Map mapToReturn = new HashMap<>();
  80.         for (int i = 1; i < (slices + 1); i++) {
  81.             Deck currentDeck = deckFactory();
  82.             currentDeck.addCards(dealtDeck.get(i));
  83.             mapToReturn.put(i, currentDeck);
  84.         }
  85.         return mapToReturn;
  86.     }
  87.     public String deckToString() {
  88.         return this.entireDeck.stream().map(Card::toString)
  89.                 .collect(Collectors.joining("\n"));
  90.     }
  91.     
  92.     public String toString(){
  93.         return deckToString();
  94.     }
  95.     public static void main(String... args) {
  96.         System.out.println("Creating deck:");
  97.         StandardDeck myDeck = new StandardDeck();
  98.         
  99.         myDeck.sort();
  100.         System.out.println("Sorted deck");
  101.         System.out.println(myDeck.deckToString());
  102.         
  103.         myDeck.shuffle();
  104.         myDeck.sort(new SortByRankThenSuit());
  105.         System.out.println("Sorted by rank, then by suit");
  106.         System.out.println(myDeck.deckToString());
  107.         
  108.         myDeck.shuffle();
  109.         myDeck.sort(Comparator.comparing(Card::getRank).thenComparing(
  110.                 Comparator.comparing(Card::getSuit)));
  111.         System.out.println("Sorted by rank, then by suit "
  112.                 + "with static and default methods");
  113.         System.out.println(myDeck.deckToString());
  114.         myDeck.sort(Comparator.comparing(Card::getRank).reversed()
  115.                 .thenComparing(Comparator.comparing(Card::getSuit).reversed()));
  116.         System.out.println("Sorted by rank reversed, then by suit "
  117.                 + "with static and default methods");
  118.         System.out.println(myDeck.deckToString());
  119.         
  120.         myDeck.shuffle();
  121.         myDeck.sort(
  122.             (firstCard, secondCard) ->
  123.                 firstCard.getRank().value() - secondCard.getRank().value()
  124.         ); 
  125.         System.out.println(myDeck.deckToString());
  126.         
  127.         myDeck.shuffle();
  128.         myDeck.sort(Comparator.comparing(Card::getRank));
  129.         System.out.println(myDeck.deckToString());
  130.         
  131.         Map map=myDeck.deal(4, 11);
  132.         for(Map.Entry item:map.entrySet()){
  133.             System.out.println(item.getKey());
  134.             System.out.println(item.getValue());
  135.             System.out.println("-------------------------------");
  136.         }
  137.     }
  138. }

七、參考

http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html

http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

http://docs.oracle.com/javase/tutorial/java/TOC.html


本文標(biāo)題:Java8defaultmethods默認(rèn)方法的概念與代碼解析
分享鏈接:http://m.5511xx.com/article/dhcpipo.html