Java 10引入了一个新功能:局部变量类型推断(LVTI)。对于局部变量,可以使用 “var” 代替实际类型,也就是像js一样,可以通过 var 定义变量。那么 var 是新增加的关键字吗?
答案是否定的,标识符var不是一个关键字,而是一个保留类型名。那么你还记得啥是保留类型名吗?
如果你也想对这块基础知识进行一次查漏补缺,那么咱们就开始吧!

一、前言

事情的起因是在无意间看到一个java基础知识的题,其中有一段 var a = 10;这样的代码 ,我感觉很纳闷,这不是js里定义变量的方法吗?

后来查看解析才发现,自Java10开始,增加了局部变量类型推断的功能,就已经支持 var 定义变量。

说来惭愧,之前项目中还一直沿用的Java8,对后续版本的变动确实不敏感。深感愧疚,遂决定开始查漏补缺。

二、局部变量类型推断(var)究竟是什么?

2.1 概念理解

首先,先上官方文档:JEP 286: Local-Variable Type Inference (openjdk.org)。

大家可以先大致过一下官方文档,以防我的理解偏差误导了大家。

Java局部变量类型推断(LVTI),简称var类型,Java 10中通过 JEP 286 添加进来。(Java 10 发布时间为 2018.03)。

其允许开发人员省略通常不必要的局部变量类型的声明。这种处理将仅限于具有初始值设定项的局部变量,增强型 -循环中的索引以及在传统 -循环中声明的局部变量;它不适用于方法形式,构造函数形式,方法返回类型,字段,捕获形式或任何其他类型的变量声明。

作为100%编译特征,它不会影响字节码,运行时或者性能。在编译时,编译器会检查赋值语句右侧代码,从而推断出具体类型。它查看声明的右侧,如果这是一个初始化语句,它会用那个类型取代var
另外,它非常有助于减少冗余代码和样板代码。它还只在旨在编写代码时所涉及的仪式。

2.2 实际应用

// java10 之前
int a = 1;
String b = "string";
double c = 1.1;
boolean d = true;
ArrayList<String> e = new ArrayList<String>();// java10 之后可以使用var
var a = 1;
var b = "string";
var c = 1.1;
var d = true;
var e = new ArrayList<String>();

2.3 简单总结

  1. var 的使用是有要求的:

​ (1)只能用于局部变量上;

​ (2)声明时必须初始化;

​ (3)不能用作方法参数

  1. var 是100%编译特征,它不会影响字节码,运行时或者性能。
  2. var 应有节制地使用,否则会降低代码的可读性。

三、var 是新的关键字吗?

在搜索相关资料的时候,发现很多文章标题直接就是 Java10 var 关键字。

那么 var 究竟是不是关键字呢?

3.1 官方描述:不是

JEP 286:局部变量类型推断 (openjdk.org)

The identifier is not a keyword; instead it is a reserved type name. This means that code that uses as a variable, method, or package name will not be affected; code that uses as a class or interface name will be affected (but these names are rare in practice, since they violate usual naming conventions).

翻译一下:

标识符不是关键字;相反,它是一个保留类型名。这意味着用作变量、方法或包名的代码不会受到影响;用作类或接口名称的代码将会受到影响(但这些名称在实践中很少见,因为它们违反了通常的命名约定)

官网说的很清楚,var 是保留类型名,那你还记得啥是保留类型名吗?

3.2 保留类型名是什么

关键字: 被Java语言赋予了特殊含义,用作专门用途的字符串。关键字不能作为包名、类名、方法名、变量名。

保留类型名: 现有的Java版本尚未使用,但以后版本可能作为关键字使用。保留类型名不能作为类名。

3.3 代码验证

四、你还记得有哪些关键字吗?

这是 Java 中基础的知识点了。大家可以直接查看 javax.lang.model.SourceVersion 类 的isKeyword 方法。

// 我贴的这部分代码来自JDK17,其余版本可自行查看。
/*** Returns whether or not {@code s} is a keyword, boolean literal,* or null literal in the given source version.* This method returns {@code false} for <i>restricted* keywords</i> and <i>restricted identifiers</i>.** @param s the string to check* @param version the version to use* @return {@code true} if {@code s} is a keyword, or boolean* literal, or null literal, {@code false} otherwise.* @jls 3.9 Keywords* @jls 3.10.3 Boolean Literals* @jls 3.10.8 The Null Literal* @since 9*/public static boolean isKeyword(CharSequence s, SourceVersion version) {String id = s.toString();switch(id) {// A trip through historycase "strictfp":return version.compareTo(RELEASE_2) >= 0;case "assert":return version.compareTo(RELEASE_4) >= 0;case "enum":return version.compareTo(RELEASE_5) >= 0;case "_":return version.compareTo(RELEASE_9) >= 0;// case "non-sealed": can be added once it is a keyword only// dependent on release and not also preview features being// enabled.// Keywords common across versions// Modifierscase "public":    case "protected": case "private":case "abstract":  case "static":    case "final":case "transient": case "volatile":  case "synchronized":case "native":// Declarationscase "class":     case "interface": case "extends":case "package":   case "throws":    case "implements":// Primitive types and voidcase "boolean":   case "byte":      case "char":case "short":     case "int":       case "long":case "float":     case "double":case "void":// Control flowcase "if":      case "else":case "try":     case "catch":    case "finally":case "do":      case "while":case "for":     case "continue":case "switch":  case "case":     case "default":case "break":   case "throw":    case "return":// Other keywordscase  "this":   case "new":      case "super":case "import":  case "instanceof":// Forbidden!case "goto":        case "const":// literalscase "null":         case "true":       case "false":return true;default:return false;}}

五、总结

如官网所言,var 是一个保留类型名,不能作为类名使用。但可以用作变量、方法或包名以及包名(不推荐)。var 是100%编译特征,其使用有一定限制,但应有节制地使用,否则会降低代码的可读性。

查漏补缺:Java10之后,var成为关键字了吗相关推荐

  1. Java查漏补缺(08)关键字:static、单例设计模式、理解main方法、类的成员之四:代码块、final关键字、抽象类、接口、内部类、枚举类、注解、包装类

    Java查漏补缺(08)关键字:static.单例设计模式.理解main方法.类的成员之四:代码块.final关键字.抽象类.接口.内部类.枚举类.注解.包装类 本章专题与脉络 1. 关键字:stat ...

  2. 前端查漏补缺 全知识点合集(更新中9.3)

    该篇文章用于本人查漏补缺,会有大量知识点,不定期更新,有人愿意看就随便看看. HTML 浏览器的运行机制: 构建DOM树(parse):渲染引擎解析HTML文档,首先将标签转换成DOM树中的DOM n ...

  3. 2019/5/12 查漏补缺

    目录 2019/5/12 查漏补缺 数据类型分为两大类:基本类型和引用类型: java中类的继承关系 关于接口 重载和重写 静态变量 java中的关键字和保留字 数据库操作 实现数据库收回部分权限的操 ...

  4. 无效字符 java_Java知识查漏补缺

    Java基础知识查漏补缺 单元测试中,Mock对象的存在破坏了面向对象中的封装 mock对象:也成为伪对象,在测试中的利用mock对象来代替真实对象,方便测试的进行. java的封装性:指的是将对象的 ...

  5. Mysql查漏补缺笔记

    目录 查漏补缺笔记2019/05/19 文件格式后缀 丢失修改,脏读,不可重复读 超键,候选键,主键 构S(Stmcture)/完整性I(Integrity)/数据操纵M(Malippulation) ...

  6. C/C++基础查漏补缺(八)----------寒假学习笔记(八)

    寒假C语言基础查漏补缺笔记(八) 本系列文章是基于自身的编程基础而编写的,其内容并非适用于所有人,请海涵~ 不过内容应该包括了所有的考点.用法,初学C/C++的大学生或者noip入门级选手可以以此作为 ...

  7. C/C++基础查漏补缺(一)----------寒假学习笔记(一)

    寒假C语言基础查漏补缺笔记(一) 本系列文章是基于自身的编程基础而编写的,其内容并非适用于所有人,请海涵~ 不过内容应该包括了所有的考点.用法,初学C/C++的大学生或者noip入门级选手可以以此作为 ...

  8. 前端面试查漏补缺--(三) 跨域及常见解决办法

    前言 本系列最开始是为了自己面试准备的.后来发现整理越来越多,差不多有十二万字符,最后决定还是分享出来给大家. 为了分享整理出来,花费了自己大量的时间,起码是只自己用的三倍时间.如果喜欢的话,欢迎收藏 ...

  9. JavaScript 基础知识查漏补缺

    JavaScript 基础知识查漏补缺(持续更新) 数据类型 var bool = '4.3' > '11' console.log(bool) // 结果为true,二者都为字符串,字符串之间 ...

最新文章

  1. centos 6.3 安装reids
  2. poj 1947(树形dp+背包问题)
  3. 为什么jsp写script代码报错_JSP 报错:ReferenceError: $ is not defined
  4. iOS开发ARC内存管理技术要点
  5. php语言的四种循环控制语句,PHP 控制语句之循环用法示例
  6. MySQL笔记——多表查询
  7. Sort Integers by the Number of 1 Bits
  8. 光域网(IES)在Unity3d中的应用【2020】
  9. php公众号后台,微信公众号后台管理系统
  10. 去除图片上文字的方法(6种)
  11. 抖音返利分销模式及代理系统开发
  12. w3c html 检验器,如何在W3C验证器中验证HTML时获取徽章?
  13. 计算机网络连接叹号,【电脑网络连接感叹号】电脑网络连接感叹号怎么回事_电脑网络连接感叹号怎么办_亲亲宝贝网...
  14. ViewFlipper和ViewPager
  15. mysql 行转列case when_mysql行转列利用casewhen_MySQL
  16. .bat 文件打开软件
  17. 爱的网页,献给爱的人
  18. 压力传感器与51单片机C语言程序,基于51单片机的智能压力传感器设计
  19. 计算机体系结构2030:未来15年的研究愿景*Mark Hill
  20. 字符串分割(比如按逗号,分号)

热门文章

  1. 遇到Python嵌套不要怕,你足够认真,它就是纸老虎(14)
  2. Storm之——流组件简单串行编程实践
  3. batocera_旧电脑变身影音游戏主机,支持70多个平台上万个游戏
  4. POJ 3470 Walls 已翻译
  5. Echarts分时图绘制
  6. 记录一次比较糟心的数据库目录挂载
  7. 【论文复现】SimCSE对比学习: 文本增广是什么牛马,我只需要简单Dropout两下
  8. 短视频评论的抓取及分析
  9. 如何白嫖最新版BurpSuite Pro
  10. Python3.X识别混合编码,顺便解决“AttributeError: 'module' object has no attribute 'urlopen'”