文档章节

var 是 Java 开发的好朋友啊!

极光推送
 极光推送
发布于 11/21 09:54
字数 834
阅读 10
收藏 0

 

简评:Java var != JavaScript var。

Java 10 中引入了新的语法用于局部变量类型推断,很多开发者有所疑惑,希望这篇文章能帮到你。

什么是类型推断

其实在 Java 中类型推断早就存在了,看下下面的例子:

public void doSomething() {
    final List<String> names = new ArrayList<String>();
                                         //  ^^^^^^------- Redundant
    ...
}

在这个例子中给 ArrayList 定义持有的类型就没必要了,因为 List<String> 已经定义了我们需要的类型 String ,在 Java 7 中增加了类型推断,这时例子可以直接写成

public void doSomething() {
    final List<String> names = new ArrayList<>();
                                         // ^^------ Inferred!
    ...
}

这两种写法是完全合法的,而且最终会形成一样的字节码。对经常使用泛型的开发者来说,可能早就对上面的类型推断写法习以为常。

那什么是局部变量类型推断?

即能推断出方法中局部变量的类型,这是 Java 10 中新增的特性,对应关键词 var,看个例子 :

public void doSomething() {
    final ??? name = "Todd";
}

name 是什么类型,很明显是 String,而 Java 10 就可以让编译器帮我们判断其类型,我们只要写成下面的形式:

public void doSomething() {
    final var name = "Todd";   // name is inferred as a String!
}

var 的使用不局限于函数内声明的变量,同时也可以用于循环的索引:

final List<String> names = new ArrayList<>();

public void doSomething() {
    for(var name: names) {
        System.out.println("Name: " + name);
    }
    for(var i = 0; i < names.size(); i++) {
        System.out.println("Name: " + names.get(i));
    }
}

我必须使用 var 吗?不是的,老方法一样完美支持。

这样的做法危险吗?

一个字:不。

简单说它是受限于它们存在的方法(或循环声明)的范围。这意味着除了声明它们的方法的开发之外,人们不编写依赖于这些类型的代码。

还有大家会有一个疑惑,很多语言也是不需要定义类型的,完全由编译器搞定,以 JavaScript 举例:

var x = "Todd"

简单吧,x 是 String 类型的,但是在 JS 中能重新定义类型,比如:

var x = "Todd"
x = 42  // Now it's an int?!

像这种 Java 以后是不是也不用考虑变量类型了?错,和JS 不一样,Java 中的 var 只能在局部变量使用外,同时是不能重复赋值的,就拿上面的例子,会导致编译错误:

public void doSomething() {
    var x = "Todd";
    x = 42;    // Compiler fails on this line: 
               // Error: java: incompatible types: int cannot be converted to java.lang.String
}

所以 var 一点都不危险,Java 也不会因此变成动态类型分配语言,这仅仅是对局部变量多了一种定义方式。

总结下

  1. Var 是我们的好朋友;
  2. Java var != JavaScript var;
  3. Var 解决了你显示声明变量的一些麻烦,但他们依然存在;
  4. Var 声明的变量和显示声明的变量是一模一样的;
  5. Var 类型变量不会影响到你其他的代码;
  6. 多了解一下总不会错吧!
原文链接: Java Developers: var Is Your Friend • Todd Ginsberg​todd.ginsberg.com

 

© 著作权归作者所有

共有 人打赏支持
极光推送
粉丝 42
博文 175
码字总数 184243
作品 1
深圳
个人站长
私信 提问
var 是 Java 开发的好朋友啊!

简评:Java var != JavaScript var。 Java 10 中引入了新的语法用于局部变量类型推断,很多开发者有所疑惑,希望这篇文章能帮到你。 什么是类型推断 其实在 Java 中类型推断早就存在了,看下...

极小光
11/19
0
0
《Kotlin 程序设计》第九章 Kotlin与Java混合调用

第九章 Kotlin与Java混合调用 正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial 京东JD:https://item.jd.com/12181725.html 天猫Tmall:https:/......

程序员诗人
2017/05/29
0
0
一个小学生的职业生涯

java9年来,一个被学历问题所困扰,我本身是初一辍学打工(工地,工厂,餐厅),直到20岁时学习计算机基础,从开机到打字,再到学习java, 一年后面试第一家公司,被一个现在仍是好朋友的人选...

NickYoung
04/17
3.2K
30
win10 开机无法加载jdk

用心爱的笔记本进行机器学习训练,导致win10开机直逼2分钟,卡顿2分钟,泪奔,作为一个程序员,实在无法忍受。换系统。 找好朋友要了个系统,新系统各种清爽,10秒内开机,20秒能用,爽歪歪。...

悲喜世界
11/22
0
0
【开源访谈】18 年资深 Java 开发闲大赋:不再保守的 Java 更可爱

2006 年,Java 6 面世;2011 年,Java 7 发布。而后,Oracle 在三年一个版本的频率中推出了 Java 8 和 Java 9 ,并在 Java 9 发布之际宣布提速 Java 版本迭代,调整为每半年发布一个新版本。...

王练
03/21
8.8K
33

没有更多内容

加载失败,请刷新页面

加载更多

ZooKeeper命令大全

创建节点 # 创建节点,-s表示顺序节点,-e表示临时节点,默认是持久节点create [-s] [-e] path data acl # 示例create /zk-book 123 查看节点 ls path [watch] # 示例ls /zk-book 获取...

爱宝贝丶
14分钟前
0
0
QLExpress基本语法

QLExpress基本语法 一、背景介绍 由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 在阿里集团有...

xiaomin0322
14分钟前
0
0
Elasticsearch节点角色类型node.master和node.data说明s

一般地,ElasticSearch集群中每个节点都有成为主节点的资格,也都存储数据,还可以提供查询服务。这些功能是由两个属性控制的(node.master和node.data)。默认情况下这两个属性的值都是tru...

傲娇字符
30分钟前
4
0
rem的使用

(function (doc, win) { var docEl = doc.documentElement var resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize' var recalc = function () { var cl......

Js_Mei
37分钟前
1
0
idea 删除代码的注释

搜索栏使用 正则表达式搜索 (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/|[ \t]*//.*) 会搜索出来所有注释的代码 用空格replace替换掉就可以了。 或者搜索 (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\...

时刻在奔跑
39分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部