现在Java 11已经发布了一段时间,是时候学习新版本Java中的一些新特性了。今天我要实际解释一下Java 10中增加的最重要的特性:局部变量类型推断。大家都知道是var关键字,但是怎
现在Java 11已经发布了一段时间,是时候学习新版本Java中的一些新特性了。
今天我要实际解释一下Java 10中增加的最重要的特性:局部变量类型推断。大家都知道是var关键字,但是怎么用,要注意哪些点呢?
下面我们通过几个例子来解释一下局部变量类型推断的这个新特性!
什么是局部变量类型推断?var javastack = & # 8220javastack ”
system . out . println(Java stack);
可以看到,局部变量类型推断是指左边的类型直接由var定义,而不是编写具体的类型。编译器可以根据右边的表达式自动推断类型,比如上面的字符串。
var javastack = & # 8220javastack ”
等于:
String javastack = & # 8220javastack ”
局部变量类型推理的例子既然叫局部变量类型推断,那就只能用在局部变量里。这里还有一些例子。
1。字面量定义局部变量
私有静态void testVar() {
var javastack = & # 8220javastack ”
system . out . println(Java stack);
}
2。接收方法的返回值定义了一个局部变量
私有静态void testMethod() {
var javastack = getJavastack();
system . out . println(Java stack);
}
公共静态字符串getJavastack() {
return & # 8220javastack ”
}
3。在循环中定义局部变量
私有静态void测试循环(){
for(var I = 0;我<3;i++) {
for(var m = 10;m <15;m++) {
system . out . println(I+m);
}
}
}
4。结合局部变量的泛型
私有静态void testGeneric() {
//表达式1
列表& lt字符串& gtlist1 =新数组列表& lt& gt();
list 1 . add(“javastack & # 8221);
//表达式2
var list2 = new ArrayList & lt& gt();
list 2 . add(2018);
//表达式3
var list3 = new ArrayList & lt字符串& gt();
list 3 . add(“javastack & # 8221);
}
1在表达式<>Jdk 1.7+不需要以具体的类型开头,在界面中注明即可。
如果在表达式2中使用var,<>
在表达式3中,在
在下列情况下不能使用局部变量类型推理1。类成员变量的类型
//编译错误
private var javastack = & # 8220牛蛋教育IT教室;
2。方法返回类型
/**
*编译错误
* @返回
*/
公共静态变量getJavastack(){
return & # 8220牛丹教育IT教室”;
}
3,Lambda表达式
私有静态void testLambda() {
runnable runnable =()->system . out . println(“javastack & # 8221);
//编译错误
//var runnable =()->system . out . println(“javastack & # 8221);
}
以上三种场景不能用Var,其他情况需要验证。
局部变量类型推理的优缺点优点:简化的代码
CopyOnWriteArrayList list 1 = new CopyOnWriteArrayList();
ConcurrentModificationException CME 1 = new ConcurrentModificationException();
DefaultServiceUnavailableRetryStrategy strategy 1 = new
DefaultServiceUnavailableRetryStrategy();
var list 2 = new CopyOnWriteArrayList <& gt();
var CME 2 = new ConcurrentModificationException();
var strategy 2 = new DefaultServiceUnavailableRetryStrategy();
从上面的代码可以看出,长定义类型会让代码非常冗长,var的使用大大简化了代码的编写,而类型的统一让代码非常对齐。
缺点:屏蔽类型
var token = new JsonParserDelegate(解析器)。current token();
看看上面的代码,不进去看看返回的结果类型,谁知道返回的类型是什么?所以在这种情况下,最好不要使用var,而是使用具体的抽象类、接口或者实例类型。
关键词var原理var其实只是Java 10加的一个语法糖。编译时会自动推断实际类型,其编译的字节码与实际类型一致,如下例所示。
私有静态void testByteCode() {
String javastack1 = & # 8220javastack ”
var javastack2 = & # 8220javastack ”
}
编译成字节码后:
私有静态测试字节码()V
劳拉西泮
22号线L0
LDC & # 8220javastack & # 8221
阿斯托利0
腰神经2
23号线
LDC & # 8220javastack & # 8221
阿斯托利1号
L2
24号线
返回
L3
local variable javastack 1 Ljava/lang/String;L1 L3 0
local variable javastack 2 Ljava/lang/String;L2 L3 1
MAXSTACK = 1
MAXLOCALS = 2
可以看出javastack1和javastack2是虚拟机识别的局部变量类型:java.lang.String虚拟机不知道var,所以var不神奇。
好了,关于Java 10中新函数的这篇实用文章就到此为止,也就是局部变量的类型推断。关于新Java版本的特性和功能的更多实用文章将在后面带来。