本文是《Java语言新特性漫谈》系列文章中的一篇,该系列文章主要探讨各 Java 版本的语言特性方面的增强更新。
var声明的局部变量
Java 是静态语言,所以变量声明时需要指定类型。
但是,对于局部变量而言,通常在声明时就会给其赋值。比如:
1 | String hi = "Hello! World!"; |
这种场景下,我们实际是可以从等号右侧的值推断出左侧变量的类型的。换句话说,显式声明变量的类型是完全没有必要的。
因此,Java 10 加入了局部变量类型推断的能力,使得不必做无谓的工作量。仅仅将类型名替换为 var
即可,如:
1 | var hi = "Hello! World!" |
var
看起来像 JavaScript 的 var
关键字,但是,并不意味着 Java 因此拥有了动态类型。
基于兼容性考虑,
var
并非关键字,而仅仅是一个保留类型名。换句话说,声明var
作变量名是完全合法的。
事实上,这只是一个编译器特性,编译器会在编译时推断出变量类型进行替换。
关于推断
首先,该能力是有范围限定的,是关于“局部变量”的;其次,可推断本身是要有条件的。
因此,以下场景使用 var
声明变量是非法的:
- 用于非局部变量是不合法的。包括:类变量、实例变量、方法参数等等。
- 未给变量赋值,或所赋值无法确认类型时,也是不合法的。
- 变更
var
变量类型是非法的。var
并不意味着动态类型,因此不能重新赋值一个不兼容的类型值。
1 | // 未赋值,没有推断依据 |
优点 vs. 缺点
var
变量主要有以下优点:
- 简洁,提高了可读性;
- 一系列变量声明时,变量名可对齐,排版美观;
反过来说,它也可能降低可读性。比如等号右侧是以方法调用结果赋值,甚至是以链式调用结果赋值时,变量类型就不是那样明显了。此时,应该尽量显式指定变量类型。