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

简介: 查漏补缺:Java10之后,var成为关键字了吗

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

一、前言

事情的起因是在无意间看到一个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>();

1
2
3
4
5
6
7
8
9
10
11
12
13

2.3 简单总结

var 的使用是有要求的:
​ (1)只能用于局部变量上;

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

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

var 是100%编译特征,它不会影响字节码,运行时或者性能。
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版本尚未使用,但以后版本可能作为关键字使用。保留类型名不能作为类名。

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

这是 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 history
        case "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

            // Modifiers
        case "public":    case "protected": case "private":
        case "abstract":  case "static":    case "final":
        case "transient": case "volatile":  case "synchronized":
        case "native":

            // Declarations
        case "class":     case "interface": case "extends":
        case "package":   case "throws":    case "implements":

            // Primitive types and void
        case "boolean":   case "byte":      case "char":
        case "short":     case "int":       case "long":
        case "float":     case "double":
        case "void":

            // Control flow
        case "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 keywords
        case  "this":   case "new":      case "super":
        case "import":  case "instanceof":

            // Forbidden!
        case "goto":        case "const":

            // literals
        case "null":         case "true":       case "false":
            return true;

        default:
            return false;
        }
    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

五、总结

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

相关文章
|
9月前
|
缓存 安全 Java
Volatile关键字与Java原子性的迷宫之旅
通过合理使用 `volatile`和原子操作,可以在提升程序性能的同时,确保程序的正确性和线程安全性。希望本文能帮助您更好地理解和应用这些并发编程中的关键概念。
247 21
|
8月前
|
Java C语言
课时8:Java程序基本概念(标识符与关键字)
课时8介绍Java程序中的标识符与关键字。标识符由字母、数字、下划线和美元符号组成,不能以数字开头且不能使用Java保留字。建议使用有意义的命名,如student_name、age。关键字是特殊标记,如蓝色字体所示。未使用的关键字有goto、const;特殊单词null、true、false不算关键字。JDK1.4后新增assert,JDK1.5后新增enum。
169 4
|
7月前
|
存储 安全 Java
深入理解 Java 中的 instanceof 关键字
本文深入解析了 Java 中的 `instanceof` 关键字,探讨其在类型判断中的作用。作为二元操作符,`instanceof` 可用于检查对象是否为某类实例或实现特定接口,避免类型转换异常 (`ClassCastException`)。文章通过多态性下的类型判断、安全类型转换、接口实现检测及集合元素类型判定等实际应用场景,展示了 `instanceof` 的强大功能。掌握该关键字可提高代码健壮性,确保运行时类型安全。
564 0
|
11月前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
309 5
Java 并发编程——volatile 关键字解析
|
10月前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
1683 9
|
10月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
11月前
|
缓存 安全 Java
Java volatile关键字:你真的懂了吗?
`volatile` 是 Java 中的轻量级同步机制,主要用于保证多线程环境下共享变量的可见性和防止指令重排。它确保一个线程对 `volatile` 变量的修改能立即被其他线程看到,但不能保证原子性。典型应用场景包括状态标记、双重检查锁定和安全发布对象等。`volatile` 适用于布尔型、字节型等简单类型及引用类型,不适用于 `long` 和 `double` 类型。与 `synchronized` 不同,`volatile` 不提供互斥性,因此在需要互斥的场景下不能替代 `synchronized`。
3429 3
|
JavaScript 前端开发 Java
java中的this关键字
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。自学前端2年半,正向全栈进发。若我的文章对你有帮助,欢迎关注,持续更新中!🎉🎉🎉
195 9
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
258 8
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
164 4