Scala学习笔记一,与Java、Jvm的关系以及程序执行流程分析

一、Scala语言与Java、Jvm的关系分析

  Scala语言是马丁奥德斯基接触Java语言后,针对Java语言的特点,将函数式编程语言的特点融合到Java中,由此发明的。Scala语言和Java语言的;联系是十分紧密的。现在主流的JVM的Javac编译器就是马丁奥德斯基编写的,包括JDK1.5和JDK1.8。那么Scala和Java以及JVM之间有什么样的联系呢?我们来分析一下,如下图所示:

  可以看出Scala语言编译的范围要大于Java语言的编译范围,也就是说有的Java程序可以通过Scalac编译形成字节码,然后通过Scala运行器运行想要的class文件,因为Scala语言包含了部分Java语法。

  但是Java编译器是无法,编译Scala程序然后用Java运行器执行的,因为Scala拥有自己一些特有的语法,这是Java编译器和运行器所顾及不到的。

  同时Scala语言也有自己的类库SDK,这些类库可能会用到JDK提供的相关类库,主要是使用JDK对其进行进一步的包装形成SDK。

  Scala语言的Scalac编译和Scala运行器文件都在Scala安装目录的bin文件夹下。

总结一下Scala语言的特点:

  (1)Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言

  (2)Scala 是一门多范式 (multi-paradigm) 的编程语言,Scala支持面向对象和函数式编程。

  (3)Scala源代码(.scala)会被编译成Java字节码(.class),然后运行于JVM之上,并可以调用现有的Java类库,实现两种语言的无缝对接。

  (4)scala 单作为一门语言来看, 非常的简洁高效 。

  (5)Scala 在设计时,马丁·奥德斯基是参考了Java的设计思想,可以说Scala是源于java,同时马丁·奥德斯基也加入了自己的思想,将函数式编程语言的特点融合到JAVA中, 因此学习过Java,只要在学习Scala的过程中,搞清楚Scala和java相同点和不同点,就可以快速的掌握Scala这门语言。

二、Scala程序执行流程分析

  Scala语言的源代码文件的后缀名是.scala,编写完源代码然后经过Scalac编译器编译会生成两个.class文件,下面来分析一下具体的执行过程。先编写一个最简单的Scala程序:

object TestScala {

  def main(args: Array[String]): Unit = {
    println("hello,scala,idea...")
  }
}

1.object表示一个伴生对象,这里可以简单的理解就是一个对象

2.TestScala就是对象名字,它底层真正对应的类名是TestScala$,对象是TestScala$类型的一个静态对象MODULE$

3.def表示是一个方法,这是一个关键字

4.main表示方法名字,表示程序执行的入口

5.args:Array[String]表示形参,scala的特点是将参数名写在前面,类型在后

6.Array[String]表示类型是一个数组

7. :Unit=表示该函数的返回值为空

8.println 打印输出

9.当我们编写一个object TestScala,底层会生成两个.class文件分别是TestScala和TestScala$,对上面这两个.class文件进行反编译,如下所示:

TestScala

public final class TestScala
{
  public static void main(String[] paramArrayOfString)
  {
    TestScala$.MODULE$.main(paramArrayOfString);
  }
}

TestScala$

public final class TestScala$
{
  public static final  MODULE$;

  static
  {
    new ();
  }

  public void main(String[] args)
  {
    Predef..MODULE$.println("hello,scala,idea...");
  }
  private TestScala$() { MODULE$ = this; }

}

10.scala在运行时的流程如下:

(1)先从TestScala的main开始执行

(2)然后调用TestScala$类的主方法TestScala$.MODULE$.main

(3)即执行了TestScala$类中的main方法,打印输出了“hello,scala,idea...”,可以理解为我们在main中写的代码放在了TestData$的main方法中,在底层执行scala编译器做了一个包装。

我们可以通过Java程序来模拟上面Scala程序的执行过程,如下所示:

public class TestScala {

    public static void main(String[] paramArrayOfString) {

        TestScala$.MODULE$.main(paramArrayOfString);
    }
}

final class TestScala$ {

    public static final TestScala$ MODULE$;

    static
    {
        MODULE$ = new TestScala$();
    }

    public void main(String[] args)
    {
        System.out.println("hello,scala,idea...");
    }
//    private TestScala$() { MODULE$ = this; }

}

只要以后看到有 object objectName,应该有这样一个认识:

1、object objectName对应的是一个objectName$的一个静态对象MODULE$

2、在我们的程序中,是一个单例

Scala程序开发的注意事项:

Scala源文件以 “.scala" 为扩展名。

Scala程序的执行入口是main()函数。

Scala语言严格区分大小写。

Scala方法由一条条语句构成,每个语句后不需要分号(Scala语言会在每行后自动加分号),这也体现出Scala的简洁性。如果在同一行有多条语句,除了最后一条语句不需要分号,其它语句需要分号。