第1章、Scala入门
1.1 概述
1.1.1 为什么要学习Scala
(1)Scala基于JVM,和Java完全兼容,具有跨平台、可移植性好、方便的垃圾回收等特性
(2)Scala比Java更加面向对象。(比Java更加纯粹)
(3)Scala是一门函数式编程语言。
(4)Scala更适合大数据的处理
(5)Scala对集合类型数据处理有非常好的支持
(6)Spark的底层用Scala编写
1.1.2 Scala发展历史
Scala之父马丁奥德斯基从2001年开始设计Scala。
马丁奥德斯基也参与了Java的JVM编写
Java因为从C发展而来,所以面向对象并不是很彻底,比如说包含了基本数据类型。
马丁奥德斯基既希望在JVM平台上开发另外一门编程,既要彻底的面向对象,又要函数式编程。
马丁奥德斯基在1996年先研发了pizza语法,在pizza语言中引入了泛型,所以Java也引入了泛型。
Scala引入了类型推断和lambda表达式。
所以在Java1.8中也引入了类型推断和lambda表达式。
1.1.2 Scala和Java关系
Scala和Java及JVM关系图
(1)Java:java文件先进行java编译器得到class文件,class文件可以在JVM上运行。
(2)Scala:scala文件,scala可以直接调用java的类库,也可以写scala的语言,通过scala编译器得到class文件,可以在JVM上运行。
Java是编译语言还是解释语言?
(1)java是先通过java编译器编译成class文件,然后再把class放到jvm上解释执行
(2)所以java语言既有编译,也有解释。 所以并不是纯粹的编译或者解释语言。
1.1.4 Scala的特点
(1)融合:把很多的特性融合在一起
(2)以JVM运行环境,把面向对象和函数式编程结合在一起的静态类型的高级语言。
(3)静态类型:java、scala、c、c++,变量类型需要提前指定。
动态类型:python、js,变量类型不需要提前指定。
(4)scala和java兼容,在scala中可以直接调用java类库
(5)简洁高效,可读性强。
(6)scala的设计思想源于java,并结合函数式编程,又改进了java中不够高效的东西。
1.2 Scala环境搭建和运行
1)安装步骤
① 确保JDK1.8安装成功
② 下载Scala安装文件 scala-2.12.11.zip (可以在scala官网上下载)https://scala-lang.org/download/all.html
③ 解压scala-2.12.11.zip,记住解压路径
④ 配置环境变量即可。
可以添加SCALA_HOME、然后把bin目录添加到Path中即可
在cmd中输入scala进入交互界面
scala> val a = 10 // 定义一个变量a,赋值为10
// a: Int = 10 类型会自动判断为Int
scala> val a = 23
// b: Int = 23
scala> a + b
// res1: Int = 33
scala> println("hello world")
// hello world
//
scala> :quit //退出命令行
1.3 Scala的编译及分析
** 1)编译scala源文件 **
① 新建HelloScala.scala 文件
object HelloScala{
// Scala中不用数组,所以用泛型为String的集合
// Unit表示返回值为空
def main(args: Array[String]): Unit = {
println("Hello Scala") //scala中不需要用分号
}
}
② 在cmd中输入scalac HelloScala.scala
进行编译
得到两个字节码文件
HelloScala.class
HelloScala$.class
③ 在cmd中输入scala HelloScala
运行
2)Scala编译结果和反编译分析
通过编译之后,会得到两个文件HelloScala.class、HelloScala$.class,这两个文件的作用是什么?
(1)HelloScala.class的main方法调用HelloScala$.class中的方法
(2)在HelloScala的代码中有一个关键字object,在scala中称为伴生对象,伴生对象是一个静态的单例对象,且里面都是静态方法,并且需要一个真正的对象,真正的对象则存放在HelloScala$.scala中。
(3)scala中没有static关键字,所以用object来代表里面的方法都是静态的,但是scala也是用的JVM,所以他就通过单例设计模式,实现只有一个对象的类(HelloScala$.scala),那就相当于调用静态方法。
1.4 在IDE中编写Scala
使用IDEA做scala项目的编写。
(1)在IDEA中选择New Project,然后选择Maven,Java版本选择1.8,在Maven中选择。填写GroupId和ArtifactId(项目名)
(2)如果需要编写Scala,需要安装Scala插件。(右键Settings、点击Plugins、搜索Scala,然后安装)
(3)安装之后重启IDEA。
(4)右键项目名(scalaProject1),点击Add Framework Support,选择Scala插件。点击Create,选择Scala所在的地址,点击OK。
(5)然后重新建立一个scala文件,即可编写
package chapter01
object HelloScala {
def main(args:Array[String]):Unit={
println("hello")
System.out.println("hello java") //kava的代码
}
}
1.5 Scala代码解析
package chapter01
// object 声明一个伴生对象(单例对象)
object HelloScala {
// 定义一个main方法
// def 方法名(参数名称:参数类型):返回类型={}
def main(args:Array[String]):Unit={
println("hello")
System.out.println("hello java") //kava的代码
}
}
1.6 为什么要有object伴生对象
scala之父马丁奥德斯基认为静态属性不属于面向对象,所以scala之父将static关键字进行删除。
但是为了保持静态方法,则引入了object伴生对象,伴生对象中的所有属性都是静态。
scala之父将类class中的静态方法和属性全部抽取出来,放到同名的object(伴生对象)中。
// 将构造方法直接定义在()里面
class Student(name:String,age:Int){
def printInfo():Unit={
//Student.school 是一个静态属性,所以放在伴生对象object中
print(name + " " + age + " " + Student.school)
}
}
// 伴生对象,用于存放class中的静态方法、属性
object Student{
// Student的 class、object的私有成员都是互相访问的。
val school:String = "university"
// main函数
def main(args:Array[String]):Unit={
val alice = new Student("alice",20)
alice.printInfo()
}
}
1.7 关联Scala源码
略
1.8 官方编程指南
可以在Scala的官网上查看API