在本文中,我将通过示例介绍新的Java SE 10特性——“var”类型。你将学习如何在代码中正确使用它,以及在什么情况下不能使用它。
介绍Java 10引入了一个闪亮的新功能:局部变量类型推断。对于局部变量,现在可以使用特殊的保留类型名称“var”代替实际类型,如下所示:
var name = “Mohamed Taman”;提供这个特性是为了增强Java语言,并将类型推断扩展到局部变量的声明上。这样可以减少板代码,同时仍然保留Java的编译时类型检查。
由于编译器需要通过检查赋值等式右侧(RHS)来推断var的实际类型,因此在某些情况下,这个特性具有局限性。我会在稍后提到这个问题。现在,让我们来看一些简单的例子吧。
在开始演示代码之前,你需要一个IDE来体验这些新特性。现在有很多可选择的IDE,所以你可以在它们当中选择你喜欢的能够支持Java SE 10的IDE,比如Apache NetBeans 9、IntelliJ IDEA 2018或最新版本的Eclipse。
就个人而言,我更喜欢使用交互式的编程工具,可以快速学习Java语言语法,了解新的Java API及其特性,甚至用来进行复杂代码的原型设计。这与枯燥的编辑、编译和执行代码的繁琐过程不太一样:
写一个完整的程序;
编译并修复错误;
运行程序;
弄清楚它有什么问题;
修改;
重复这个过程。
除了IDE之外,现在还可以使用从Java SE 9以就随ava SE JDK一起发布的JShell。
什么是JShell现在,Java有了自己的REPL(Read-Evaluate-Print-Loop)实现JShell(Java Shell),作为交互式的编程环境。那么,它有什么神奇的地方?JShell提供了一个快速友好的环境,让你能够快速探索、发现和试验Java语言特性及其丰富的库。
在JShell中,你可以一次输入一个程序元素,并可以立即看到结果,然后根据需要对代码做出调整。因此,JShell用它的Read-Evaluate-Print循环取代了编辑、编译和执行的繁琐过程。在JShell中,你不需要编写完整的程序,只需要编写JShell命令和Java代码片段即可。
当你输入代码段时,JShell会立即读取、执行并打印结果,然后准备好执行下一个代码片段。因此,JShell的即时反馈可以让你保持注意力,提高你的效率,并加快学习和软件开发过程。
对JShell的介绍就到此为止(InfoQ最近对这个工具进行过全面介绍)。为了深入了解JShell的功能,我录制了一套视频教程“Hands-on Java 10 Programming with JShell”,可以帮助你掌握JShell,可以从Packt或Udemy访问这些教程。
现在,让我们通过一些简单的示例(使用JShell)来了解这个新的var类型能做些什么。
必备软件为了能用上JShell,我假设你安装了Java SE或JDK 10+,并且JDK的bin目录已经加入到系统路径中。如果还没有安装,可以在这里下载JDK 10+最新版本。
启动JShell会话在Windows上,打开命令提示符,输入jshell并按回车键。
在Linux上,打开一个shell窗口,输入jshell并按回车键。
在macOS(以前称为OS X)上,打开终端窗口,输入“jshell”并按回车键。
这个命令会启动一个新的JShell会话,并显示这个消息:
| Welcome to JShell -- Version 10.0.1 | For an introduction type: /help intro jshell> 使用“var”类型现在你已经安装了JDK 10,现在让我们开始玩JShell。我们直接跳到终端,通过示例来了解var类型。只需在jshell提示符下输入我接下来要介绍的每个代码片段,我会把结果留给你作为练习。如果你稍微有瞄过一两眼在代码,你会注意到它们看起来好像是错的,因为当中没有分号。你可以试试看,看看能不能运行。
简单的类型推理这是var类型的基本用法,在下面的示例中,编译器可以将RHS推断为String字面量:
var name = "Mohamed Taman" var lastName = str.substring(8) System.out.println("Value: "+lastName +" ,and type is: "+ lastName.getClass().getTypeName())这里不需要分号,因为JShell是一个交互式环境。只有当同一行代码有多个语句或一个类型声明或方法声明中有多个语句时才需要分号,你将在后面的示例中看到。
var类型和继承