臨沂網(wǎng)站建設(shè)微信海南網(wǎng)站網(wǎng)絡(luò)推廣
第二章、變量和數(shù)據(jù)類型
- 2.1 注釋
- 2.2 變量和常量(重點(diǎn))
- 2.3 標(biāo)識(shí)符的命名規(guī)范
- 2.4 字符串輸出
- 2.5 鍵盤輸入
- 2.6 數(shù)據(jù)類型(重點(diǎn))
- 回顧:Java數(shù)據(jù)類型
- Scala數(shù)據(jù)類型
- 2.7 整數(shù)類型(Byte、Short、Int、Long)
- 2.8 浮點(diǎn)類型(Float、Double)
- 2.9 字符類型(Char)
- 2.10 布爾類型:Boolean
- 2.11 Unit 類型、Null 類型和 Nothing 類型(重點(diǎn))
- 2.12 類型轉(zhuǎn)換
- 擴(kuò)展 Java 面試題(隱式類型轉(zhuǎn)換)
- 2.12.1 數(shù)值類型自動(dòng)轉(zhuǎn)換
- 2.12.2 強(qiáng)制類型轉(zhuǎn)換
- 2.12.3 數(shù)值類型和 String 類型間轉(zhuǎn)換
2.1 注釋
Scala 注釋使用和 Java 完全一樣。
注釋是一個(gè)程序員必須要具有的良好編程習(xí)慣。將自己的思想通過注釋先整理出來,再用代碼去體現(xiàn)。
1)基本語法
(1)單行注釋://
(2)多行注釋:/* /
(3)文檔注釋:/*
*
*/
2)案例實(shí)操
package com.atguigu.chapter02
object TestNotes {def main(args: Array[String]): Unit = {//(1)單行注釋://println("dalang")//(2)多行注釋:/* *//*println("dalang")println("jinlian")*///(3)文檔注釋:/**//*//*//*** println("qingge")println("qingge")println("qingge")*/}
}
3) 代碼規(guī)范
(1)使用一次 tab 操作,實(shí)現(xiàn)縮進(jìn),默認(rèn)整體向右邊移動(dòng),用 shift+tab 整體向左移
(2)或者使用 ctrl + alt + L 來進(jìn)行格式化
(3)運(yùn)算符兩邊習(xí)慣性各加一個(gè)空格。比如:2 + 4 * 5。
(4)一行最長(zhǎng)不超過 80 個(gè)字符,超過的請(qǐng)使用換行展示,盡量保持格式優(yōu)雅
2.2 變量和常量(重點(diǎn))
常量:在程序執(zhí)行的過程中,其值不會(huì)被改變的變量
0)回顧:Java 變量和常量語法
-
變量類型 變量名稱 = 初始值 int a = 10
-
final 常量類型 常量名稱 = 初始值 final int b = 20
1)基本語法
- var 變量名 [: 變量類型] = 初始值 var i:Int = 10
- val 常量名 [: 常量類型] = 初始值 val j:Int = 20
注意:能用常量的地方不用變量
2)案例實(shí)操
- (1)聲明變量時(shí),類型可以省略,編譯器自動(dòng)推導(dǎo),即類型推導(dǎo)
- (2)類型確定后,就不能修改,說明 Scala 是強(qiáng)數(shù)據(jù)類型語言。
- (3)變量聲明時(shí),必須要有初始值
- (4)在聲明/定義一個(gè)變量時(shí),可以使用 var 或者 val 來修飾,var 修飾的變量可改變,val 修飾的變量不可改。
package com.atguigu.chapter02
object TestVar {def main(args: Array[String]): Unit = {//(1)聲明變量時(shí),類型可以省略,編譯器自動(dòng)推導(dǎo),即類型推導(dǎo)var age = 18age = 30//(2)類型確定后,就不能修改,說明 Scala 是強(qiáng)數(shù)據(jù)類型語言。
// age = "tom" // 錯(cuò)誤//(3)變量聲明時(shí),必須要有初始值
// var name //錯(cuò)誤
//(4)在聲明/定義一個(gè)變量時(shí),可以使用 var 或者 val 來修飾,var 修飾
的變量可改變,val 修飾的變量不可改。var num1 = 10 // 可變val num2 = 20 // 不可變num1 = 30 // 正確//num2 = 100 //錯(cuò)誤,因?yàn)?num2 是 val 修飾的}
}
- (5)var 修飾的對(duì)象引用可以改變,val 修飾的對(duì)象則不可改變,但對(duì)象的狀態(tài)(值)卻是可以改變的。(比如:自定義對(duì)象、數(shù)組、集合等等)
object TestVar {def main(args: Array[String]): Unit = {// p1 是 var 修飾的,p1 的屬性可以變,而且 p1 本身也可以變var p1 = new Person()p1.name = "dalang"p1 = null// p2 是 val 修飾的,那么 p2 本身就不可變(即 p2 的內(nèi)存地址不能變),
但是,p2 的屬性是可以變,因?yàn)閷傩圆]有用 val 修飾。val p2 = new Person()p2.name="jinlian"
// p2 = null // 錯(cuò)誤的,因?yàn)?p2 是 val 修飾的}
}
class Person{var name : String = "jinlian"
}
2.3 標(biāo)識(shí)符的命名規(guī)范
??Scala 對(duì)各種變量、方法、函數(shù)等命名時(shí)使用的字符序列稱為標(biāo)識(shí)符。即:凡是自己可以起名字的地方都叫標(biāo)識(shí)符。
1)命名規(guī)則
Scala 中的標(biāo)識(shí)符聲明,基本和 Java 是一致的,但是細(xì)節(jié)上會(huì)有所變化,有以下三種規(guī)則:
(1)以字母或者下劃線開頭,后接字母、數(shù)字、下劃線
(2)以操作符開頭,且只包含操作符(+ - * / # !等)
(3)用反引號(hào)....
包括的任意字符串,即使是 Scala 關(guān)鍵字(39 個(gè))也可以
? package, import, class, object, trait, extends, with, type, for
? 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
2)案例實(shí)操
需求:判斷 hello、Hello12、1hello、h-b、x h、h_4、ab、Int、、+-/#!、+-/#!1、if、
if
,這些名字是否合法。
object TestName {def main(args: Array[String]): Unit = {// (1)以字母或者下劃線開頭,后接字母、數(shù)字、下劃線var hello: String = "" // okvar Hello12: String = "" // okvar 1hello: String = "" // error 數(shù)字不能開頭var h-b: String = "" // error 不能用-var x h: String = "" // error 不能有空格var h_4: String = "" // okvar _ab: String = "" // okvar Int: String = "" // ok 因?yàn)樵?Scala 中 Int 是預(yù)定義的字符,
不是關(guān)鍵字,但不推薦var _: String = "hello" // ok 單獨(dú)一個(gè)下劃線不可以作為標(biāo)識(shí)符,
因?yàn)開被認(rèn)為是一個(gè)方法println(_)//(2)以操作符開頭,且只包含操作符(+ - * / # !等)var +*-/#! : String = "" // okvar +*-/#!1 : String = "" // error 以操作符開頭,必須都是操作符//(3)用反引號(hào)`....`包括的任意字符串,即使是 Scala 關(guān)鍵字(39 個(gè))
也可以var if : String = "" // error 不能用關(guān)鍵字var `if` : String = "" // ok 用反引號(hào)`....`包括的任意字符串,
包括關(guān)鍵字}
}
2.4 字符串輸出
1)基本語法
- (1)字符串,通過+號(hào)連接
- (2)printf 用法:字符串,通過%傳值。
- (3)字符串模板(插值字符串):通過$獲取變量值
2)案例實(shí)操
package com.atguigu.chapter02
object TestCharType {def main(args: Array[String]): Unit = {var name: String = "jinlian"var age: Int = 18//(1)字符串,通過+號(hào)連接println(name + " " + age)//(2)printf 用法字符串,通過%傳值。printf("name=%s age=%d\n", name, age)//(3)字符串,通過$引用
//多行字符串,在 Scala中,利用三個(gè)雙引號(hào)包圍多行字符串就可以實(shí)現(xiàn)。
//輸入的內(nèi)容,帶有空格、\t 之類,導(dǎo)致每一行的開始位置不能整潔對(duì)齊。
//應(yīng)用 scala 的 stripMargin 方法,在 scala 中 stripMargin 默認(rèn)
是“|”作為連接符,//在多行換行的行頭前面加一個(gè)“|”符號(hào)即可。val s ="""|select| name,| age|from user|where name="zhangsan"""".stripMargin
println(s)
//如果需要對(duì)變量進(jìn)行運(yùn)算,那么可以加${}val s1 =s"""|select| name,| age|from user|where name="$name" and age=${age+2}""".stripMarginprintln(s1)val s2 = s"name=$name"println(s2)}
}
2.5 鍵盤輸入
在編程中,需要接收用戶輸入的數(shù)據(jù),就可以使用鍵盤輸入語句來獲取。
1)基本語法
StdIn.readLine()、StdIn.readShort()、StdIn.readDouble()
2)案例實(shí)操
需求:可以從控制臺(tái)接收用戶信息,【姓名,年齡,薪水】。
import scala.io.StdIn
object TestInput {def main(args: Array[String]): Unit = {// 1 輸入姓名println("input name:")var name = StdIn.readLine()// 2 輸入年齡println("input age:")var age = StdIn.readShort()// 3 輸入薪水println("input sal:")var sal = StdIn.readDouble()// 4 打印println("name=" + name)println("age=" + age)println("sal=" + sal)}
}
2.6 數(shù)據(jù)類型(重點(diǎn))
回顧:Java數(shù)據(jù)類型
Java基本類型:char、byte、short、int、long、float、double、boolean
Java引用類型:(對(duì)象類型)由于Java有基本類型,而且基本類型不是真正意義的對(duì)象,即使后面產(chǎn)生了基本類型的包裝類,但是仍然存在基本數(shù)據(jù)類型,所以Java語言并不是真正意思的面向?qū)ο蟆?br />注意:Java中基本類型和引用類型沒有共同的祖先。
Java基本類型的包裝類:Character、Byte、Short、Integer、Long、Float、Double、Boolean
Scala數(shù)據(jù)類型
1)Scala中一切數(shù)據(jù)都是對(duì)象,都是Any的子類。
2)Scala中數(shù)據(jù)類型分為兩大類:數(shù)值類型(AnyVal)、引用類型(AnyRef),不管是值類型還是引用類型都是對(duì)象。
3)Scala數(shù)據(jù)類型仍然遵守,低精度的值類型向高精度值類型,自動(dòng)轉(zhuǎn)換(隱式轉(zhuǎn)換)
6)Null是一個(gè)類型,只 有一個(gè)對(duì) 象就 是null。它是所有引用類型(AnyRef)的子類。
7)Nothing,是所有數(shù)據(jù)類型的子類,主要用在一個(gè)函數(shù)沒有明確返回值時(shí)使用,因?yàn)檫@樣我們可以把拋出的返回值,返回給任何的變量或者函數(shù)。
4)Scala中的StringOps是對(duì)Java中的String增強(qiáng)
5)Unit:對(duì)應(yīng)Java中的void,用于方法返回值的位置,表示方法沒有返回值。Unit是 一個(gè)數(shù)據(jù)類型,只有一個(gè)對(duì)象就是()。Void不是數(shù)據(jù)類型,只是一個(gè)關(guān)鍵字
2.7 整數(shù)類型(Byte、Short、Int、Long)
??Scala 的整數(shù)類型就是用于存放整數(shù)值的,比如 12,30,3456 等等。
1)整型分類
2)案例實(shí)操
- (1)Scala 各整數(shù)類型有固定的表示范圍和字段長(zhǎng)度,不受具體操作的影響,以保證Scala 程序的可移植性
object TestDataType {def main(args: Array[String]): Unit = {// 正確var n1:Byte = 127var n2:Byte = -128// 錯(cuò)誤// var n3:Byte = 128// var n4:Byte = -129}
}
- (2)Scala 的整型,默認(rèn)為 Int 型,聲明 Long 型,須后加‘l’或‘L’
object TestDataType {def main(args: Array[String]): Unit = {var n5 = 10println(n5)var n6 = 9223372036854775807Lprintln(n6)}
}
- (3)Scala 程序中變量常聲明為 Int 型,除非不足以表示大數(shù),才使用 Long
2.8 浮點(diǎn)類型(Float、Double)
??Scala 的浮點(diǎn)類型可以表示一個(gè)小數(shù),比如 123.4f,7.8,0.12 等等。
1)浮點(diǎn)型分類
2)案例實(shí)操
??Scala 的浮點(diǎn)型常量默認(rèn)為 Double 型,聲明 Float 型常量,須后加‘f’或‘F’。
object TestDataType {def main(args: Array[String]): Unit = {// 建議,在開發(fā)中需要高精度小數(shù)時(shí),請(qǐng)選擇 Doublevar n7 = 2.2345678912fvar n8 = 2.2345678912println("n7=" + n7)println("n8=" + n8)}
}
//運(yùn)行的結(jié)果
n7=2.2345679
n8=2.2345678912
2.9 字符類型(Char)
1)基本說明
- 字符類型可以表示單個(gè)字符,字符類型是 Char。
2)案例實(shí)操
- (1)字符常量是用單引號(hào) ’ ’ 括起來的單個(gè)字符。
- (2)\t :一個(gè)制表位,實(shí)現(xiàn)對(duì)齊的功能
- (3)\n :換行符
- (4)\ :表示\
- (5)" :表示"
object TestCharType {def main(args: Array[String]): Unit = {//(1)字符常量是用單引號(hào) ' ' 括起來的單個(gè)字符。var c1: Char = 'a'println("c1=" + c1)
//注意:這里涉及自動(dòng)類型提升,其實(shí)編譯器可以自定判斷是否超出范圍,//不過 idea 提示報(bào)錯(cuò)
var c2:Char = 'a' + 1
println(c2)//(2)\t :一個(gè)制表位,實(shí)現(xiàn)對(duì)齊的功能println("姓名\t 年齡")//(3)\n :換行符println("西門慶\n 潘金蓮")//(4)\\ :表示\println("c:\\島國\\avi")//(5)\" :表示"println("同學(xué)們都說:\"大海哥最帥\"")}
}
2.10 布爾類型:Boolean
1)基本說明
- (1)布爾類型也叫 Boolean 類型,Booolean 類型數(shù)據(jù)只允許取值 true 和 false
- (2)boolean 類型占 1 個(gè)字節(jié)。
2)案例實(shí)操
object TestBooleanType {def main(args: Array[String]): Unit = {var isResult : Boolean = falsevar isResult2 : Boolean = true}
}
2.11 Unit 類型、Null 類型和 Nothing 類型(重點(diǎn))
1)基本說明
2)案例實(shí)操
(1)Unit 類型用來標(biāo)識(shí)過程,也就是沒有明確返回值的函數(shù)。由此可見,Unit 類似于 Java 里的 void。Unit 只有一個(gè)實(shí)例——( ),這個(gè)實(shí)例也沒有實(shí)質(zhì)
object TestSpecialType {def main(args: Array[String]): Unit = {def sayOk : Unit = {// unit 表示沒有返回值,即 void}println(sayOk)}
}
(2)Null 類只有一個(gè)實(shí)例對(duì)象,Null 類似于 Java 中的 null 引用。Null 可以賦值給任意引用類型(AnyRef),但是不能賦值給值類型(AnyVal)
object TestDataType {def main(args: Array[String]): Unit = {//null 可以賦值給任意引用類型(AnyRef),但是不能賦值給值類型
(AnyVal)var cat = new Cat();cat = null // 正確var n1: Int = null // 錯(cuò)誤println("n1:" + n1)}
}
class Cat {
}
(3)Nothing,可以作為沒有正常返回值的方法的返回類型,非常直觀的告訴你這個(gè)方法不會(huì)正常返回,而且由于 Nothing 是其他任意類型的子類,他還能跟要求返回值的方法兼容。
object TestSpecialType {def main(args: Array[String]): Unit = {def test() : Nothing={throw new Exception()}test}
}
2.12 類型轉(zhuǎn)換
擴(kuò)展 Java 面試題(隱式類型轉(zhuǎn)換)
2.12.1 數(shù)值類型自動(dòng)轉(zhuǎn)換
當(dāng) Scala 程序在進(jìn)行賦值或者運(yùn)算時(shí),精度小的類型自動(dòng)轉(zhuǎn)換為精度大的數(shù)值類型,這個(gè)就是自動(dòng)類型轉(zhuǎn)換(隱式轉(zhuǎn)換)。數(shù)據(jù)類型按精度(容量)大小排序?yàn)?#xff1a;
1)基本說明
- (1)自動(dòng)提升原則:有多種類型的數(shù)據(jù)混合運(yùn)算時(shí),系統(tǒng)首先自動(dòng)將所有數(shù)據(jù)轉(zhuǎn)換成精度大的那種數(shù)據(jù)類型,然后再進(jìn)行計(jì)算。
- (2)把精度大的數(shù)值類型賦值給精度小的數(shù)值類型時(shí),就會(huì)報(bào)錯(cuò),反之就會(huì)進(jìn)行自動(dòng)類型轉(zhuǎn)換。
- (3)(byte,short)和 char 之間不會(huì)相互自動(dòng)轉(zhuǎn)換。
- (4)byte,short,char 他們?nèi)呖梢杂?jì)算,在計(jì)算時(shí)首先轉(zhuǎn)換為 int 類型。
2)案例實(shí)操
object TestValueTransfer {def main(args: Array[String]): Unit = {//(1)自動(dòng)提升原則:有多種類型的數(shù)據(jù)混合運(yùn)算時(shí),系統(tǒng)首先自動(dòng)將所有
數(shù)據(jù)轉(zhuǎn)換成精度大的那種數(shù)值類型,然后再進(jìn)行計(jì)算。var n = 1 + 2.0println(n) // n 就是 Double//(2)把精度大的數(shù)值類型賦值給精度小的數(shù)值類型時(shí),就會(huì)報(bào)錯(cuò),反之就
會(huì)進(jìn)行自動(dòng)類型轉(zhuǎn)換。var n2 : Double= 1.0//var n3 : Int = n2 //錯(cuò)誤,原因不能把高精度的數(shù)據(jù)直接賦值和低
精度。//(3)(byte,short)和 char 之間不會(huì)相互自動(dòng)轉(zhuǎn)換。var n4 : Byte = 1//var c1 : Char = n4 //錯(cuò)誤var n5:Int = n4//(4)byte,short,char 他們?nèi)呖梢杂?jì)算,在計(jì)算時(shí)首先轉(zhuǎn)換為 int
類型。var n6 : Byte = 1var c2 : Char = 1// var n : Short = n6 + c2 //當(dāng) n6 + c2 結(jié)果類型就是 int// var n7 : Short = 10 + 90 //錯(cuò)誤}
}
注意:Scala 還提供了非常強(qiáng)大的隱式轉(zhuǎn)換機(jī)制(隱式函數(shù),隱式類等),我們放在高 級(jí)部分專門用一個(gè)章節(jié)來講解。
2.12.2 強(qiáng)制類型轉(zhuǎn)換
1)基本說明
自動(dòng)類型轉(zhuǎn)換的逆過程,將精度大的數(shù)值類型轉(zhuǎn)換為精度小的數(shù)值類型。使用時(shí)要加上強(qiáng)制轉(zhuǎn)函數(shù),但可能造成精度降低或溢出,格外要注意。
Java : int num = (int)2.5
Scala : var num : Int = 2.7.toInt
2)案例實(shí)操
- (1)將數(shù)據(jù)由高精度轉(zhuǎn)換為低精度,就需要使用到強(qiáng)制轉(zhuǎn)換
- (2)強(qiáng)轉(zhuǎn)符號(hào)只針對(duì)于最近的操作數(shù)有效,往往會(huì)使用小括號(hào)提升優(yōu)先級(jí)
object TestForceTransfer {def main(args: Array[String]): Unit = {//(1)將數(shù)據(jù)由高精度轉(zhuǎn)換為低精度,就需要使用到強(qiáng)制轉(zhuǎn)換var n1: Int = 2.5.toInt // 這個(gè)存在精度損失//(2)強(qiáng)轉(zhuǎn)符號(hào)只針對(duì)于最近的操作數(shù)有效,往往會(huì)使用小括號(hào)提升優(yōu)先級(jí)var r1: Int = 10 * 3.5.toInt + 6 * 1.5.toInt // 10 *3 + 6*1
= 36var r2: Int = (10 * 3.5 + 6 * 1.5).toInt // 44.0.toInt =
44println("r1=" + r1 + " r2=" + r2)}
}
2.12.3 數(shù)值類型和 String 類型間轉(zhuǎn)換
1)基本說明
在程序開發(fā)中,我們經(jīng)常需要將基本數(shù)值類型轉(zhuǎn)成 String 類型?;蛘邔?String 類型轉(zhuǎn)成基本數(shù)值類型。
2)案例實(shí)操
- (1)基本類型轉(zhuǎn) String 類型(語法:將基本類型的值+“” 即可)
- (2)String 類型轉(zhuǎn)基本數(shù)值類型(語法:s1.toInt、s1.toFloat、s1.toDouble、s1.toByte、s1.toLong、s1.toShort)
object TestStringTransfer {def main(args: Array[String]): Unit = {//(1)基本類型轉(zhuǎn) String 類型(語法:將基本類型的值+"" 即可)var str1 : String = true + ""var str2 : String = 4.5 + ""var str3 : String = 100 +""//(2)String 類型轉(zhuǎn)基本數(shù)值類型(語法:調(diào)用相關(guān) API)var s1 : String = "12"var n1 : Byte = s1.toBytevar n2 : Short = s1.toShortvar n3 : Int = s1.toIntvar n4 : Long = s1.toLong}
}
- (3)注意事項(xiàng)
在將 String 類型轉(zhuǎn)成基本數(shù)值類型時(shí),要確保 String 類型能夠轉(zhuǎn)成有效的數(shù)據(jù),比如我們可以把"123",轉(zhuǎn)成一個(gè)整數(shù),但是不能把"hello"轉(zhuǎn)成一個(gè)整數(shù)。var n5:Int = “12.6”.toInt 會(huì)出現(xiàn) NumberFormatException 異常。
擴(kuò)展面試題