Scala語言入門一(初識)

2020-08-15 17:08:22

一、Scala概述

Scala是一門多範式的程式語言,一種類似java的程式語言,設計初衷是實現可伸縮的語言、並整合物件導向程式設計和函數語言程式設計的各種特性。Scala把Erlang風格的基於actor的併發帶進了JVM。開發者可以利用Scala的actor模型在JVM上設計具伸縮性的併發應用程式,它會自動獲得多核心處理器帶來的優勢,而不必依照複雜的Java執行緒模型來編寫程式。Scala 執行在Java虛擬機器上,併相容現有的Java程式。Scala 原始碼被編譯成Java位元組碼,所以它可以執行於JVM之上,並可以呼叫現有的Java類庫

二、Scala的安裝

Scala下載地址

三、Scala使用入門

1、互動式

scala> 1+3
res0: Int = 4

scala> println("Hello World")
Hello World

2、程式碼方式

object Test {
  def main(args: Array[String]): Unit = {
    println("Hello World")
  }
}

四、Scala入門

1、基本數據型別

數據型別 描述
Byte 8位元有符號二補數整數。數值區間爲 -128 到 127
Short 16位元有符號二補數整數。數值區間爲 -32768 到 32767
Int 32位元有符號二補數整數。數值區間爲 -2147483648 到 2147483647
Long 64位元有符號二補數整數。數值區間爲 -9223372036854775808 到 9223372036854775807
Float 32 位, IEEE 754 標準的單精度浮點數
Double 64 位 IEEE 754 標準的雙精度浮點數
Char 16位元無符號Unicode字元, 區間值爲 U+0000 到 U+FFFF
String 字串
Boolean true或false
Unit 表示無值,和其他語言中void等同。用作不返回任何結果的方法的結果型別。Unit只有一個範例值,寫成()。
Null null 或空參照
Nothing Nothing型別在Scala的類層級的最底端;它是任何其他型別的子型別
Any Any是所有其他類的超類
AnyRef AnyRef類是Scala裡所有參照類(reference class)的基礎類別

上表中列出的數據型別都是物件,也就是說scala沒有java中的原生型別。在scala是可以對數位等基礎型別呼叫方法的

2、變數

變數是一種使用方便的佔位符,用於參照計算機記憶體地址,變數建立後會佔用一定的記憶體空間。基於變數的數據型別,操作系統會進行記憶體分配並且決定什麼將被儲存在保留記憶體中。因此,通過給變數分配不同的數據型別,你可以在這些變數中儲存整數,小數或者字母

a、變數宣告

在 Scala 中,使用關鍵詞 「var」 宣告變數,使用關鍵詞 「val」 宣告常數

# 以上定義了變數 myVar,我們可以修改它
var myVar : String = "Foo"

# 定義了常數 myVal,它是不能修改的。如果程式嘗試修改常數 myVal 的值,程式將會在編譯時報錯
val myVal : String = "Foo"

b、變數型別宣告

變數的型別在變數名之後等號之前宣告。定義變數的型別的語法格式如下

var age: Int = [Initial  value]

val name: String = [Initial  value]

c、變數型別參照

在 Scala 中宣告變數和常數不一定要指明數據型別,在沒有指明數據型別的情況下,其數據型別是通過變數或常數的初始值推斷出來的。所以,如果在沒有指明數據型別的情況下宣告變數或常數必須要給出其初始值,
否則將會報錯

var myVar = 10;

val myVal = "Hello, Scala!";

d、Scala 多個變數宣告

val a,b = 100

3、存取修飾符

Scala 存取修飾符基本和Java的一樣,分別有:private,protected,public。如果沒有指定存取修飾符,預設情況下,Scala 物件的存取級別都是 public。Scala 中的 private 限定符,比 Java 更嚴格,在巢狀類情況下,外層類甚至不能存取被巢狀類的私有成員

a、私有(private)

用 private 關鍵字修飾,帶有此標記的成員僅在包含了成員定義的類或物件內部可見,同樣的規則還適用內部類

class Outer{
    class Inner{

    private def f(){println("f")}

    class InnerMost{
        f() // 正確
        }
    }

    (new Inner).f() //錯誤
}

(new Inner).f( ) 存取不合法是因爲 f 在 Inner 中被宣告爲 private,而存取不在類 Inner 之內。但在 InnerMost 裡存取 f 就沒有問題的,因爲這個存取包含在 Inner 類之內。Java中允許這兩種存取,因爲它允許外部類存取內部類的私有成員

b、保護(protected)

在 scala 中,對保護(Protected)成員的存取比 java 更嚴格一些。因爲它只允許保護成員在定義了該成員的的類的子類中被存取。而在java中,用protected關鍵字修飾的成員,除了定義了該成員的類的子類可以存取,同一個包裡的其他類也可以進行存取

package p{
class Super{
    protected def f() {println("f")}
    }
    class Sub extends Super{
        f()
    }
    class Other{
        (new Super).f() //錯誤
    }
}

c、公共(Public)

Scala中,如果沒有指定任何的修飾符,則預設爲 public。這樣的成員在任何地方都可以被存取

class Outer {
   class Inner {
      def f() { println("f") }
      class InnerMost {
         f() // 正確
      }
   }
   (new Inner).f() // 正確因爲 f() 是 public
}