Scala概述(二)一种类似Java的语言

Scala与Java对比
本文对比了Scala和Java两种编程语言的相似性和差异性,重点介绍了Scala的一些独特特性,如对象定义、变量定义方式、语法规范性等,并展示了两种语言实现同一功能的示例代码。

2.       一种类似 Java 的语言

Scala 被设计成为可以与主流平台很好的交互,包括 JavaC# 。因此其绝大部分的基本操作符、数据类型和控制逻辑都与这两种语言相同。为简单起见,后面我们仅将 ScalaJava 作对比,由于 JavaC# 本身就有很多共同点,因此 Scala 绝大部分与 Java 的相似之处都可直接应用于 C# 。其实有些情况下 Scala 甚至更接近 C# ,例如对泛型的处理方面。

1 列出了 JavaScala 实现同样功能的两段程序,都是打印出程序命令行包含的所有选项。

 

// Java

class PrintOptions {

    public static void main(String[] args) {

       System.out.println("Options selected:");

       for (int i = 0; i < args.length; i++)

           if (args[i].startsWith("-"))

              System.out.println(" " + args[i].substring(1));

    }

}

 

// Scala

object PrintOptions {

  def main(args: Array[String]): Unit = {

    System.out.println("Options selected:");

    for (val arg<-args)

      if (arg.startsWith("-"))

        System.out.println(" "+arg.substring(1))

  }

}

 

1ScalaJava 程序示例

 

这个示例显示出两种语言很多相似性:他们都有 String 这种基本类,调用同名的方法,使用同样的操作符、同样的条件控制结构等。示例同时也体现两种语言的差异,包括:

 

  • Scala 除类定义之外,还有对象定义的概念(以 Object 开头)。对象定义实际上是定义了一个只有单个实例的类,也就是通常所说的单例( singleton )。在上例中, PrintOptions 这个单例类有一个名为 main 的成员方法。
  • Scala 采用“名称:类型”的方式进行变量定义和参数传递,而 Java 是使用类型前缀的形式,也就是“类型 名称”。
  • Scala 的语法比 Java 的相对更规范:所有的定义都由一个关键字开始,如上例中的 def main ,开始定义一个方法。
  • Scala 不强制要求语句结束使用分号,分号是可选的。(原文中 Java 语句也没有分号,明显是错漏; Scala 两个语句都没有分号,我特意加了一个,更体现原意,当然是确保编译和运行正确的情况下——译注)
  • Scala 没有特定语法来描述数组类型和数组的存取,一个元素类型为 T 的数组用 Array [T ] 来表示。这里 Array 是一个标准的类,而 [T ] 是一个类型参数。实际上, Scala 的数组是继承自函数的,因此数组存取形式就像函数调用 a(i ) ,而不是像 Javaa[i ] 。数组将在 4.3 节进一步讨论。
  • main 函数的返回类型是 unit Java 中是 void 。这种处理源自于这样一个事实: Scala 中语句和表达式没有区别。每一个函数都返回一个值,如果一个函数的右侧是一个 block ,那么这个 block 的最后一个表达式的求值将作为其返回值。 Unit 类型的返回值可能是一个平凡值 {} 。其他的控制结构,如 if-then-else 等,也被泛化为表达式。
  • Scala 采纳了 Java 绝大部分控制结构,但不包含传统的 for 语句。作为替代, Scala 包含 for-comprehensions ,它允许直接遍历数组、列表、迭代器等数据结构而无需使用索引。 Java 5.0 也包括了扩展的 for 循环,有点类似于 Scalafor-comprehensions ,但要严格很多。(一般还有文章对于 list-comprehensions 进行翻译或者探讨翻译的方式,目前尚未有结论。而 for-comprehensions 这种语法结构的名词还没有在其他语言中看到,因此暂不作任何翻译的尝试了——译注)

 

尽管语法上存在差异, Scala 程序和 Java 程序进行互操作没有任何困难。如上例所示 , Scala 程序调用了 String 类的 startWithsubstring 方法,而这里的 String 是一个 Java 类。它还访问了 JavaSystem 类的 out 这一静态属性,并且调用其经过重载的 println 方法。实际上 Scala 的类根本没有静态成员这一概念,但是上述调用仍然成为可能,这是因为每一个 Java 类在 Scala 中对应两个实体:一个是包含了所有动态成员的类,一个是包含了所有静态成员的单例对象。因此 System.out 这一属性是通过 ScalaSystem 这个单例对象来访问的。

此外,上例中并未描述的是, Scala 的类 / 对象还能够继承 Java 类或实现 Java 定义的接口,这使得在 Java 框架中调用 Scala 代码成为可能。例如,一个 Scala 类可以实现 Javajava.util.EventListener 接口,从而使该 Scala 类的实例可以接收到 Java 代码发出的事件。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值