日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 10 实战第 1 篇:局部变量类型推断

發布時間:2025/3/21 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 10 实战第 1 篇:局部变量类型推断 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

現在 Java 9 被遺棄了直接升級到了 Java 10,之前也發過 Java 10 新特性的文章,現在是開始實戰 Java 10 的時候了。

今天要實戰的是 Java 10 中最重要的特性:局部變量類型推斷,大家都知道是 var 關鍵字,但具體怎么使用,及要注意什么要點呢?

我們通過幾個例子來講解局部變量類型推斷這個新特性!

什么是局部變量類型推斷

var javastack = "javastack";System.out.println(javastack);

大家看出來了,局部變量類型推斷就是左邊的類型直接使用 var 定義,而不用寫具體的類型,編譯器能根據右邊的表達式自動推斷類型,如上面的 String 。

var javastack = "javastack";

就等于:

String javastack = "javastack";

局部變量類型推斷使用示例

既然叫局部變量類型推斷,以只能用在局部變量中,下面給出更多使用示例。

1、字面量定義局部變量

private static void testVar() {var javastack = "javastack";System.out.println(javastack);}

2、接收方法返回值定義局部變量

private static void testMethod() {var javastack = getJavastack();System.out.println(javastack);}public static String getJavastack() {return "javastack";}

3、循環中定義局部變量

private static void testLoop() {for (var i = 0; i < 3; i++) {for (var m = 10; m < 15; m++) {System.out.println(i + m);}}}

4、泛型結合局部變量

private static void testGeneric() {// 表達式1List<String> list1 = new ArrayList<>();list1.add("javastack");// 表達式2var list2 = new ArrayList<>();list2.add(2018);// 表達式3var list3 = new ArrayList<String>();list3.add("javastack");}

表達式1后面 <> 里面 jdk 1.7+開始是不用帶具體類型的,在接口中指明就行了。

表達式2中如果使用 var 的話, <> 里面默認會是 Object 的,所以可以添加任意類型。

表達式3中在 <> 強制使用了 String 來指定泛型。

局部變量類型推斷不能用在以下場景

1、類成員變量類型

// 編譯報錯 private var javastack = "Java技術棧";

2、方法返回類型

/** * 編譯報錯 * @return */ public static var getJavastack(){return "Java技術棧";}

3、Lambda 表達式

private static void testLambda() {Runnable runnable = () -> System.out.println("javastack");// 編譯報錯// var runnable = () -> System.out.println("javastack"); }

以上 3 種場景是肯定不能使用 var 的,其他場合有待驗證。

局部變量類型推斷優缺點

優點:簡化代碼

CopyOnWriteArrayList list1 = new CopyOnWriteArrayList(); ConcurrentModificationException cme1 = new ConcurrentModificationException(); DefaultServiceUnavailableRetryStrategy strategy1 = newDefaultServiceUnavailableRetryStrategy();var list2 = new CopyOnWriteArrayList<>(); var cme2 = new ConcurrentModificationException(); var strategy2 = new DefaultServiceUnavailableRetryStrategy();

從以上代碼可以看出,很長的定義類型會顯得代碼很冗長,使用 var 大大簡化了代碼編寫,同時類型統一顯得代碼很對齊。

缺點:掩蓋類型

var token = new JsonParserDelegate(parser).currentToken();

看以上代碼,不進去看返回結果類型,誰知道返回的類型是什么?所以這種情況最好別使用 var,而使用具體的抽象類、接口或者實例類型。

var關鍵字原理

var其實就是 Java 10 增加的一種語法糖而已,在編譯期間會自動推斷實際類型,其編譯后的字節碼和實際類型一致,如以下例子所示。

private static void testByteCode() {String javastack1 = "javastack";var javastack2 = "javastack";}

編譯成字節碼后:

private static testByteCode()V L0 LINENUMBER 22 L0 LDC "javastack" ASTORE 0 L1 LINENUMBER 23 L1 LDC "javastack" ASTORE 1 L2 LINENUMBER 24 L2 RETURN L3 LOCALVARIABLE javastack1 Ljava/lang/String; L1 L3 0 LOCALVARIABLE javastack2 Ljava/lang/String; L2 L3 1 MAXSTACK = 1 MAXLOCALS = 2

可以看出 javastack1 和 javastack2 都是虛擬機所認識的的本地變量類型: java.lang.String,虛擬機并不認識 var, 所以 var 并不神奇。

OK,本次 Java 10 局部變量類型推斷實戰文章就到這里了,后續帶來更多的 Java 10 的實戰方面的文章。

總結

以上是生活随笔為你收集整理的Java 10 实战第 1 篇:局部变量类型推断的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。