探索Scala(8)-- 关键字

本文比较一下Java和Scala语言的关键字

Java关键字

Java一共有50个关键字keywords),其中有2个是保留字,目前还不曾用到:gotoconsttruefalsenull看起来很像关键字,但实际上只是字面量而已。本文粗略的把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个关键字:

  • 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共有的关键字

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没有primitive类型,取而代之的是相应的类:Boolean、Byte、Char、Short、Int、Long、Float和Double。具体请看这篇文章

void

和primitive类型类似,Scala使用了更加OO的方式来表达void:Unit类。具体请看这篇文章

interface和implements

Scala用Trait取代了接口,具体请看这篇文章

static

Scala没有static概念,取而代之的是单例对象。具体请看这篇文章

public

在Scala里,类、方法、字段等,默认就是public,而且Scala也不允许将它们显式设置为public,所以public这个单词没有任何特殊含义,可以自由使用。

const和goto

const和goto不再是保留字,可以自由使用。

throws

Scala抛弃了Checked Exception,以及throws关键字。

native、transient、volatile和strictfp

取代这4个关键字的,是4个注解:scala.native、scala.transient、scala.volatile和scala.annotation.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

取而代之的是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,从而解放了switchdefault关键字。而Scala的for循环和Java的for循环也大相径庭。Scala虽然有while和do-while循环,但是里面不能用break和continue,所以这两个关键字也解放了。

参考资料

《Programming in Scala》第二版

《Scala for the Impatient》

时间: 2024-09-30 07:30:28

探索Scala(8)-- 关键字的相关文章

探索Scala(3)-- 单例对象

研究一下Scala语言的单例对象(Singleton Objects),为下一篇文章做准备. static不是关键字 上一篇文章提到过,interface并不是Scala语言关键字,可以自由使用.同样,static在Scala里也没有特殊的含义,也是可以自由使用的,如下面代码所示: 单例对象 Java并不是完美的面向对象语言,包括很多缺陷,比如允许static字段和方法,primitive类型,等等.Scala语言在这些方面都有所改进,所以号称是比Java更OO的语言.既然去掉了static关键

探索Scala(4)-- Case Classes

本文简单探讨一下Scala语言Case Class的实现机制 Case Class Case Class是Scala语言模式匹配功能的基础.如果定义类的时候加上case关键字,那么它就变成了Case Class,比如下面这个简单的类CC: case class CC(x: Int, y: Int) 那么加上case关键字对于一个类来说,到底意味着什么呢?下文将进行详细的解释. 单例对象 编译CC,会产生两个class:CC.class和CC$.class.这说明,Scala会给case类自动添加

探索Scala(6)-- Tuples

本文讨论一下Tuple的用法和实现方式 Unit Scala语言没有void关键字,取而代之的,是Unit概念(和对象).Scala比Java更加OO,这也算是其中一个方面.从Scala语言的角度来讲,Unit和Tuple并没有太大的联系,但是基于两点原因,我打算先讨论一下Unit: 概念相似:Tuple表示包含n(n > 0)个元素的对象,Unit表示没有对象,或不需要对象.所以Unit可以认为是Tuple的一种特殊情况,即包含0个元素的Tuple. 语法相似:可以用圆括号来创建Tuple实例

探索Scala(7)-- 字段

本文讨论一下在Scala语言里,字段(Fields)是如何实现的 字段实际上是getter/setter方法 在Scala里,字段是通过var或val关键字来定义的.var字段是可读写的,val字段是只读的.下面是一个简单的例子: class MyObj { var intVar = 1 val strVal = "str" } 反编译之后,可以得到下面的Java代码: public class MyObj { private int intVar = 1; private final

探索Scala(5)-- 基本类型

文本讨论一下Scala语言基本类型的实现方式 Java基本类型 Java的数据类型大致可以分为两类:基本(Primitive)类型和对象类型.基本类型一共有8种,分别是boolean.byte.short.char.int.long.float.double.为了把基本类型融入OO系统,Java提供了包装类(Wrapper).包装类在包java.lang里,一共8个,分别与基本类型一一对应,它们是:Boolean.Byte.Short.Character.Integer.Long.Float和D

Scala Control Structures

Scala之Control Structures 一.前言 前面学习了Scala的Numbers,接着学习Scala的Control Structures(控制结构). 二.Control Structures Scala中的控制结构与Java中的颇为类似,但也有所不同,例如,if/then/else控制结构与Java的类似,但是其可以返回值,虽然Java中有三元运算符的特殊语法,但是在Scala中使用if就可以达到同样的效果. val x = if (a) y else z 同样,Scala的

Scala基础语法 (一)

如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我们可以认为 Scala 程序是对象的集合,通过调用彼此的方法来实现消息传递.接下来我们来理解下,类,对象,方法,实例变量的概念: 对象 - 对象有属性和行为.例如:一只狗的状属性有:颜色,名字,行为有:叫.跑.吃等.对象是一个类的实例. 类 - 类是对象的抽象,而对象是类的具体实例. 方法 - 方法

【Scala】Scala之Control Structures

一.前言 前面学习了Scala的Numbers,接着学习Scala的Control Structures(控制结构). 二.Control Structures Scala中的控制结构与Java中的颇为类似,但也有所不同,例如,if/then/else控制结构与Java的类似,但是其可以返回值,虽然Java中有三元运算符的特殊语法,但是在Scala中使用if就可以达到同样的效果. val x = if (a) y else z 同样,Scala的try/catch/finally 结构与Java

Scala总结

===概述 scala是一门以java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言. scala是纯粹的面向对象的语言.java虽然是面向对象的语言,但是它不是纯粹的,因为java的基本数据类型不是类,并且在java中还有静态成员变量和静态方法.相反,scala是纯粹面向对象的,每个值都是对象,每个操作都是方法调用. scala也是一个成熟的函数式语言.函数式编程有两个指导思想:①函数是头等值,也就是说函数也是值,并且和其他类型(如整数.字符串等)