当前位置: 首页 > 面试题库 >

Java 10中的var是什么?

岑畅
2023-03-14
问题内容

我正在阅读有关Java 10中发布的新功能的信息,我发现

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

var类似于varJavaScript中的关键字?Java var和JavaScript 之间到底有什么相似之处和区别var


问题答案:

var 两种语言在概念上都有某种相似的目的,但有一些重要的区别。

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

Java是一种静态类型的语言,而对于所有这些语句而言,情况恰恰相反。程序员必须预先说出他们的变量可以容纳什么类型。它们可能像Object(每个类都Object隐式地扩展)一样宽容,或者像一样具体FieldTagTestsVisitorComparator

Object objectVariable = "hello";
FieldTagTestsVisitorComparator enterpriseVariable = new FieldTagTestsVisitorComparator();

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

var age = 10;

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

如果稍后我在代码中决定要对该变量重新分配其他内容,则可以这样做。

age = {years: 10, months: 4, days: 5};

您可以清楚地看到哪些声明更适合使用。人们经常抱怨Java的冗长。在上面的示例中,我FieldTagTestsVisitorComparator在同一行上声明了两次。那增加了什么价值?我刚才重复了我自己。

varJava中的Java试图减少重复声明的数量。像之前的Diamond运算符一样,语言设计人员正在尝试改进Java编译器,以使其足够聪明地推断出程序员的意图。如果某些内容可以隐式显示,为什么还要显示呢?

实际上,这意味着从左侧 推导 赋值左侧的变量类型。

如果我用Java写以下内容

var foo = new StringBuilder();

那么Java 10+编译器就足够聪明,可以识别右侧的字符串生成器并自动为变量提供foo适当的类型。

这与JavaScript根本不同,因为尽管我没有指定类型,但类型 仍然存在 。随后,我无法将我喜欢的任何东西分配给它:

foo = 3; // fails to compile, foo is of type StringBuilder

var仅在编译时使用。编译器会计算出类型,然后进行替换,其字节码与从未使用过的相同。两者之间没有功能上的区别

var foo = new StringBuilder();

StringBuilder foo = new StringBuilder();

纯粹是外观上的差异,使语言更具表现力。

关于var的状态的注释

Java语言设计人员在添加新功能时始终非常小心,以免破坏向后兼容性,因此var具有特殊的地位。它不是关键字,因为具有关键字状态会过于严格。关键字不能用作标识符,例如;我不能调用一个方法,if因为它if是一个关键字。

var如您的报价所述,是“保留类型名称”。乍一看听起来很复杂,但实际上是对var状态的描述。它是Java保留的类型的名称。您不能命名类型-类,接口,枚举-
var,因为那样会引起歧义。

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

通过具有此状态,设计人员可以最大程度地向后兼容(根本不添加任何功能!)。除非您有一个名为小写的类var-首先,您要如何选择这些可怕的名称,其次,您为什么不至少遵循命名约定并调用它Var?-那么您就可以免受任何重大更改的影响。

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

好的功能,对不对?绝对是重要的,但重要的是不要仅仅因为可以就开始在任何地方使用它。JDK开发人员之一Stuart
Marks有一些出色的样式指南,建议您阅读。

我的经验法则是,如果未在同一行上指定类型(如上述示例中所示),则不使用var。编译器足够聪明,可以从任何有效表达式的结果推断出类型,因此以下内容完全有效:

var foo = bar();

但是,如果不查看方法签名,就无法立即推断出变量的类型是什么。编译器没有歧义,但是对于阅读它的人来说并不清楚。在这种情况下,为了简洁起见,我们牺牲了可读性。



 类似资料:
  • 在这个 nodejs 代码中, 那个… “声明变量”和“变量”有什么区别? 当我在谷歌上搜索时,我得到了runtime这个词。 wiki说运行时是计算机程序运行时的一种操作.... 但我不能理解。 第1行,“进程”之后的“:”和“NodeJS.进程”是什么意思? 这是否意味着“进程”等于“NodeJS.process”? 还有第4行,在“__filename”和“string”之后的“:”是什么意

  • 问题内容: 初始化的优点或区别是什么? 而不是简单地使用: (是:) 非常感谢您的帮助。 问题答案: 惰性存储属性vs存储属性 具有惰性属性而不是存储属性有一些优点。 仅当您读取该属性时,才执行与lazy属性关联的闭包。因此,如果出于某种原因未使用属性(可能是由于用户的某些决定),则可以避免不必要的分配和计算。 您可以使用存储属性的值填充惰性属性。 您可以在内部使用惰性属性关闭

  • 问题内容: 我的一个朋友注意到 在Java中有效。事实证明的类型为。 使用时,只是。 我们俩都无法弄清楚泛型的作用,因为它似乎被忽略了。但是,如果是这样,为什么这在语法上甚至是正确的呢? 问题答案: 这确实是一个错误,但是证明位于Java语言规范§14.4局部变量声明语句中: 您会看到,列出的 受限标识符 没有任何其他标记。同样,最终解析为明确禁止的令牌。 所以,不,是 不是 有效。

  • 问题内容: 我们以前都遇到过这种情况,需要在输入字段中打印变量,但是不确定是否像这样设置了var。基本上,这是为了避免e_warning。 我该如何写得更短?我可以介绍这样的新功能: 但是我没有成功编写printvar()函数。 问题答案: 我的建议是创建一个函数: 它以变量作为参数,如果存在则返回它,如果不存在则返回默认值。现在您可以执行以下操作: 但在其他情况下也可以使用它: 对于PHP> =

  • 问题内容: 用JavaScript 编写循环的正确方法是什么?浏览器不会对我在此处显示的两种方法提出任何投诉。首先,有一种方法可以明确声明迭代变量: 另外,这种方法更自然,但对我而言似乎不正确: 问题答案: 使用,它会减小变量的范围,否则变量将查找最接近的闭包以查找语句。如果找不到,则表示它是全局的(如果处于严格模式下,则全局变量将引发错误)。这可能会导致如下问题。 如果您在for循环中编写警报,

  • 问题内容: 在一个JavaScript文件中,我看到了: 声明并分配给它的目的是什么? 问题答案: 我将以一个插图开始这个答案: 我的回答最初是用jQuery演示的,只是略有不同: 由于在通过调用新函数更改范围时会经常更改,因此无法使用原始值访问原始值。将其别名为可以使您仍然访问的原始值。 就个人而言,我不喜欢使用as作为别名。它指的是什么几乎是不明显的,特别是如果函数长于几行。我 总是 使用更具