scala是什么

scala和java关系
一般来说,学 Scala 的人,都会 Java,而 Scala 是基于 Java 的,因此我们需要将 Scala 和 Java 以及 JVM 之间的关系搞清楚,否则学习 Scala 你会蒙圈。
image.png

scala语言特点

Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言(静态语言需要提前编译的如:Java、c、c++等,动态语言如:js)。

  1. Scala是一门多范式的编程语言,Scala支持面向对象和函数式编程。(多范式,就是多种编程方 法的意思。有面向过程、面向对象、泛型、函数式四种程序设计方法。)
  2. Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有 的Java类库,实现两种语言的无缝对接。
  3. Scala单作为一门语言来看,非常的简洁高效。
  4. Scala在设计时,马丁·奥德斯基是参考了Java的设计思想,可以说Scala是源于Java,同时马丁·奥 德斯基也加入了自己的思想,将函数式编程语言的特点融合到JAVA中, 因此,对于学习过Java的同学, 只要在学习Scala的过程中,搞清楚Scala和Java相同点和不同点,就可以快速的掌握Scala这门语言

    安装scala

    (1)首先确保 JDK1.8 安装成功
    (2)下载对应的 Scala 安装文件
    (3)配置 Scala 的环境变量 ```java

    java_home 9 11

    /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home

    JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

    export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

set CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:. export PATH=${JAVA_HOME}/bin:$PATH

export SCALA_HOME=”/opt/homebrew/opt/scala/libexec” export PATH=$SCALA_HOME/bin:$PATH

  1. 测试下
  2. ```java
  3. ➜ Desktop scala
  4. Welcome to Scala 2.13.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_322).
  5. Type in expressions for evaluation. Or try :help.
  6. scala> val a: Int = 10
  7. val a: Int = 10
  8. scala> val b: Int = 20
  9. val b: Int = 20
  10. scala> val res: Int = a + b
  11. val res: Int = 30
  12. scala> :quit

scala编译运行

  1. object HelloScala {
  2. def main(args: Array[String]): Unit= {
  3. println("hello scala")
  4. }
  5. }

编译运行

  1. # 编译, 会生成 HelloScala$.class和HelloScala.class 2个文件
  2. # 运行的时候可以是 scala HelloScala
  3. Desktop scalac ./HelloScala.scala
  4. # 可以编译运行在一起
  5. Desktop scala ./HelloScala.scala
  6. hello scala

sbt安装

  1. brew install sbt
  2. export SBT_HOME="/opt/homebrew/opt/sbt/libexec"
  3. export PATH=${SBT_HOME}/bin:$PATH

idea插件安装

默认情况下 IDEA 不支持 Scala 的开发,需要安装 Scala 插件
image.png

idea添加scala支持

mac, 在idea中无法切到/user目录下,mac按Cmd + Shift + G来切换目录。
command + shift + . 在 Finder 中快速显示和隐藏隐藏文件的快捷键
image.png

idea创建scala工程

1)打开 IDEA->点击左侧的 Flie->选择 New->选择 Project…
image.png
2)创建一个 Maven 工程,并点击 next
image.png
3)GroupId 输入 com.jdxia->ArtifactId 输入 scala->点击 next->点击 Finish
注意:工程存储路径一定不要有中文和空格。
image.png
4) 默认下,Maven 不支持 Scala 的开发,需要引入 Scala 框架。
在项目上, 点击右键-> Add Framework Support… ->选择 Scala->点击 OK
image.png

mac, 在idea中无法切到/user目录下,mac按Cmd + Shift + G来切换目录。
command + shift + . 在 Finder 中快速显示和隐藏隐藏文件的快捷键
image.png
注意:如果是第一次引入框架,Use libary 看不到,需要选择你的 Scala 安装目录,然 后工具就会自动识别,就会显示 user libary。

5) 创建项目的源文件目录
右键点击 main 目录->New->点击 Diretory -> 写个名字(比如 scala)。
右键点击 scala 目录->Mark Directory as->选择 Sources root,观察文件夹颜色发生变化。
image.png
7)在 scala 包下,创建包 com.jdxia.chapter01 包名和 Hello 类名,
右键点击 scala 目录->New->Package->输入 com.jdxia.chapter01->点击 OK。 右键点击 com.jdxia.chapter01->New->Scala Class->Kind 项选择 Object->Name 项输入
HelloWorld

  1. object HelloWorld {
  2. // main 方法名
  3. // 小括号表示参数列表
  4. // 参数声明方式: java -> 类型 参数名
  5. // scala -> 参数名: 类型
  6. // public修饰符: scala中没有 public 关键字, 如果不声明访问权限, 那么就是公共的
  7. // static修饰符: scala 中没有静态语法, 所以没有static关键字
  8. // void关键字: 表示返回值, 但是不遵循面向对象语法, 所以scala中没有, 但是有Unit类型, 表示没有返回值
  9. // scala中: 方法名(参数列表): 返回值类型
  10. // scala中声明方法必须采用关键字def声明
  11. // scala中方法实现复制给哈哈声明, 所以中间需要等号连接
  12. //scala是一个面向对象的语言, 没有静态语法, 为了能调用静态语法(模仿静态语法)
  13. //采用伴生对象单例的方式调用方法
  14. def main(args: Array[String]): Unit = {
  15. println("hello world")
  16. System.out.println("hello scala from java")
  17. }
  18. }

Scala完全面向对象,故Scala去掉了Java中非面向对象的元素,如static关键字,void类型

  1. static

Scala无static关键字,由object实现类似静态方法的功能(类名.方法名)
class关键字和Java中的class关键字作用相同,用来定义一个类;

  1. void 对于无返回值的函数,Scala定义其返回值类型为Unit类

idea关联scala源码

image.png

https://www.scala-lang.org/download/all.html
https://www.scala-lang.org/download/2.13.8.html
image.png
将我们的源码包 拷贝到 lib 文件夹下

在intellij中打开File –> Project Structure,快捷键(Ctrl + Alt + Shift + s);
选择Global Libraries –> 目标SDK;
在右侧面板中的Scala Library下方点击“+”按钮;
选择解压后的源码包的src目录;
apply即可。
看个截图好了:
image.png
出现以下页面就可以了
image.png

sbt编译运行在idea配置

  1. # 解决
  2. export SBT_OPTS="-Xms512M -Xmx1536M -XX:MaxPermSize=256M"
  3. # 或者, 这个是肯定有用的
  4. sbt -mem 2048 clean compile -Dsbt.coursier=false
  5. # 打包项目
  6. sbt dist -Dsbt.coursier=false

image.png
image.png

  1. -Xms1000M -Xmx3000M -Xss5M -XX:+CMSClassUnloadingEnabled -XX:MaxMetaspaceSize=1024m -Dsbt.coursier=false

image.png

程序入口

和java一样,scala的main方法也是程序运行的入口。Scala 中的 main 方法是 def main(args: Array[String]),而且必须定义在 object 中。如下所示:

  1. object Main {
  2. def main(args: Array[String]): Unit =
  3. println("Hello, World!")
  4. }

除了自己写main方法以外,还可以继承App traits,然后将业务逻辑直接写在构造函数中,同时可以使用args来接收参数。如下所示:

  1. object Test extends App {
  2. if(args.length >0 ){
  3. println("hello "+ args(0))
  4. }else{
  5. println("Hello world")
  6. }
  7. }

scala程序反编译

(1)在项目的target目录Hello文件上点击右键->Show in Explorer->看到object底层生成Hello$.class和Hello.class两个文件
image.png
(2)采用Java反编译工具jd-gui.exe反编译代码,将Hello.class拖到jd-gui.exe页面
image.png
image.png

官方编程指南

https://docs.scala-lang.org/