2. Scala變量

2.1 變量是程序的基本組成單位

       舉一個簡單的例子java

       

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    var a: Int = 10 //定義一個整型變量,取名 a,並賦初值 10
    var b: Int = 12 //定義一個整型變量,取名 b,並賦初值 12
    b = 9 //給變量b 賦 9
    println("a=" + a) //輸出語句,把變量 a 的值輸出
    println("b=" + b) //把變量 b 的值輸出

  }

}

 

2.2 變量的介紹

  2.2.1 概念

         變量至關於內存中一個數據存儲空間的表示,能夠把變量看做是一個房間的門牌號,經過門牌號咱們能夠找到對應的房間,而經過變量名能夠訪問到變量(值)。編程

  2.2.2 變量使用的基本步驟

         1) 聲明/定義變量(Scala要求變量聲明時初始化)數組

         2) 使用ide

2.3 Scala變量的基本使用

  2.3.1 快速入門

       

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    var age: Int = 9
    var sal: Double = 9.9
    var name: String = "Jack"
    var ifPass: Boolean = true
    //在scala中,小數默認爲Double ,整數默認爲Int
    var score: Float = 22.9f
    println(s"${age} ${ifPass}")

  }

} 

      示意圖函數式編程

示意圖 

2.4 Scala變量使用說明 

  2.4.1 變量聲明基本語法

                var | val 變量名 [: 變量類型] = 變量值 函數

  2.4.2 注意事項

                1) 聲明變量時,類型能夠省略(編譯器自動推導, 即類型推導)this

                2) 類型肯定後,就不能修改,說明Scala是強數據類型語言spa

                3) 在聲明/定義一個變量時,可使用var或val來修飾,var修飾的變量能夠改變,val修飾的變量不可改變scala

                4) val修飾的變量在編譯後,等同於加上finalcode

                5) var 修飾的對象引用能夠改變,val修飾的則不可改變,但對象的狀態(值)倒是能夠改變的(好比: 自定義對象、數組、集合等)

                6) 變量聲明時,須要初始值

2.5 程序中+號的使用

           1) 當左右兩邊都是數值型時,則作加法運算

               2) 當左右兩邊有一方爲字符串,則作拼接運算

2.6 數據類型

     1) Scala與Java有着相同的數據類型,在Scala中數據類型都是對象,也就是說Scala沒有Java中的原生類型

               2) Scala數據類型分爲兩大類 AnyVal(值類型)和AnyRef(引用類型),注意不論是AnyVal仍是AnyRef都是對象

               3) 相對於Java的類型系統,Scala更要複雜些,也正是這複雜多變的類型系統才讓面向對象編程和函數式編程完美的融合在了一塊兒

  2.6.1 Scala數據類型體系

Scala數據類型體系

  對上面圖的小結和整理

         1) 在Scala中有一個根類型Any,它是全部類的父類

         2) Scala中一切皆爲對象,分爲兩大類 AnyVal(值類型)和AnyRef(引用類型),它們都是Any的子類

         3) Null類型是Scala的特別類型,它只有一個值null,它是bottom class,是全部AnyRef類型的子類

         4) Nothing類型也是bottom class,它是全部類的子類,在開發中一般能夠將Nothing類型的值返回給任意變量或者函數,這裏拋出異常使用不少

         

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    println(sayHello)

  }

  /*好比開發中,咱們有一個方法,就會異常中斷,這時就能夠返回Nothing
    即當咱們Nothing作返回值,就是明確說明該方法沒有沒有正常返回值*/
  def sayHello: Nothing = {
    throw new Exception("拋出異常")
  }

}

         5) 在Scala中仍然遵照,低精度的值,向高精度的值自動轉換(implicit conversion)隱式轉換

    var num_one = 1.7 //默認爲 double
    var num_two = 1.9f //這是 float
    //num_two = num_one ,error ,修改 num_two = num_one.toFloat

  2.6.2 Scala數據類型列表

2.7 整數類型

  2.7.1 基本介紹

               Scala的整數類型就是用於存放整數值的,好比 9,22,123等等

  2.7.2 整型的類型

   

  2.7.3 整型的使用細節           

              1) Scala各整數類型有固定的表數範圍和字段長度,不受具體OS的影響,以保證Scala程序的可移植性

              2) Scala的整型常量/字面量默認爲Int類型,聲明Long類型常量/字面量時,須後加「l」或者「L」

              3) Scala程序中變量常聲明爲Int類型,除非不足以表示大數,才使用Long

              4) 案例

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    println("Long的最大值:" + Long.MaxValue + "~" + Long.MinValue)
    var a = 10 //a Int
    var b = 10l //b Long
    var c = 9223372036854775807l //說 9223372036854775807 超過 Int
    
  }

}

 2.8 浮點類型      

  2.8.1 基本介紹     

               Scala的浮點類型能夠表示一個小數,好比 9.9f,22.9,0.6等等

  2.8.2 浮點類型的分類      

  2.8.3 浮點類型使用細節      

                1) 與整數類型相似,Scala浮點類型也有固定的表數範圍和字段長度,不受具體OS的影響

                2) Scala的浮點類型常量默認爲Double類型,聲明Float類型常量時,須後加「f」或者「F」

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    var num1:Float = 1.2345678912f
    var num2:Double = 1.2345678912
    println("num1=" + num1 + "\n" +"num2=" + num2)
    /*
    運行結果:
    num1=1.2345679
    num2=1.2345678912
    */

  }

}

                3) 浮點型常量有兩種表示形式

                    十進制數形式:如5.21,521.0f,.521等 (必須有小數點)

                    科學計數法形式:如5.21e2 = 5.21 乘以10的2次方,5.21E-2 = 5.21 除以10的2次方

                4) 一般狀況下,應該使用Double類型,由於它比Float類型更精確(小數點後大體7位)   

2.9 字符類型(Char)   

  2.9.1 基本介紹  

                字符類型能夠表示單個字符,字符類型是Char,16位無符號Unicode字符(2個字節),區間值爲U+0000到U+FFFF

  2.9.2 案例演示   

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    var char1: Char = 99
    //當咱們輸出一個char類型是,它會輸出該數字對應的字符(碼值表 unicode)//unicode 碼值表包括ascii
    println("char1=" + char1) // c

    //char能夠當作數字進行運行
    var char2: Char = 'c'
    var num = 10 + char2
    println("num=" + num) // 109

    //緣由和分析
    //1. 當把一個計算的結果賦值一個變量,則編譯器會進行類型轉換及判斷(即會看範圍+類型)
    //2. 當把一個字面量賦值一個變量,則編譯器會進行範圍的斷定
    //   var c2: Char = 'c' + 1  error
    //   var c3: Char = 99 + 1   error
    //   var c4: Char = 100      true
  }

}

  2.9.3 字符類型使用細節    

      1) 字符常量是使用單引號( ' ' )括起來的單個字符,例如:var a1 = 'a', var a2 = '張', var a3 = '20'

      2) Scala也容許使用轉義字符 '\' 來將其後的字符轉變爲特殊字符型常量,例如:var a4 = '\n' ('\n'表示換行符)

      3) 能夠直接給Char賦一個整數,而後輸出時,會按照對應的Unicode字符輸出

      4) Char類型是能夠進行運算的,至關於一個整數,由於它都對應有Unicode碼

2.10 布爾類型(Boolean)  

  2.10.1 基本介紹   

                  布爾類型也叫Boolean類型,Boolean類型數據只容許取值true或false,布爾類型佔一個字節

                  布爾類型適用於邏輯運算,通常用於程序流程控制 [後面詳解]

2.11 Unit類型、Null類型和Nothing類型  

  2.11.1 基本說明   

  2.11.2 使用細節案例

      1) Unit類型用來標識過程,也就沒有明確返回值的函數。因而可知,Unit相似於Java裏的void。Unit直郵一個實例,(),這個實例也沒有實質的意義

      2) Null類只有一個實例對象,null,相似於Java中null的引用。null能夠賦值給任意引用類型(AnyRef),可是不能賦值給值類型(AnyVal,好比:Int,Float,Char,         Boolean,Long,Double,Byte,Short)

      3) Nothing,能夠做爲沒有正常返回值的方法的返回類型,很是直觀的告訴你這個方法不會正常返回,並且因爲Nothing是其它任意類型的子類,它還能跟要求返回值的方法兼容

      4) 代碼案例

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    val res = sayHello()
    println("res=" + res)

    //Null類只有一個實例對象,null,相似於Java中的null引用。null能夠賦值給任意引用類型(AnyRef)
    //可是不能賦值給值類型(AnyVal: 好比 Int, Float, Char, Boolean, Long, Double, Byte, Short)
    val dog: Dog = null
    //錯誤
    //    val char1: Char = null
    //    println("ok~~~")

  }

  //Unit等價於java的void,只有一個實例值()
  def sayHello(): Unit = {

  }

  class Dog {

  }

}

2.12 值類型轉換

  2.12.1 值類型隱式轉換  

      當Scala程序在進行賦值或者運算時,精度小的數據類型自動轉換爲精度大的數據類型這個就是自動類型轉換(隱式轉換)

                  數據類型按精度(容量)大小排序爲

      自動類型轉換細節說明

        1) 有多種類型的數據混合運算時,系統首先自動將全部數據轉換成容量最大的那種數據類型,而後再進行計算 (6.7+10 =》double)

        2) 當咱們把精度(容量)大的數據類型賦值給精度(容量)小的數據類型時,就會報錯,反之就會進行自動類型轉換

        3) (byte,short)和char之間不會相互自動轉換

        4) byte,short,char它們三者能夠計算,在計算時首先轉換爲int類型

        5) 自動提高原則:表達式結果的類型自動提高爲操做數中最大的類型

                        6) 案例演示

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    var n1 = 12
    var n2 = 1.2f

    //有多種類型的數據混合運算時,系統首先自動將全部數據轉換成容量最大的那種數據類型,而後再進行計算
    var n3 = n1 + n2

    //(byte, short) 和 char 之間不會自動的轉換類型
    var n4: Byte = 9
    //var char1 : Char = n4 // 錯誤,由於byte 不能自動轉換char

  }

}

  2.12.2 高級隱式轉換和隱式函數   

      Scala還提供了很是強大的隱式轉換機制(隱式函數,隱式類等等),後面詳解

  2.12.3 強制類型轉換

      自動類型轉換的逆過程,將容量大的數據類型轉換爲容量小的數據類型。使用時要加上強制轉換函數,但可能形成精度下降或溢出,格外要注意

                  強制類型轉換細節說明

       1) 當進行數據的從大到小,就須要強制類型轉換

       2) 強轉符號只針對於最近的操做數有效,每每會使用小括號提高優先級

       3) Char類型能夠保存Int的常量值,但不能保存Int的變量值,須要強轉

       4) Byte和Short類型在進行運算時,看成Int類型處理

       案例演示

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    val num1: Int = 10 * 3.6.toInt + 6 * 1.5.toInt // 36
    val num2: Int = (10 * 3.6 + 6 * 1.5).toInt // 45
    println(num1 + " " + num2)

    val char1: Char = 1
    val num3 = 1
    //val char2 : Char = num3 //錯

  }

}

2.14 值類型和String類型的轉換

  2.14.1 介紹   

      在程序開發中,咱們常常須要將基本數據類型轉成String類型,或者將String類型轉成基本數據類型

  2.14.2 基本數據類型轉String類型 

      語法:將基本類型的值+""便可

                  案例演示:

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    val a1 = 19.6
    //基本數據類型轉string
    val s1 = a1 + "" //之後看到有下劃線,就表示編譯器作了轉換

  }

}

   2.14.3 String類型轉基本數據類型  

      語法:經過基本數據類型的String的toXxx方法便可

                  案例演示:

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    //String類型轉基本數據類型
    val s2 = "23"
    val num1 = s2.toInt
    val num2 = s2.toByte
    val num3 = s2.toDouble
    val num4 = s2.toLong

  }

}

  2.14.3 注意事項和細節   

      1) 在將String類型轉成基本數據類型時,要確保String類型可以轉成有效的數據,好比咱們能夠把"123", 轉成一個整數,可是不能把"Hello"轉成一個整數

      2) 思考就是要把"5.21"轉成Int   //?

      案例演示:

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    //在scala中,不是將小數點後的數據進行截取,而是會拋出異常
    val s1 = "5.21"
    println(s1.toInt) // error
    println(s1.toDouble) //  ok

  }

}

2.15 標識符的命名規範  

  2.15.1 標識符概念  

      1) Scala對各類變量、方法,函數等命名時使用的字符序列稱爲標識符

      2) 凡是本身能夠起名字的地方都叫標識符

  2.15.2 標識符的命名規則(記住)  

      1) Scala中標識符聲明,基本和Java是一致的,可是細節上會有所變化

      2) 首字符爲字母,後續字符任意字母和數字,美圓符號,可後接下劃線_

      3) 數字不能夠開頭

      4) 首字符爲操做符(好比=-*/),後續字符也須要跟操做符,至少一個

      5) 操做符(好比=-*/)不能在標識符中間和最後

      6) 用反引號'....'包括的任意字符,即便是關鍵字(39個)也能夠

object boke_demo01 {

  def main(args: Array[String]): Unit = {

    //首字符爲操做符(好比+ - * / ),後續字符也需跟操做符 ,至少一個
    val ++ = "hello,world!"
    println(++)

    val -+*/ = 90 //ok
    println("res=" + -+*/)

    //看看編譯器怎麼處理這個問題
    // ++  => $plus$plus

    //val +q = "abc" //error

    //用反引號`....`包括的任意字符串,即便是關鍵字(39個)也能夠

    var `true` = "hello,scala!"
    println("內容=" + `true`)

    val Int = 99.78
    println("Int=" + Int)

    //不能使用_ 作標識符
    //    var _ = "jack"
    //    println(_)
    
  }

}

  2.15.3 標識符舉例說明 

hello //true
hello12  //true
1hello  //error
h-b  //error
x h  //error
h_4  //true
_ab  //true
Int  //true 在Scala中,Int不是關鍵字,而是預約義標識符,能夠用,可是不推薦
Float  //true
_  //error 不能夠,由於在Scala中,_有不少其它的做用,所以不能使用
Abc  //true
+*-  //true
+a  //error

  2.15.4 標識符命名注意事項  

      1) 包名:儘可能採起有意義的包名,簡短,有意義

      2) 變量名、函數名,方法名採用駝峯法

  2.15.5 Scala的關鍵字(39個)  

package, import, class, object, trait, extends, with, type, forSome 

private, protected, abstract, sealed, final, implicit, lazy, override 

try, catch, finally, throw

if, else, match, case, do, while, for, return, yield

def, val, var 

this, super 

new

true, false, null
相關文章
相關標籤/搜索