91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JDK1.8有哪些新特性

發布時間:2021-06-26 13:58:40 來源:億速云 閱讀:181 作者:chen 欄目:編程語言

本篇內容主要講解“JDK1.8有哪些新特性”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JDK1.8有哪些新特性”吧!

一、接口可以升級嗎?

在《Java編程思想·第4版》一書中提到:

interface這個關鍵字產生一個完全抽象的類,它根本就沒有提供任何具體的實現。它允許創建者確定方法名、參數列表和返回類型,但是沒有任何方法體。接口只提供了形式,而未提供任何具體實現。

我們在Java入門學習時,也知道接口只提供方法的聲明,具體實現必須在對應的實現類中實現。實現接口的類必須為接口中定義的每個方法提供一個實現,否則就連編譯都無法通過。

隨著之前定義的接口,被廣泛實現使用,一旦需要升級接口,在接口中新增方法,將不得不通知所有實現類來實現該新增方法。想象一下,你作為一個接口實現者,愿意莫名其妙的來實現一些自己壓根就沒用的方法么?這簡直就會讓人抓狂、瘋掉!難道就沒有解決辦法了么?

且慢,其實你不必抓狂。JDK1.8的出現,解決了這些問題,從中引入了一種新的機制。JDK1.8中的接口支持在聲明方法的同時提供實現,通過兩種方式可以完成這種操作:

  • JDK1.8允許在接口內聲明靜態方法。

  • JDK1.8引入了一個新功能,叫默認方法,通過默認方法可以指定接口方法的默認實現。

換句話說,接口中能夠提供方法的具體實現。因此,實現接口的類如果不顯示提供該方法的具體實現,就會自動繼承默認的實現。

默認方法的出現可以使你輕松、平滑地進行接口的優化、升級。

實際上,從你使用JDK1.8開始就已經使用了多個默認方法,比如List接口中的sort方法、以及Collection接口中的Stream。

public interface List<e> extends Collection<e> {
	……
    default void sort(Comparator<!--? super E--> c) {
        Object[] a = this.toArray();
        Arrays.sort(a, (Comparator) c);
        ListIterator<e> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }
    ……
}

可以看到,這個新增的sort方法有方法體,由default修飾符修飾,這就是接口的默認方法。

太開心了,在JDK1.8之后,接口居然可以這么輕松升級啦。

二、接口如何升級呢?

假如在一個繪圖庫中,存在一個接口Resizable,它定義了一個簡單的可縮放形狀必須支持的很多方法, 比如:setHeight、setWidth、getHeight、getWidth等。

此外,你還提供了幾個額外的實現,如正方形、長方形。由于你的庫非常流行,被廣為流傳,你的一些用戶使用Resizable接口,創建了他們自己感興趣的實現,比如橢圓。

接口Resizable如下:

public interface Resizable { 
     int getWidth(); 
     int getHeight(); 
     void setWidth(int width); 
     void setHeight(int height); 
     void setAbsoluteSize(int width, int height);
}

你的一位鐵桿用戶根據自身的需求實現了Resizable接口,創建了Ellipse類:

public class Ellipse implements Resizable { 
	 … 
}

他實現了一個處理各種Resizable形狀(包括Ellipse)的游戲:

JDK1.8有哪些新特性

庫上線使用幾個月之后,你收到很多請求,要求你更新Resizable的實現,讓Square、Rectangle以及其他的形狀都能支持setRelativeSize方法。為了滿足這些新的需求,你不得不來升級你接口。

如果直接在接口Resizable中,新增setRelativeSize方法:

public interface Resizable { 
     int getWidth(); 
     int getHeight(); 
     void setWidth(int width); 
     void setHeight(int height);
     void setAbsoluteSize(int width, int height);
     // 新增方法
     void setRelativeSize(int wFactor, int hFactor);
}

將會導致一系列的問題,不得不要求接口的實現者(庫用戶)強制來添加setAbsoluteSize方法的實現,這肯定是不太現實的升級方法。

這時,我們想到了默認方法,便可以解決上面這種問題。不但滿足了新用戶的需求,而且也兼容了老用戶。

public interface Resizable { 
     int getWidth(); 
     int getHeight(); 
     void setWidth(int width); 
     void setHeight(int height);
     void setAbsoluteSize(int width, int height);
     // 新增方法setRelativeSize,即:采用默認方法
     default void setRelativeSize(int wFactor, int hFactor){ 
 		setAbsoluteSize(getWidth() / wFactor, getHeight() / hFactor); 
	}
}

如果用戶對方法setRelativeSize的功能有新的想法,自己完全也可以重寫該方法。

完美,至此升級完成!

三、默認方法的妙用

默認方法的引入就是為了以兼容的方式解決像 Java API這樣的類庫的演進問題的,如下圖所示:

JDK1.8有哪些新特性

簡而言之,升級接口中的方法是諸多問題的罪惡之源;一旦接口發生變化,實現這些接口的類往往也需要更新,提供新添方法的實現才能適配接口的變化。

現在你已經了解了默認方法是怎樣以兼容的方式來升級接口。除了上面的使用場景,還有其他場景也能利用這個新特性嗎?當然有,你可以創建自己的接口,并為其提供默認方法。接下來,就介紹使用默認方法的兩種場景:

  • 可選方法

  • 多繼承

1. 可選方法

你很可能也碰到過這種情況,類實現了接口,不過卻刻意地將一些方法的實現留白。我們以Iterator接口為例來說。Iterator接口定義了hasNext、next,還定義了remove方法。

Java 8之前,由于用戶通常不會使用該方法,remove方法常被忽略。因此,實現Interator接口的類通常會為remove方法放置一個空的實現,這些都是些毫無用處的模板代碼。

采用默認方法之后,你可以為這種類型的方法提供一個默認的實現,這樣實體類就無需在自己的實現中顯式地提供一個空方法。比如,在Java 8中,Iterator接口就為remove方法提供了一個默認實現,如下所示:

interface Iterator<t> { 
     boolean hasNext(); 
     T next(); 
     default void remove() { 
     	throw new UnsupportedOperationException(); 
     } 
}

通過這種方式,你可以減少無效的模板代碼。實現Iterator接口的每一個類都不需要再聲明一個空的remove方法了,因為它現在已經有一個默認的實現。

2. 多繼承

默認方法讓之前無法想象的事兒以一種優雅的方式得以實現,即多繼承。這是一種讓類從多個來源重用代碼的能力,如圖下圖:

JDK1.8有哪些新特性

看到這里,不要誤認為Java是支持多繼承的哦。切記:“Java的類只能繼承單一的類,但是一個類可以實現多接口。”

比如,我們設計一款游戲,需要定義多個具有不同特質的性質。有的形狀需要調整大小,但是不需要有旋轉的功能;有的需要能旋轉和移動,但是不需要調整大小。我們可以如何設計呢?這里就可以用到默認方法了。

定義一個可旋轉接口,并提供旋轉的默認方法:

public interface Rotatable {     
	void setRotationAngle(int angleInDegrees);     
	int getRotationAngle();
    // 旋轉方法
	default void rotateBy(int angleInDegrees){           
		setRotationAngle((getRotationAngle () + angle) % 360);     
	} 
}

定義一個可移動接口,并提供移動的默認方法:

public interface Moveable {     
	int getX();     
	int getY();     
	void setX(int x);     
	void setY(int y); 
	// 移動方法
    default void moveHorizontally(int distance){        
    	 setX(getX() + distance);    
    } 
    default void moveVertically(int distance){         
    	setY(getY() + distance);     
    } 
 }

定義一個可改變大小接口,并提供改變大小的默認方法:

public interface Resizable {     
	int getWidth();     
	int getHeight();     
	void setWidth(int width);     
	void setHeight(int height);     
	void setAbsoluteSize(int width, int height); 
    default void setRelativeSize(int wFactor, int hFactor){         
    	setAbsoluteSize(getWidth() / wFactor, getHeight() / hFactor);     
    }
}

現在,可以為游戲創建不同的實體類,比如Monster可以移動、 旋轉和縮放。

public class Monster implements Rotatable, Moveable, Resizable { 
	//... 只需要給出所有抽象方法的實現,不需要重復實現默認方法
 }

Monster繼承了rotateBy、moveHorizontally、moveVertically和setRelativeSize的實現。我們也可以直接調用不同的方法:

Monster m = new Monster(); 
//調用由Rotatable中繼承而來的rotateBy 
m.rotateBy(180);  
//調用由Moveable中繼承而來的moveVertically 
m.moveVertically(10);

假設你現在需要聲明另一個類,它要能移動和旋轉,但是不能縮放,比如說Sun。這時也無需復制粘貼代碼,你可以像下面這樣復用Moveable和Rotatable接口的默認實現。

public class Sun implements Moveable, Rotatable {
	…  
}

四、總結

通過本篇文章,認識了Java8新引入的默認方法,也通過實例看到了這種默認方法帶來的靈活性,更能夠輕松升級接口中的方法,所以此后若在項目中,需要對接口進行改動,也可以想想是否可以使用默認方法。

到此,相信大家對“JDK1.8有哪些新特性”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

垦利县| 福州市| 土默特左旗| 博罗县| 白朗县| 从江县| 阳原县| 稷山县| 海阳市| 英德市| 兴海县| 阿尔山市| 衡南县| 屯门区| 商都县| 长岛县| 绥宁县| 恩平市| 祁东县| 夏津县| 泉州市| 洮南市| 福鼎市| 长丰县| 合水县| 临朐县| 柘城县| 多伦县| 龙陵县| 泗水县| 天柱县| 台安县| 洪雅县| 盐山县| 大姚县| 潍坊市| 晋州市| 宝应县| 兴业县| 油尖旺区| 津市市|