1.基本概念默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性。默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性。向现有库的接口添加新功能,并确保与使用旧版本接口编写的代码的二进制兼容性。什么是默认方法(defaultmethods)即接口可以有实现方法,不需要实现类来实现它的方法。只需在方法名称前添加一个default关键字即可。为什么这些方法有默认方法?首先,之前的界面是一把双刃剑。优点是面向抽象而不是具体编程。是的,当你需要修改接口时,你需要修改所有实现该接口的类。Java8之前的当前集合框架没有foreach方法。通常的解决方案是在JDK中的相关接口中添加新的方法和实现。但是,对于已发布的版本,没有办法在不影响现有实现的情况下向接口添加新方法。所以引入默认方法。它们的目的是解决接口修改与现有实现不兼容的问题。二、java8抽象类和接口的区别是一样的:1.都是抽象类型;2.两者都可以有实现方法(仅限java8)3.你不需要实现类或者继承者来实现所有的方法。区别1.抽象类不能有多重继承,但是接口可以(无论是多重类型继承还是多重行为继承);2.通过抽象类和接口体现设计理念不同。实际上,抽象类代表的是“is-a”的关系,接口代表的是“like-a”的关系;3.接口中定义的变量默认是publicstaticfinal,必须赋初值,所以实现类不能,即使重新定义也不能改变它的值;抽象类中的变量默认是友好的,其值可以在子类中重新定义或重新赋值。3.多重继承冲突的解释既然可以从不同的接口中引入同一个方法,自然就会有冲突。默认方法判断冲突的规则如下:1.类中声明的方法优先于任何默认方法(类总是赢)2.否则,首先选择主体的实现。比如下面的例子B重写了A的hello方法。4.如何使用默认方法扩展或实现接口?在扩展一个有默认方法的接口时,可以使用以下三种方法:1:让扩展类继承默认方法,取决于是否有默认方法2:重新声明默认方法成为抽象方法(注意扩展类的实现类必须实现该方法)3:重新定义默认方法,覆盖(override)父类的默认方法5.默认方法示例代码importjava.time.DateTimeException;importjava.time.LocalDateTime;importjava.time.ZoneId;importjava.time.ZonedDateTime;publicinterfaceTimeClient{voidsetTime(inthour,intminute,intsecond);voidsetDate(intday,intmonth,intyear);voidsetDateAndTime(intday,intmonth,intyear,inthour,intminute,intsecond);LocalDateTimegetLocalDateTime();staticZoneIdgetZoneId(Stringzone){try{returnZoneId.of(zoneString);}catch(DateTimeExceptione){System.err.println("Invalidtimezone:"+zoneString+";usingdefaulttimezoneinstead.");returnZoneId.systemDefault();}}defaultZonedDateTimegetZonedDateTime(StringzoneString){returnZonedDateof(getLocalDateTime(),getZoneId(zoneString));}}importjava.time.LocalDate;importjava.time.LocalDateTime;importjava.time.LocalTime;importjava.util.ArrayL是;导入java.util.集合;导入java.util.Comparator;导入java.util.List;publicclassSimpleTimeClientimplementsTimeClient{privateLocalDateTimedateAndTime;publicSimpleTimeClient(){dateAndTime=LocalDateTime.now();}publicvoidsetTime(inthour,intminute,intsecond){LocalDatecurrentDate=LocalDate.from(dateAndTime);LocalTimetimeToSet=LocalTime.of(小时,分钟,秒);dateAndTime=LocalDateTime.of(currentDate,timeToSet);}publicvoidsetDate(intyear,intmonth,intday){LocalDatedateToSet=LocalDate.of(year,month,day);LocalTimecurrentTime=LocalTime.from(dateAndTime);dateAndTime=LocalDateTime.of(dateToSet,currentTime);}publicvoidsetDateAndTime(intyear,intmonth,intday,inthour,intminute,intsecond){LocalDatedateToSet=LocalDate.of(year,month,day);LocalTimetimeToSet=LocalTime.of(小时,分钟,秒);dateAndTime=LocalDateTime.of(dateToSet,timeToSet);}publicLocalDateTimegetLocalDateTime(){returndateAndTime;}publicStringtoString(){返回日期AndTime.toString();}publicstaticvoidmain(String...args){TimeClientclient=newSimpleTimeClient();//显示当前日期和时间System.out.println(client.toString());//设置日期client.setTime(11,12,22);System.out.println(客户端);//设置时间client.setDate(2012,11,12);System.out.println(客户端);System.out.println("TimeinAsia/Shanghai:"+client.getZonedDateTime("Asia/Shanghai").toString());}}6.将默认方法和静态方法集成到现有接口中默认方法使您能够向现有接口添加新功能,确保与使用这些接口的旧版本编写的代码的二进制兼容性特别是,默认方法使您能够添加方法将lambda表达式作为现有接口的参数。以下示例代码说明了Comparator接口如何通过默认方法和静态方法提供丰富的功能。在java8中,Compartor接口提供了丰富的功能,提供了近20个默认或静态方法。之前的版本只提供了比较接口方法compare(To1,To2)。以下代码与扑克游戏有关。部分源码封装了洗牌、排序、分牌、发牌的默认方法;//扑克接口类publicinterfaceCardextendsComparable{publicenumSuit{DIAMONDS(1,"Diamonds"),CLUBS(2,"Clubs"),HEARTS(3,"Hearts"),SPADES(4,"Spades");私有最终值;私人最终字符串文本;西装(intvalue,Stringtext){this.value=value;this.text=文本;}publicintvalue(){returnvalue;}publicStringtext(){returntext;}}publicenumRank{DEUCE(2,"Two"),THREE(3,"Three"),FOUR(4,"Four"),FIVE(5,"五"),六(6,"六"),七(7,"七"),八(8,"八"),九(9,"九"),十(10,"十"),杰克(11,"Jack"),QUEEN(12,"Queen"),KING(13,"King"),ACE(14,"Ace");私有最终值;私人最终字符串文本;Rank(intvalue,Stringtext){this.value=价值;this.text=文本;}publicintvalue(){returnvalue;}publicStringtext(){returntext;}}publicCard.SuitgetSuit();publicCard.RankgetRank();}包默认方法;导入java.util.Comparator;导入java.util.List;导入java.util.Map;//牌牌接口类publicinterfaceDeck{ListgetCards();甲板工厂();整数();voidaddCard(Cardcard);voidaddCards(列表<卡片>卡片);voidaddDeck(Deckdeck);voidshuffle();无效排序();voidsort(比较器c);StringdeckToString();Mapdeal(intplayers,intnumberOfCards)throwsIllegalArgumentException;}包默认方法;导入java.util.Comparator;//先根据rank,再根据suit进行比较如果(补偿值!=0)返回补偿值;elsereturnfirstCard.getSuit().value()-secondCard.getSuit().value();}}包默认方法DS;//扑克牌实例publicclassPlayingCardimplementsCard{privateCard.Rankrank;privateCard.Suitsuit;publicPlayingCard(Card.Rankrank,Card.Suitsuit){this.rank=rank;this.suit=套装;}publicCard.SuitgetSuit(){}publicCard.RankgetRank(){returnrank;}publicbooleanequals(Objectobj){if(objinstanceofCard){if(((Card)obj).getRank()==this.rank&&((Card)obj).getSuit()==this.suit){returntrue;}else{返回假;}}else{returnfalse;}}publicinthashCode(){return((suit.value()-1)*13)+rank.value();}//实际比较接口publicintcompareTo(Cardo){returnthis.hashCode()-o.hashCode();}//重载toStringpublicStringtoString(){returnthis.rank.text()+"of"+this.suit.text();}publicstaticvoidmain(String...args){newPlayingCard(Rank.ACE,Suit.DIAMONDS);newPlayingCard(Rank.KING,Suit.SPADES);}}包默认方法;importjava.util.ArrayList;导入java.util.集合;导入java.util.Comparator;导入java.util.HashMap;导入java.util.List;我mportjava.util.Map;导入java.util.stream.Collectors;//牌牌现实类publicclassStandardDeckimplementsDeck{//扑克牌列表privateListentireDeck;publicStandardDeck(ListexistingList){this.entireDeck=existingList;}publicStandardDeck(){this.entireDeck=newArrayList<>();for(Card.Suits:Card.Suit.values()){for(Card.Rankr:Card.Rank.values()){this.entireDeck.add(newPlayingCard(r,s));}}}publicDeckdeckFactory(){returnnewStandardDeck(newArrayList());}publicintsize(){returnentireDeck.size();}publicListgetCards(){returnentireDeck;}publicvoidaddCard(Cardcard){entireDeck.add(card);}publicvoidaddCards(Listcards){entireDeck.addAll(cards);}publicvoidaddDeck(Deckdeck){ListlistToAdd=deck.getCards();entireDeck.addAll(listToAdd);}publicvoidsort(){Collections.sort(entireDeck);}publicvoidsort(Comparatorc){Collections.sort(entireDeck,c);}publicvoidshuffle(){Collections.shuffle(entireDeck);}//为每个玩家分发卡片publicMapdeal(intplayers,intnumberOfCards)throwsIllegalArgumentException{intcardsDealt=players*numberOfCards;intsizeOfDeck=entireDeck.size();if(cardsDealt>sizeOfDeck){thrownewIllegalArgumentException("Numberofplayers("+players+")timesnumberofcardstobedealt("+numberOfCards+")isgreaterthanthenumberofcardsinthedeck("+sizeOfDeck+").");}//将卡片分成几部分intslices=players+1;如果(cardsDealt==sizeOfDeck)切片=玩家;//根据玩家数量,分配给每个玩家的扑克牌数量Map>dealtDeck=entireDeck.stream().collect(Collectors.groupingBy(card->{intcardIndex=entireDeck.indexOf(card);if(cardIndex>=cardsDealt)return(players+1);elsereturn(cardIndex%players)+1;}));System.out.println(dealtDeck);//ConvertMap>toMapMapmapToReturn=newHashMap<>();对于(inti=1;i<(slices+1);i++){DeckcurrentDeck=deckFactory();currentDeck.addCards(dealtDeck.get(i));mapToReturn.put(i,currentDeck);}returnmapToReturn;}publicStringdeckToString(){returnthis.entireDeck.stream().map(Card::toString).collect(Collectors.joining("\n"));}publicStringtoString(){returndeckToString();}publicstaticvoidmain(String...args){System.out.println("Creatingdeck:");StandardDeckmyDeck=newStandardDeck();myDeck.sort();System.out.println("Sorteddeck");System.out.println(myDeck.deckToString());myDeck.shuffle();myDeck.sort(newSortByRankThenSuit());System.out.println("Sortedbyrank,thenbysuit");System.out.println(myDeck.deckToString());myDeck.shuffle();myDeck.sort(Comparator.comparing(Card::getRank).thenComparing(Comparator.comparing(Card::getSuit)));System.out.println("Sortedbyrank,thenbysuit"+"withstaticanddefaultmethods");System.out.println(myDeck.deckToString());我的Deck.sort(Comparator.comparing(Card::getRank).reversed().thenComparing(Comparator.comparing(Card::getSuit).reversed()));System.out.println("Sortedbyrankreversed,thenbysuit"+"withstaticanddefaultmethods");System.out.println(myDeck.deckToString());myDeck.shuffle();myDeck.sort((firstCard,secondCard)->firstCard.getRank().value()-secondCard.getRank().value());System.out.println(myDeck.deckToString());myDeck.shuffle();myDeck.sort(Comparator.comparing(Card::getRank));System.out.println(myDeck.deckToString());Mapmap=myDeck.deal(4,11);for(Map.Entryitem:map.entrySet()){System.out.println(item.getKey());System.out.println(item.getValue());System.out.println("--------------------------------");}}}七、参考http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.htmlhttp://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods。htmlhttp://docs.oracle.com/javase/tutorial/java/TOC.html原文链接:https://img.ydisp.cn/news/20220914/kizzk1cgv45