【scala系列】1、基本语法介绍


1. scala 介绍

1.1 什么是Scala

Scala 是一门多范式的编程语言,设计初衷是要整合面向对象编程和函数式编程的各种特性。与java类似的编程语言,也是基于 jvm 运行的一门语言,集成面向对象与函数式编程的各种特性。

1.2 scala与java的关系

scala与java的关系是非常紧密的

因为scala是基于java虚拟机,也就是jvm的一门变成语言。所有的scala的代码都要经过编译为字节码,然后交由java虚拟机来执行。

所以scala与java是可以无缝互相操作的。scala可以任意调用java的代码,所以scala与java的关系是非常紧密的

1.3 scala的特点

1.面向对象:一切皆对象,和java一致

2.函数式编程:可以将方法作为参数传递

3.编码效率高:scala 语言表达能力强,一行代码抵得上java多行,开发速度快。

2. 基本语法

Scala 基本语法需要注意以下几点:

  • 区分大小写: Scala是大小写敏感的,这意味着标识 Hello 和 hello 在 Scala 中会有不同的含义。

  • 类名: 所有的类名的第一个字母要大写。
    如果需要使用几个单词来构成一个类的名称,每个单词的第一个字母要大写。
    示例:class ScalaDemo

  • 方法名称: 所有的方法名称的第一个字母用小写。如果若干单词被用于构成方法的名称,则每个单词的第一个字母应大写。
    示例:def methodName()

  • 程序文件名: 程序文件的名称应该与对象名称完全匹配 (新版本不需要了,但建议保留这种习惯)。
    保存文件时,应该保存它使用的对象名称(记住Scala是区分大小写),并追加 .scala 为文件扩展名。 (如果文件名和对象名称不匹配,程序将无法编译)。
    示例: 假设 “ HelloWorld “ 是对象的名称。那么该文件应保存为 “HelloWorld.scala”

  • 程序入口:Scala程序从 main() 方法开始处理,这是每一个Scala程序的强制程序入口部分。

    示例 def main(args: Array[String])

3. 标识符

Scala 可以使用两种形式的标识符,字符数字符号

  • 字符数字使用字母或是下划线开头,后面可以接字母或是数字,符号 “$” 在 Scala 中也看作为字母。然而以 “$” 开头的标识符为保留的 Scala 编译器产生的标识符使用,应用程序应该避免使用 “$” 开始的标识符,以免造成冲突。
  • Scala 的命名规则采用和 Java 类似的 camel 命名规则,首字符小写,比如 toString。类名的首字符还是使用大写。
  • Scala 内部实现时会使用转义的标识符,比如 :-> 使用 $colon$minus$greater 来表示这个符号。因此如果你需要在 Java 代码中访问 :-> 方法,你需要使用 Scala 的内部名称 $colon$minus$greater。
  • 混合标识符由字符数字标识符后面跟着一个或多个符号组成,比如 unary_+ 为 Scala 对+方法的内部实现时的名称。字面量标识符为使用”定义的字符串,比如 x yield

你可以在 “ 之间使用任何有效的 Scala 标识符,Scala 将它们解释为一个 Scala 标识符,一个典型的使用为 Thread 的 yield 方法, 在 Scala 中你不能使用 Thread.yield()是因为 yield 为 Scala 中的关键字, 你必须使用 Thread.yield()来使用这个方法。

4. 注释

Scala 类似 Java 支持单行和多行注释。多行注释可以嵌套,但必须正确嵌套,一个注释开始符号对应一个结束符号。注释在 Scala 编译中会被忽略,实例如下:

object HelloWorld {
   /* 这是一个 Scala 程序
    * 这是一行注释
    * 这里演示了多行注释
    */
   def main(args: Array[String]) {
      // 输出 Hello World
      // 这是一个单行注释
      println("Hello, world!") 
   }
}

5. Scala 包

Scala 使用 package 关键字定义包,在Scala将代码定义到某个包中有两种方式:

第一种方法和 Java 一样,在文件的头定义包名,这种方法就后续所有代码都放在该包中。 比如:

package com.hnbian
class HelloWorld {}

第二种方法有些类似 C#,可以在一个文件中定义多个包。如:

package com.hnbian.code1 {
  class HelloWorld {
    val a = 10
    def b = "hello code1-" + a
  }
}

package com.hnbian.code2 {
  class HelloWorld {
    val a = 10
    def b = "hello code2-" + a
  }

  object HelloWorld{
    def main(args: Array[String]): Unit = {
      val code1 = new com.hnbian.code1.HelloWorld()
      val code2 = new com.hnbian.code2.HelloWorld()
      println(code1.b) // hello code1-10
      println(code2.b) // hello code2-10
    }
  }
}

6. 包对象

Scala2.8+支持包对象(package object),除了和2.8之前一样可以有下级的object和class,还可以直接有下级变量和函数,例如:

package object packObj {

val a = 10

def b = "hello " + a

  def main(args:Array[String]):Unit = printf("%s", packObj.b)

}

packObj 就是一个包对象,a和b就是包packObj直属的常量和函数,

7. 引用

  • Scala 使用 import 关键字引用包。
  • Scala 默认引入 java.lang._ 、 scala._ 和 Predef._ (_ 类似 Java中的* 如:java.lang.* )
  • import语句可以出现在任何地方,而不是只能在文件顶部。
  • import的效果从开始延伸到语句块的结束。这可以大幅减少名称冲突的可能性。
  • 如果想要引入包中的几个成员,可以使用selector(选取器)
// 引入 Array
import  scala.Array 

// 引入包内所有成员
import  scala._

// 重命名成员
import java.util.{HashMap => JavaHashMap}

// 隐藏成员
import java.util.{HashMap => _, _} // 引入了util包的所有成员,但是HashMap被隐藏了

// 引入多个类
import java.util.{HashSet,HashMap}

8. 系统定义scala._

scala._自动加载,只有发生类名冲突时才需要带上scala.包名。

类型 说明 说明
scala.AnyValue 所有基本类型的根 Int,Char,Boolean,Double,Unit
scala.AnyRef 所有引用类型的根 相当于java的java.lang.Object
scala.Null 所有引用类型的子类
scala.Nothing 所有全部类型的子类
scala.List 不可变的List scala特色的不可变List
scala.Int scala中可以用int作为别名 Double,Float等类似

文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
 上一篇
【scala系列】2、基本数据类型介绍 【scala系列】2、基本数据类型介绍
1. 数据类型概览 在scala中有以下数据类型 数据类 描述 Byte 8位有符号补码整数。数值区间为 -128 到 127 Short 16位有符号补码整数。数值区间为 -32768 到 32767 Int 32位有
2020-03-17
下一篇 
JVM系列(七)、不同的引用类型 JVM系列(七)、不同的引用类型
1. JVM中引用的介绍在java中,除了基本数据类型的变量外,其他所有的变量都是引用类型,指向堆中各种不同的对象。 在jvm中,除了我们常用的强引用外,还有软引用、弱引用、虚引用,这四种引用类型的生命周期与jvm的垃圾回收过程息息相关。
2020-03-15
  目录