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等类似 |