Scala 关键字
Java关键字
Java 一共有 50 个关键字(keywords),其中有 2 个是保留字,目前还不曾用到:goto 和 const。true、false 和 null 看起来很像关键字,但实际上只是字面量而已。本文粗略的把true、false 和 null也看做Java关键字,认为Java一共有53个关键字。下面是大致归类的Java关键字列表:
- assert
- boolean, byte, short, char, int, long, float, double, void
- package, import, class, interface, enum, implements, extends
- public, protected, private, abstract, static, final, volatile, transient, synchronized, strictfp, native
- try, catch, finally, throw, throws
- if, else, do, while, for, switch, case, default, break, continue, return
- super, this
- new, instanceof
- const, goto
- true, false, null
Scala关键字
Scala只有 39 个关键字,下面是大致归类的 Scala 关键字列表:
- package, import, class, object, trait, extends, with, type, forSome
- private, protected, abstract, sealed, final, implicit, lazy, override
- try, catch, finally, throw
- if, else, match, case, do, while, for, return, yield
- def, val, var
- this, super
- new
- true, false, null
对比 Java 关键字 与 Scala 关键字
Java 和 Scala 共有的关键字
Java 和 Scala 共有的关键字,在两个语言里的含义也基本相同。只有一个例外:case。
在 Java 中,case 主要用在 switch-case 语句里。
在 Scala 中,没有switch-case语句,case 关键字主要用来定义 case 类和进行模式匹配。
只有 Java 才用到的关键字
共有 28 个Java关键字没有被 Scala 采用,但 Scala 也是要运行在JVM上的,所以下面来看一下这 28 个关键字所表达的含义是如何在 Scala 里实现的。
assert
scala.Predef定义了assert()方法,如下所示:
object Predef {
@elidable(ASSERTION)
def assert(assertion: Boolean) {
if (!assertion)
throw new java.lang.AssertionError("assertion failed")
}
@elidable(ASSERTION) @inline
final def assert(assertion: Boolean, message: => Any) {
if (!assertion)
throw new java.lang.AssertionError("assertion failed: "+ message)
}
}
boolean, byte, char, short, int, long, float, double
Scala 在 Java 的基础上迈出了一大步,从语法层面彻底消灭了基本类型,也就是说,一切皆是对象,Java 中所有的基本类型在 Scala 中都有相应的类:Boolean、Byte、Char、Short、Int、Long、Float和Double。具体请看这篇文章。
void
和 primitive 类型类似,Scala 使用了更加面向对象的方式来表达 void:Unit类。具体请看这篇文章。
interface和implements
Scala 用 Trait 取代了接口,具体请看这篇文章。
static
Scala 没有 static 概念,取而代之的是单例对象。具体请看这篇文章。
public
在 Scala 里,类、方法、字段等,默认就是 public,而且 Scala 也不允许将它们显式设置为 public,所以 public 这个单词没有任何特殊含义,可以自由使用。
const 和 goto
在 Scala 中,const 和 goto 不再是保留字,可以自由使用。
throws
Scala 抛弃了 Checked Exception,以及 throws 关键字。在 Scala 里,借用了模式匹配的思想来做异常的匹配,因此,在 catch 的代码里,是一系列 case 字句,如下例所示:
object Test {
def main(args: Array[String]) {
try {
val f = new FileReader("input.txt")
} catch {
case ex: FileNotFoundException =>{
println("Missing file exception")
}
case ex: IOException => {
println("IO Exception")
}
}
}
}
native、transient、volatile和strictfp
取代这4个关键字的,是4个注解:@native、@transient、@volatile 和 @strictfp。下面是示例代码:
@transient var t = 1
@volatile var v = 1
@strictfp
def f() = {}
@native
def n(x: Int): Int;
synchronized
Scala 提供了 synchronized 方法,用起来几乎和 Java 的 synchronized 关键字一样:
def sync() = {
this.synchronized {
val x = 2
}
}
但实际上并没有什么 synchronized 方法,反编译之后,上面的 Scala 代码和下面的 Java 代码一模一样:
public void sync() {
synchronized(this) {
...
}
}
instanceof
Scala 中取而代之的是 isInstanceOf[] 方法,代码如下所示:
def instanceof(arg: Any) = {
if (arg.isInstanceOf[String]) {
val str = arg.asInstanceOf[String]
}
}
enum
在Scala里,如果想定义枚举,应该继承 scala.Enumeration,比如下面这段代码:
object Color extends Enumeration {
val Red = Value
val Green = Value
val Blue = Value
}
break, continue, default, switch
如前所述,Scala 用模式匹配取代了 switch-case,从而解放了 switch 和 default 关键字。而 Scala 的 for 循环和 Java 的 for 循环也大相径庭。
Scala 虽然有 while 和 do-while 循环,但是里面不能用 break 和 continue,所以这两个关键字也解放了。
在 Scala 循环中需要实现 break 和 continue 功能代码如下:
// break
breakable(
for (i <- 0 until 10) {
println(i)
if (i == 5) {
break()
}
}
)
// continue
for (i <- 0 until 10) {
breakable {
if (i == 3 || i == 6) {
break
}
println(i)
}
}
Scala 关键字的更多相关文章
- Scala基础语法 (一)
如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我 ...
- scala 学习心得
scala 安装步骤 文件下载地址:www.scala-lang.org(Please report bugs at https://issues.scala-lang.org/. We welcom ...
- Scala 入门详解
Scala 入门详解 基本语法 Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的 Scala 程序是对象的集合,通过调用彼此的方法来实现消息传递.类,对象,方法,实例变 ...
- Scala系统学习(三):Scala基础语法
如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...
- Spark记录-Scala基础语法
如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...
- 大数据学习之Scala中main函数的分析以及基本规则(2)
一.main函数的分析 首先来看我们在上一节最后看到的这个程序,我们先来简单的分析一下.有助于后面的学习 object HelloScala { def main(args: Array[String ...
- 二、java 与 scala相互调用
介绍:scala 是简化的java,运行于jvm的脚步语言.Java和scala通过各自编译器编译过都是jvm能解析class文件.本文介绍java和scala如何互调 scala的源代码文件是以. ...
- Scala Operators, File & RegExp
Operators Thread.`yield`() 反引号除了用于命名标识符,还可以在调用方法时避免冲突(yield 为 Scala 关键字,但也是 Thread 的方法) 中缀运算符(infix ...
- Scala学习笔记(详细)
第2章 变量 val,var,声明变量必须初始化:变量类型确定后不可更改 数据类型:与java有相同的数据类型,在scala中数据类型都是对象 特殊类型:Unit:表示无值,只有一个实例值写出(),相 ...
随机推荐
- Dynamics CRM安装教程八:Claims-based认证-外部访问配置(IFD配置)
内部访问配置完成后就剩下最关键的最后一步了,就是外部访问配置,这个配置好以后就可以让非域用户的计算机访问到我们的CRM系统了.言归正传开始进行配置打开CRM服务器的Dynamic CRM部署管理,选择 ...
- Java基础 - List的两个子类的特点
List两个子类的特点 List的两个子类的特点 因为两个类都实现了List接口,所以里面的方法都差不多,那这两个类都有什么特点呢? ArrayList: 底层数据结构是数组,查询快,增删慢. Lin ...
- Centos6无法使用yum解决办法
12月后Centos 6 系统无法使用yum出现错误(文章底部看) 相信已经有一部分朋友今天连接到CentOS 6的服务器后执行yum后发现报错,那么发生了什么? CentOS 6已经随着2020年1 ...
- rpm 和 yum 软件管理
软件安装总结: 安装软件方式有如下几种: 方式1:编译安装 将源码程序按照需求进行先编译,后安装 缺点: 安装过程复杂,而且很慢 优点: 安装过程可控,真正的按需求进行安装(安装位置.安装的模块都可以 ...
- 《Effective C++》部分内容学习笔记整理
简介 此笔记为<Effective C++>中部分内容的学习笔记. 目录 文档:<Effective C++>
- Mybatis3源码笔记(二)SqlSession
1. 核心层次 2. SqlSession 先从顶层的SqlSession接口开始说起.SqlSession是MyBatis提供的面向用户的API,表示和数据库的会话对象,用于完成对数据库的一系列CR ...
- Day09_47_Map
Map 集合 Map集合** 继承关系** <interface>: Map(接口)<---HashMap(class)/HashTable(class)/SortedMap(子接口 ...
- python3存储numpy格式的矩阵
技术背景 numpy在python中的地位是相当高的,即使是入门的python使用者也会经常看到这个库的使用.除了替代python自带的列表数据格式list之外,numpy的一大优势是其底层的高性能实 ...
- Redis系统学习之SpringBoot集成Redis操作API(集成SpringDataRedis及其分析)
SpringDataRedis调用Redis底层解读 在SpringBoot2.X之前还是直接使用的官方推荐的Jedis连接的Redis 在2.X之后换为了lettuce Jedis:采用直接连接,多 ...
- 0901-生成对抗网络GAN的原理简介
0901-生成对抗网络GAN的原理简介 目录 一.GAN 概述 二.GAN 的网络结构 三.通过一个举例具体化 GAN 四.GAN 的设计细节 pytorch完整教程目录:https://www.cn ...