国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

java語(yǔ)法糖之jdk迭代的新特性匯總

發(fā)布時(shí)間:2021-07-05 18:40 來(lái)源:腳本之家 閱讀:0 作者:Henrik-Yao 欄目: 開(kāi)發(fā)技術(shù)

語(yǔ)法糖(Syntactic sugar)

是由英國計算機科學(xué)家彼得·約翰·蘭達(Peter J. Landin)發(fā)明的一個(gè)術(shù)語(yǔ),指計算機語(yǔ)言中添加的某種語(yǔ)法,這種語(yǔ)法對語(yǔ)言的功能并沒(méi)有影響,但是更方便程序員使用。通常來(lái)說(shuō)使用語(yǔ)法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會(huì )。

糖1:for-each

功能和傳統的fori相似

代碼樣例

public class Test {
    public static void main(String[] args) {
        int[] num = new int[10];
        for (int i = 0; i < 10; i++) {
            num[i] = i;
        }
        //舊版本
        for (int i = 0; i < num.length; i++) {
            System.out.print(num[i]+" ");
        }
        System.out.println();
        //新版本
        for (int i:num) {
            System.out.print(num[i]+" ");
        }
    }
}

輸出對比

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9

特性

  • for-each從JDK5.0開(kāi)始引入
  • for-each語(yǔ)法更加簡(jiǎn)潔
  • for-each可以避免語(yǔ)法越界錯誤
  • fori可以刪除元素,for-each不可以
  • for-each遍歷時(shí)候不知道當前元素的具體位置
  • for-each只能正向遍歷,不能反向遍歷
  • for-each不能同時(shí)遍歷兩個(gè)集合

糖2:枚舉類(lèi)型

變量的取值只在一個(gè)有限的集合里面

代碼樣例

public class Test {
    public static void main(String[] args) {
        enum Size{
            SMALL,MEDIUM,LARGE;
        }
        Size s1 = Size.SMALL;
        Size s2 = Size.MEDIUM;
        Size s3 = Size.LARGE;
        Size s4 = Size.SMALL;
        System.out.println(s1==s4);
        System.out.println(s3==s4);
    }
}

輸出樣例

true
false

特性

  • enum聲明枚舉類(lèi),且都是Enum的 子類(lèi)
  • enum內部有多少個(gè)值,就有多少個(gè)實(shí)例對象
  • 不能直接new枚舉類(lèi)對象
  • 除了枚舉的內容 ,還可以添加屬性,方法 ,構造函數
  • 構造函數只能是private類(lèi)型,只能內部調用
  • enum也繼承了Enum的子類(lèi),也繼承了相應方法
  • ordinal()返回枚舉值所在的索引位置
  • compareTo()比較兩個(gè)枚舉值的索引位置大小
  • toString()放回枚舉值的字符串表示
  • valueOf()將字符串初始化為枚舉對象
  • values()返回所有的枚舉值

糖3:不定項參數

普通函數的形參列表是固定個(gè)數/類(lèi)型/順序

JDK5.0提供了不定項參數(可變參數)功能

代碼樣例

public class Test {
    public static void main(String[] args) {
        test("aaa");
        test("aaa","bbb","ccc");
    }
    public static void test(String... args){
        System.out.println(args.length);
        for (String arg:args) {
            System.out.println(arg);
        }
    }
}

輸出樣例

1
aaa
3
aaa
bbb
ccc

特性

  • 類(lèi)型后面加…表示,如代碼樣例所示
  • 可變參數,實(shí)際上是一個(gè)數組
  • 一個(gè)方法只能有一個(gè)不定項參數,且必須位于參數列表的最后
  • 優(yōu)先規則1:固定參數的方法比可變參數優(yōu)先級更高
  • 優(yōu)先規則2:調用語(yǔ)句,同時(shí)與兩個(gè)帶可變參數的方法匹配,則報錯

糖4:靜態(tài)導入

import導入程序所需要的類(lèi)

import static導入一個(gè)類(lèi)的靜態(tài)方法和靜態(tài)常量(JDK5.0引入)

代碼樣例

import static java.lang.Math.pow;
import static java.lang.Math.sqrt;
import static java.lang.System.out;

public class Test {
    public static void main(String[] args) {
        int a=3,b=4,c=0;
        //靜態(tài)引入
        c = (int) sqrt(pow(a,2)+pow(b,2));
        //原本用法
        c = (int) Math.sqrt(Math.pow(a,2)+Math.pow(b,2));
        //靜態(tài)引入
        out.println(c);
        //原本用法
        System.out.println(c);
    }
}

輸出樣例

5
5

特性

  • 可以省略類(lèi)名,直接用
  • 靜態(tài)方法具有明確特征,如有重名,需要補充類(lèi)名
  • 通配符:*

糖5:自動(dòng)裝箱和拆箱

在java中,基本類(lèi)型放在棧里面,對象則是在堆里開(kāi)辟了內存空間,把對象的引用存入棧里面,基本類(lèi)型可以包含在對象里面,所以形象的形容為裝箱

從JDK5.0開(kāi)始引入,簡(jiǎn)化了基本類(lèi)型和對象轉化的寫(xiě)法

基本類(lèi)型:boolean/byte/char/int/short/long/float/double

對象:Boolean/Byte/Character/Integer/Short/Long/Float/Double

代碼樣例

public class Test {
    public static void main(String[] args) {
        //自動(dòng)裝箱
        Integer obj1 = 5;
        //原始用法
        Integer obj2 = Integer.valueOf(5);
        //自動(dòng)拆箱
        int a1 = obj1;
        //原始用法
        int a2 = obj2.intValue();
        System.out.println(obj1);
        System.out.println(a1);
        System.out.println(obj2);
        System.out.println(a2);
    }
}

輸出樣例

5
5
5
5

特性

  • 裝箱和拆箱都是編譯器的工作,在class中已經(jīng)添加轉化,虛擬機中沒(méi)有自動(dòng)拆箱和裝箱的語(yǔ)句
  • 對于==:基本類(lèi)型是內容相同,對象是指針是否相同(內存同一個(gè)區域)
  • 基本類(lèi)型沒(méi)有空值,對象有null,可能引發(fā)NullPointerException
  • 當一個(gè)基礎數據類(lèi)型與封裝類(lèi)型進(jìn)行==,+,-,*,/運算時(shí),會(huì )將封裝類(lèi)進(jìn)行拆箱,對基本數據類(lèi)型進(jìn)行運算
  • 謹慎使用多個(gè)非同類(lèi)的數值類(lèi)對象進(jìn)行運算

糖6:多異常并列

多個(gè)異常并列在一個(gè)catch中

從JDK7.0Y引入,簡(jiǎn)化寫(xiě)法

代碼樣例

import java.io.IOException;
import java.sql.SQLException;

public class Test {
    public static void main(String[] args) {
        //舊版本
        try {
            test();
        }
        catch (IOException ex){
            //異常處理
        }
        catch (SQLException ex){
            //異常處理
        }
        //新版本
        try {
            test();
        }
        catch (IOException | SQLException ex){
            //異常處理
        }
    }

    private static void test() {

    }
}

特性

  • 并列的特性不能直接有或間接有繼承關(guān)系,如果有,則報錯

糖7:整數類(lèi)型用二進(jìn)制賦值

從JDK7.0開(kāi)始引入

整數類(lèi)型可以用二進(jìn)制進(jìn)行賦值

代碼樣例

public class Test {
    public static void main(String[] args) {
       byte a1 = (byte) 0b00100001;
       short a2 = (short) 0b10101010101;
       int a3 = 0b101;
       long a4 = 0b101010101011011011010101011L;
        System.out.println(a1);
        System.out.println(a2);
        System.out.println(a3);
        System.out.println(a4);
    }
}

輸出樣例

33
1365
5
89503403

特性

  • 避免二進(jìn)制計算
  • 0b表示二進(jìn)制數

糖8:數字中的下劃線(xiàn)

從JDK7.0開(kāi)始引入

在數字字面量中使用下劃線(xiàn)

代碼樣例

public class Test {
    public static void main(String[] args) {
        //二進(jìn)制,0b開(kāi)頭
        int a1 = 0b0100_1011_0001;
        //八進(jìn)制,0開(kāi)頭
        int a2 = 02_014;
        int a3 = 123__45;
        //十六進(jìn)制,0x開(kāi)頭
        int a4 = 0x7_567;
        float a5 = 3.56_78f;
        System.out.println(a1);
        System.out.println(a2);
        System.out.println(a3);
        System.out.println(a4);
        System.out.println(a5);
    }
}

輸出樣例

1201
1036
12345
30055
3.5678

特性

  • 增加數字的可讀性和糾錯功能
  • 下劃線(xiàn)只能出現在數字中間,前后必須有數字
  • 下劃線(xiàn)不能拆開(kāi)0x
  • 允許在二/八/十/十六進(jìn)制中使用
  • 可以使用多個(gè)下劃線(xiàn)

糖9:接口的默認方法

java最初的設計中,接口的方法都是沒(méi)有實(shí)現的公開(kāi)的

JDK8.0推出接口的默認方法/靜態(tài)方法(都帶實(shí)現的),為L(cháng)ambda表達式提供支持

代碼樣例

public class Test {
    public interface Animal{
        public void move();
    }
    
    public interface NewAnimal{
        public default void move(){
            System.out.println("I can move");
        };
    }
}

特性

  • 用default關(guān)鍵字標注,其他的定義和普通函數一樣
  • 默認方法不能重寫(xiě)Object中的方法
  • 實(shí)現類(lèi)可以繼承/重新父接口的默認方法
  • 接口可以繼承/重新父接口的默認方法
  • 當父類(lèi)和父接口都有同名同參數的默認方法的時(shí)候,子類(lèi)繼承父類(lèi)的默認方法,這樣可以兼容JDK7.0以前的代碼
  • 子類(lèi)實(shí)現了兩個(gè)接口(同名同參),那么編譯失敗,必須在子類(lèi)中重寫(xiě)這個(gè)default方法

糖10:接口的靜態(tài)方法

JDK8.0推出帶實(shí)現的靜態(tài)方法

代碼樣例

public class Test {
    public interface StaticAnimal{
        public static void move(){
            System.out.println("I can move");
        }
    }
    
    public interface StaticLandAnimal extends StaticAnimal{
        //繼承不到StaticAnimal的move方法
    }
    
    public static void main(String[] args) {
        //正確引用
        StaticAnimal.move();
        //錯誤引用
        StaticLandAnimal.move();
        new StaticAnimal().move();
    }
}

特性

  • 該靜態(tài)方法屬于本接口,不屬于子類(lèi)/子接口
  • 子類(lèi)(子接口)沒(méi)有繼承該靜態(tài)方法,只能通過(guò)所在的接口名來(lái)調用

糖11:接口的私有方法

JDK9.0推出接口的私有方法

代碼樣例

public class Test {
    public interface StaticAnimal{
        private void move(){
            System.out.println("I can move");
        }
    }
    
    public interface StaticLandAnimal extends StaticAnimal{
        //繼承不到StaticAnimal的move方法
    }
    
    public static void main(String[] args) {
        //錯誤引用
        StaticAnimal.move();
        StaticLandAnimal.move();
        new StaticAnimal().move();
    }
}

特性

  • 解決多個(gè)默認方法/靜態(tài)方法的內容重復問(wèn)題
  • 私有方法屬于本接口,只能在本接口內使用,不屬于子類(lèi)/子接口
  • 子類(lèi)(子接口)沒(méi)有繼承該私有方法,也無(wú)法調用
  • 靜態(tài)私有方法可以被靜態(tài)/默認方法調用,非靜態(tài)私有方法被默認方法調用

糖12:try-with-resource

程序如果打開(kāi)外部資源,那么使用后必須正確關(guān)閉

考慮異常因素,java提供try-catch-finally進(jìn)行保證

JDK7.0提供try-with-resour,比try-catch-finally更加方便

代碼樣例

public class Test implements AutoCloseable {

        private int age = 18;

        @Override
        public void close() throws Exception {
            System.out.println("關(guān)閉成功");
        }

        public static void main(String[] args) {
            try(Test11 OpenResource = new Test()){
                System.out.println(OpenResource.age);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

輸出樣例

18
關(guān)閉成功

特性

  • 資源對象必須實(shí)現AutoCloseable接口,即實(shí)現close方法
  • 在try-catch塊執行后會(huì )自動(dòng)執行close方法
  • JDK7要求定義臨時(shí)變量接收
    Test OpenResource = new Test();
    try(Test TT = OpenResource)…
  • JDK9不在要求定義臨時(shí)變量,可以直接使用
    Test OpenResource = new Test();
    try(OpenResource)…

糖13:ResourceBundle文件加載

JDK8及以前,ResourceBundle默認以ISO-8859-1方式加載文件

JDK9及以后,ResourceBundle默認以UTF-8方式加載文件

糖14:var類(lèi)型

java以前一直是一種強類(lèi)型的語(yǔ)言

每個(gè)變量在定義時(shí)候就確定了類(lèi)型

JDK10推出了var:局部變量推斷

代碼樣例

public class Test {
    public static void main(String[] args) {
        var a1 = 5;
        var a2 = 0.025f;
        var a3 = "abc";
        int b1 = 5;
        float b2 = 0.025f;
        String b3 = "abc";
        System.out.println(a1==b1);
        System.out.println(a2==b2);
        System.out.println(a3==b3);
    }
}

輸出樣例

true
true
true

特性

  • 避免了信息冗余
  • 對齊了變量名
  • 更容易閱讀
  • var可以用在局部變量上,非類(lèi)成員變量
  • var可以用在for/for-each循環(huán)中
  • 聲明時(shí)必須初始化
  • 不能用在方法形參和返回類(lèi)型
  • 大面積濫用會(huì )導致代碼整體閱讀性變差
  • var只在編譯時(shí)起作用,沒(méi)有在字節碼中引入新的內容,也沒(méi)有專(zhuān)門(mén)的JVM指令處理war

糖15:switch分支合并

JDK12推出

代碼樣例

public class Test {
    public static void main(String[] args) {
        String month = null;
        int result;
        switch (month){
            case "Jan","Mar","July","Aug","Oct","Dec" -> result = 31;
            case "Apr","June","Sep","Nov" -> result = 30;
            case "Feb" -> result = 28;
            default -> result = -1;
        }
    }
}

總結

到此這篇關(guān)于java語(yǔ)法糖之jdk迭代新特性的文章就介紹到這了,更多相關(guān)jdk迭代新特性?xún)热菡埶阉髂_本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

国产精品户露AV在线户外直播| 日韩人妻无码一区二区三区综合部| 久久久久久国产精品无码下载| 久久人人爽人人爽人人片AV高清| A级国产乱理伦片在线播放| 中国女人和老外的毛片|