java查看变量类型的方法(将日期从string转成date)
现在 java 11发布已有一段时间了,是时候慢慢来学习一些java新版本中的新功能特性了。
今天要实战讲解的的是 在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() {
// 表达式1
list<string> list1 = new arraylist<>();
list1.add(“javastack”);
// 表达式2
var list2 = new arraylist<>();
list2.add(2018);
// 表达式3
var list3 = new arraylist<string>();
list3.add(“javastack”);
}
表达式1后面 <> 里面 jdk 1.7+开始是不用带具体类型的,在接口中指明就行了。
表达式2中如果使用 var 的话, <> 里面默认会是 object 的,所以可以添加任意类型。
表达式3中在 <> 强制使用了 string 来指定泛型。
局部变量类型推断不能用在以下场景
1、类成员变量类型
// 编译报错
private var javastack = “牛旦教育it课堂;
2、方法返回类型
/**
* 编译报错
* @return
*/
public static var getjavastack(){
return “牛旦教育it课堂”;
}
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 = new
defaultserviceunavailableretrystrategy();
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 新版的特性功能实战方面的文章。
下一篇: 我对市场营销的理解和认识