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的簡潔性。如果在同一行有多條語句,除了最后一條語句不需要分號,其它語句需要分號。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM