现在 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

可以看出 javastack1javastack2 都是虚拟机所认识的的本地变量类型: java.lang.String,虚拟机并不认识 var, 所以 var 并不神奇。

OK,本次 Java 10 局部变量类型推断实战文章就到这里了,后续带来更多的 Java 10 的实战方面的文章。

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

  1. java全局变量和局部变量_Java 10 –局部变量类型推断

    java全局变量和局部变量 在本文中,我们将看到作为JEP 286的一部分提出的名为Local Variable Type Inference的Java10功能. 从Java的第一个版本开始,它是一种 ...

  2. java jep_Java 10 – JEP 286:局部变量类型推断

    java jep Java 10即将发布,RC Build可在此处获得 . 可在此处找到此发行版的目标功能. 在针对Java 10的所有JEP中,开发人员社区中最有趣且最受关注的是286:Local- ...

  3. Java 10 –局部变量类型推断

    在本文中,我们将看到作为JEP 286的一部分提出的名为Local Variable Type Inference的Java10功能. 从Java的第一个版本开始,它是一种强类型语言,在这里我们需要提 ...

  4. Java 10 – JEP 286:局部变量类型推断

    Java 10即将发布,RC Build可在此处获得 . 可在此处找到此发行版的目标功能. 在针对Java 10的所有JEP中,开发人员社区中最有趣且最受关注的是286:Local-Variable ...

  5. Java 10:局部变量类型推断

    Java 10:局部变量类型推断 在本文中,我们将深入研究Java 10中引入的局部变量类型推断的新特性.我们将讨论使用局部变量类型推断的范围和局限性. 此功能是作为JEP(JDK增强提案)的一部分提 ...

  6. java全局变量和局部变量_Java 10:局部变量类型推断

    java全局变量和局部变量 In this article, we would take a deep dive at the new feature of Local-Variable Type I ...

  7. java 类型推理_java 11 局部变量类型推断

    什么是局部变量类型推断? var javastack = "javastack"; System.out.println(javastack); 大家看出来了,局部变量类型推断就是 ...

  8. matlab中float类型的_Java局部变量类型推断(Var类型)的26条细则

    原文链接:https://dzone.com/articles/var-work-in-progress 作者:Anghel Leonard 译者:沈歌 Java局部变量类型推断(LVTI),简称 v ...

  9. 根据变量推断变量类型_11位专家参与其中:本地变量类型推断是Java 10中最大的新功能

    根据变量推断变量类型 " Java 10不仅是对Java 9的简单稳定性和性能修复," 尽管Java 9是六个月前才发布的( 仅! ),这意味着对Java 10的期望可能不是很高, ...

最新文章

  1. Bootstrap4.x 新增
  2. sendmail服务器配置过程中出现的一些错误和解决办法
  3. 跨界创立PayPal、特斯拉、SpaceX……,埃隆·马斯克是这样“掌控”知识的
  4. poj1015 Jury Compromise
  5. 全量增长模型-指标体系的构建及应用实战案例解析
  6. CMD命令之BAT脚本路径信息
  7. 小程序下一破局点?钉钉小程序卡片,应用与平台的深度集成
  8. AutoMapper搬运工之初探AutoMapper
  9. Tomcat Session Clustering
  10. Ubuntu软件下载速度慢解决
  11. 1t98cp.com main.php,SCTF2019 Writeup——De1ta
  12. 陈式新架一路八十三式口诀
  13. 批量打印远端PDF文件
  14. (转)gzip文件格式详解
  15. linux遇到hint:num lock on
  16. panabit环境搭建
  17. 相关性和差异的显著性
  18. Mybatis映射详解
  19. v-if,v-else-if, v-else的实际使用
  20. UGUI源码解析(二十二)ContentSizeFitter

热门文章

  1. 程序员,为什么如此迷茫?
  2. Java HashMap的死循环的启示
  3. 《云计算揭秘企业实施云计算的核心问题》——导读
  4. 一道比较实用的MySQL面试题:游戏数据充值查询
  5. 科技创业公司的效率工具箱
  6. 复制网页自动追加文字js
  7. error while loading shared libraries: libmysql....
  8. XenServer中Windows 7与XP多vCPU支持配置
  9. PyCharm中批量查找及替换
  10. WIN10 OpenGL GLFW+GLAD 开发环境搭建