Java 10 局部变量类型推断

前言

Java一直在逐步减少语法上的冗长。首先是Diamond操作符,现在是var(局部变量类型- JEP 286)来在Java中声明变量。

当我们使用var来声明变量时,不是声明一个变量类型,而是假设它的类型来自它被设置的值。如:

1
2
3
4
5
var str = "Hello world";

//or

String str = "Hello world";

在上面的例子中,在第一个语句中,我们将一个字符串设置为变量str,因此它被隐式地假定为字符串类型。第一个语句本质上等价于上面例子中的第二个语句。

正文

需要同时声明和初始化var

使用var时,必须在相同的位置初始化变量。

不能将声明和初始化放在不同的位置。

如果我们没有在适当的地方初始化变量,那么将会得到编译错误 - Cannot use 'var' on variable without initializer

1
2
3
4
5
var i;  //错误声明定义 - - Cannot use 'var' on variable without initializer

var j = 10; //正确声明定义

System.out.println(i);

var不是关键字

看起来像,但实际上var不是Java的关键字,所以我们可以命名叫var的变量,这是允许的。

1
2
3
var var = 10;   //正确

int var = 10; //正确

var用法

var的使用是有限制的,它可以应用在局部变量与初始化参数、for循环等,它不适用于方法参数、构造函数参数、方法返回类型、字段、捕获参数或任何其他类型的变量声明。

允许使用范围:

  • 初始化的局部变量
  • 增强for循环
  • 普通for循环
1
2
3
4
5
6
7
8
9
var blogName = "howtodoinjava.com";

for ( var object : dataList){
System.out.println( object );
}

for ( var i = 0 ; i < dataList.size(); i++ ){
System.out.println( dataList.get(i) );
}

不允许使用的范围:

  • 方法参数
  • 构造函数参数
  • 方法返回类型
  • 类字段
  • 异常捕获参数或者其他类型的变量声明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Application {

//var firstName; //不允许定义在类里

//public Application(var param){ //不允许作为构造函数参数

//}

/*try{

} catch(var ex){ //不允许作为异常捕获参数

}*/

/*public var demoMethod(){ //不允许作为方法返回参数
return null;
}*/

/*public Integer demoMethod2( var input ){ //不允许作为方法入参
return null;
}*/
}

var不是向后兼容的

由于这是一种新的语言特性,所以使用var编写的代码不会在较低的JDK版本(少于10)中编译。

所以,只有我们确定要使用它时,才建议使用。

var不影响性能

要知道,在Java中,类型不是在运行时推断的,而是在编译时推断的。这意味着生成的字节码与显式类型声明相同 - 它确实包含了关于类型的信息。这意味着在运行时没有进行额外的处理。

结语

以上就是关于var的全部内容。




-------------文章结束啦 ~\(≧▽≦)/~ 感谢您的阅读-------------

您的支持就是我创作的动力!

欢迎关注我的其它发布渠道