首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java 10中的“var”是什么,它与JavaScript相比吗?

Java 10中的“var”是什么,它与JavaScript相比吗?
EN

Stack Overflow用户
提问于 2018-04-03 18:36:15
回答 3查看 4.1K关注 0票数 5

我在阅读Java 10中发布的新特性时发现:

Java 10引入了var作为保留类型名,以减少冗长。它可以用作变量、方法和包名,但我们不能将其用作类或接口名称。

var是否类似于JavaScript中的var关键字?Java的var和JavaScript的var究竟有什么相似之处?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-02 18:51:30

在这两种语言中,var在概念上都有一些相似的用途,但是有一些重要的区别。

JavaScript是动态类型语言。变量没有类型信息。它对它能包含的内容没有限制。它只是一个值的持有者,它的值可以是任何类型的。

Java是一种静态类型的语言,而所有这些语句的情况正好相反。程序员必须预先说出他们的变量能容纳什么类型.它们可能与Object (每个类隐式扩展Object )一样宽松,也可能与FieldTagTestsVisitorComparator一样具体。

代码语言:javascript
运行
复制
Object objectVariable = "hello";
FieldTagTestsVisitorComparator enterpriseVariable = new FieldTagTestsVisitorComparator();

在JavaScript中,我可以非常简洁地编写

代码语言:javascript
运行
复制
var age = 10;

我有一个地方,可以储存一个值,我可以读取或操作以后。

如果我在后面的代码中决定要将其他东西重新分配给这个变量,那么我可以这样做。

代码语言:javascript
运行
复制
age = {years: 10, months: 4, days: 5};

您可以清楚地看到哪些声明更适合使用。人们经常抱怨Java的冗长。在上面的例子中,我在同一条直线上声明了两次FieldTagTestsVisitorComparator。这个加起来有什么价值?我只是重复了一遍。

Java中的var寻求减少重复声明的数量。就像之前的钻石操作者一样,语言设计人员正在努力改进Java编译器,以便它足够聪明地推断程序员的意图。如果某事可以是隐含的,为什么它应该是显式的?

实际上,这意味着,赋值左边的变量类型是从右边推导出来的。

如果我用Java编写以下内容

代码语言:javascript
运行
复制
var foo = new StringBuilder();

然后,Java 10+编译器足够聪明地识别右侧的字符串生成器,并自动给变量foo适当的类型。

这从根本上不同于JavaScript,因为虽然我没有指定类型,但类型仍然存在。我以后不能给它分配任何我喜欢的东西:

代码语言:javascript
运行
复制
foo = 3; // fails to compile, foo is of type StringBuilder

var纯粹在编译时使用。编译器计算出类型,替换它,字节码与从未使用过的字节码相同。没有功能上的区别

代码语言:javascript
运行
复制
var foo = new StringBuilder();

代码语言:javascript
运行
复制
StringBuilder foo = new StringBuilder();

这纯粹是一个化妆品差异,使语言更有表现力。

关于var**'s状态的注记**

Java设计人员在添加新特性时总是非常小心,以免破坏向后兼容性,因此var具有一定的特殊地位。它不是关键字,因为拥有关键字状态会限制过度。例如,不能将关键字用作标识符;我不能使用名为if的方法,因为if是关键字。

正如您的引号所述,var是“保留类型名称”。起初,这听起来很复杂,但实际上它非常描述了var的状态。它是由Java保留的类型的名称。您不能命名您的类型--类、接口、枚举-- var,因为这会引起歧义。

您仍然可以在所有其他上下文中使用"var“一词--方法名称、变量标识符等等。

通过拥有这种状态,设计人员已经最大限度地实现了向后兼容性(除了根本不添加特性!)。除非您有一个名为小写var的类--首先,您选择这些糟糕的名称是做什么的?其次,为什么您不遵循命名约定并将其命名为Var?-那么您将受到保护,不受任何破坏更改的影响。

这里有一个完整的问题:Java 10中的"var“到底是什么类型的令牌?

很好的特征对吧?确实如此,但重要的是不要仅仅因为你可以就在任何地方开始使用它。Stuart,JDK开发人员之一,有一些优秀的风格指南,我建议您阅读。

我的经验法则是,如果没有在同一行上指定类型(如上面的示例所示),那么我就不使用var。编译器非常聪明,可以根据任何有效表达式的结果推断类型,因此以下内容是完全有效的:

代码语言:javascript
运行
复制
var foo = bar();

但是,如果不查看方法签名,就不会立即看出变量的类型是什么。编译器没有任何含糊不清之处,但对于正在阅读它的人来说就不那么清晰了。在这种情况下,我们为了简洁牺牲了可读性。

再读

  • JEP 286:局部变量类型推断
  • JEP 286常见问题(局部变量类型推理)
票数 22
EN

Stack Overflow用户

发布于 2018-04-03 18:38:45

var是C#中已经存在的东西。基本上,它不是声明变量类型,而是假设它的类型设置为什么。例如:

代码语言:javascript
运行
复制
var myString = "Hello world"

因为要在引号中将其设置为值,所以假定它是String,而不必指定如下所示:

代码语言:javascript
运行
复制
String myString = "Hello world"
票数 3
EN

Stack Overflow用户

发布于 2021-11-29 13:29:00

var是在Java 10中引入的一个新关键字,其行为与JavaScript几乎相同。有关Java中var关键字可以和不能使用的内容,请参见下面的内容。

Can

  • 使用var关键字声明任何数据类型
  • 在局部变量声明中使用。

不能

var支持泛型类型,也支持Java11中的lambda表达式。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49636993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档