Scala - 變量、塊、方法、函數的定義以及數據類型

變量定義

在java中,咱們是這樣定義變量的:java

String str = "hello";
int num = 1;

在Scala中,咱們是這樣定義變量的:函數

val str: String = "hello"
var num: Int = 1;

這兩個的區別:spa

  • java是先聲明變量的類型,而後定義變量的名稱
  • Scala是經過var定義變量的名稱,而後在變量後面加他的類型
  • Scala也能夠不指定他的類型,那Scala會根據賦值來類型推斷變量的類型。因此下面的語句就會打印int和class java.lang.String。
  • Scala變量類型定義後,就不能對類型進行修改,因此咱們下面註釋掉的語句是編譯不過去的,這個和java同樣。scala

    var obj1 = 1
    println(obj1.getClass)
    //obj1 = "obj1"
    
    var obj2 = "obj2"
    println(obj2.getClass)
    //obj2 = 1

    val

    java的final和Scala的val雷同都是用來修飾不可變的變量,若是是值類型,那這個值不能改變,若是是對象類型,那這個對象的引用不可改變。
    java的final,註釋掉的語句是編譯不過去的:code

    final int fNum = 1;
    // fNum=2;//Cannot assign a value to final ariable 'fNum'

    Scala的val,註釋掉的語句是編譯不過去的:對象

    val fNum = 1
    //fNum = 2

    懶加載

    經過lazy val來定義一個懶加載get

    lazy val lz = {
    println("lazy")
    "lz"
    }
    println("-----")
    println(lz)

    打印結果以下,說明在定義的時候,並無運行打印的方法,只有在實際調用lz的時候,纔會調用println("lazy")。編譯器

    -----
    lazy
    lz

塊表達式

塊表達式是用{}包裹起來的多個表達式,其中最後一個表達式就是這個塊的返回值。
下面的塊表達式,x的值爲1。hash

var x = {
  println("block")
  1
}
println(x)

函數的定義

函數定義的時候,左邊是傳入的參數,右邊是塊表達式(若是隻有一句能夠省略{}),中間的符號是=>
好比咱們定義一個匿名函數:it

(x: Int) => x + 1

給函數一個名稱:

var fun1 = (x:Int)=> x+1
println(fun1(10))//輸出11

無參函數:

var fun2=()=>10
println(fun2())

方法的定義

方法的定義跟函數的定義雷同,首先是定義方法的關鍵字def,而後是參數的類型,返回值的類型,=,最後是方法體。

def add(x: Int, y: Int): Int = x + y

若是是無參的話,參數類型能夠不寫。另外返回值也能夠不寫,編譯器會自動推斷。

def method1()={
 1
}

println(method1())// 輸出1

若是=也沒有寫,那這個方法的返回值就是Unit,等同於java的void。

def method2(){
    1
}

println(method2())// 輸出()

數據類型

  1. Any是全部類型的超類型,也稱爲top類型。它定義了某些通用方法,如equals、hashCode和toString。Any有兩個直接子類:AnyVal和AnyRef。
  2. AnyVal是全部值類型的父類,包括Double, Float, Long, Int, Short, Byte, Char, Boolean, Unit。前面幾個相似java的基本類型的包裝類,Unit相似java的void,在scala裏也是AnyVal的子類。
  3. AnyRef是全部引用類型的父類,相似於java的Object。
  4. Null是全部引用類型的子類,相似java中的null。
  5. Nothing是全部類型的子類。
相關文章
相關標籤/搜索