变量和数据类型
注释
Scala 注释使用和 Java 完全一样。 注释是一个程序员必须要具有的良好编程习惯。将自己的思想通过注释先整理出来,再用代码去体现。
基本语法
(1)单行注释:// (2)多行注释:/* */ (3)文档注释:
/**
*
*/
代码规范
(1)使用一次 tab 操作,实现缩进,默认整体向右边移动,用 shift+tab 整体向左移 (2)或者使用 ctrl + alt + L 来进行格式化 (3)运算符两边习惯性各加一个空格。比如:2 + 4 * 5。 (4)一行最长不超过 80 个字符,超过的请使用换行展示,尽量保持格式优雅
变量和常量(重点)
常量:在程序执行的过程中,其值不会被改变的变量
回顾
Java 变量和常量语法 变量类型 变量名称 = 初始值 int a = 10 final 常量类型 常量名称 = 初始值 final int b = 20
基本语法
var 变量名 [: 变量类型] = 初始值 var i:Int = 10 val 常量名 [: 常量类型] = 初始值 val j:Int = 20 注意:能用常量的地方不用变量
案例实操
(1)声明变量时,类型可以省略,编译器自动推导,即类型推导 (2)类型确定后,就不能修改,说明 Scala 是强数据类型语言。 (3)变量声明时,必须要有初始值 (4)在声明/定义一个变量时,可以使用 var 或者 val 来修饰,var 修饰的变量可改变, val 修饰的变量不可改。
package chapter02
object TestVar {
def main(args:Array[String]): Unit = {
//(1)声明变量时,类型可以省略,编译器自动推导,即类型推导
var age = 18
age = 30
//(2)类型确定后,就不能修改,说明 Scala 是强数据类型语言。
//age = "tom"
//(3)变量声明时,必须要有初始值
//var name //错误
//(4)在声明/定义一个变量时,可以使用var或者val来修饰,var修饰的变量可改变,val修饰的变量不可改。
var num1 = 10 //可变
val num2 = 20 //不可变
num1 = 30 // 正确
//num2 = 40 //错误,因为 num2 是 val 修饰的
}
}
(5)var 修饰的对象引用可以改变,val 修饰的对象则不可改变,但对象的状态(值)却是可以改变的。(比如:自定义对象、数组、集合等等)
package chapter01
class Student(name:String,var age:Int) {
def printInfo():Unit = {
println(name + " " + age + " " + Student.school)
}
}
object Student{
val school: String = "atguigu"
def main(args: Array[String]): Unit = {
val alice = new Student("alice", 20)
val bob = new Student("bob", 23)
alice.printInfo()
bob.printInfo()
}
}
package chapter02
import chapter01.Student
object TestVar {
def main(args:Array[String]): Unit = {
var alice = new Student("alice", 20)
alice = null
val bob = new Student("bob", 23)
bob.age = 24
//bob = null //错误
bob.printInfo()
}
}
标识符的命名规范
Scala 对各种变量、方法、函数等命名时使用的字符序列称为标识符。即:凡是自己可 以起名字的地方都叫标识符。
命名规则
Scala 中的标识符声明,基本和 Java 是一致的,但是细节上会有所变化,有以下三种规则: (1)以字母或者下划线开头,后接字母、数字、下划线 (2)以操作符开头,且只包含操作符(+ - * / # !等) (3)用反引号....
包括的任意字符串,即使是 Scala 关键字(39 个)也可以
案例实操
package chapter02
object TestIdentifier {
def main(args: Array[String]): Unit = {
//(1)以字母或者下划线开头,后接字母、数字、下划线
val hello: String = ""
var Hello123 = ""
val _abc = 123
// val h-b = "" //错误
// val 123abc = 234 //错误
//(2)以操作符开头,且只包含操作符(+ - * / # !等)
val -+/% = "hello"
println(-+/%)
//(3)用反引号`....`包括的任意字符串,即使是Scala关键字(39个)也可以
val `if` = "if"
println(`if`)
}
}
字符串输出
基本语法
(1)字符串,通过+号连接 (2)printf 用法:字符串,通过%传值。 (3)字符串模板(插值字符串):通过$获取变量值
案例实操
package chapter02
object TestString {
def main(args: Array[String]): Unit = {
//(1)字符串,通过+号连接
val name: String = "alice"
val age: Int = 18
println(age + "岁的" + name + "在尚硅谷学习")
// *用于将一个字符串复制多次并拼接
println(name * 3)
//(2)printf用法:字符串,通过%传值。
printf("%d岁的%s在尚硅谷学习", age, name)
println()
//(3)字符串模板(插值字符串):通过$获取变量值
println(s"${age}岁的${name}在尚硅谷学习")
val num: Double = 2.3456
println(f"The num is ${num}%2.2f") // 格式化模板字符串
println(raw"The num is ${num}%2.2f")
// 三引号表示字符串,保持多行字符串的原格式输出
val sql = s"""
|select *
|from
| student
|where
| name = ${name}
|and
| age > ${age}
|""".stripMargin
println(sql)
}
}

键盘输入
基本语法
StdIn.readLine()、StdIn.readShort()、StdIn.readDouble()
案例实操
package chapter02
import scala.io.StdIn
object TestInput {
def main(args: Array[String]): Unit = {
println("请输入您的名字:")
var name = StdIn.readLine()
println("请输入您的年龄:")
val age: Int = StdIn.readInt()
println("请输入您的薪水:")
var sal = StdIn.readDouble()
println(s"${name},${age},${sal}")
}
}

从文件读取数据

hello world
hello scala
hello java!
package chapter02
import java.io.{File, PrintWriter}
import scala.io.Source
object TestFileIO {
def main(args: Array[String]): Unit = {
// 1. 从文件中读取数据
Source.fromFile("src/main/resources/test.txt").foreach(print)
// 2. 将数据写入文件
val writer = new PrintWriter(new File("src/main/resources/output.txt"))
writer.write("hello scala from java writer")
writer.close()
println("写入成功")
}
}

数据类型(重点)
Java数据类型
Java基本类型:char、byte、short、int、long、float、double、boolean Java引用类型:(对象类型) 由于Java有基本类型,而且基本类型不是真正意义的对象,即使后面产生了基本类型的包装类,但是仍然存在基本数据类型,所以Java语言并不是真正意思的面向对象。 Java基本类型的包装类:Character、Byte、Short、Integer、Long、Float、Double、Boolean 注意:Java中基本类型和引用类型没有共同的祖先。
Scala数据类型
1)Scala中一切数据都是对象,都是Any的子类。 2)Scala中数据类型分为两大类:数值类型(AnyVal)、 引用类型(AnyRef),不管是值类型还是引用类型都是对象。 3)Scala数据类型仍然遵守,低精度的值类型向高精 度值类型,自动转换(隐式转换)。 4)Scala中的StringOps是对Java中的String增强。 5)Unit:对应Java中的void,用于方法返回值的位置,表 示方法没有返回值。Unit是 一个数据类型,只有一个对象 就是()。Void不是数据类型,只是一个关键字。 6)Null是一个类型,只 有一个对 象就 是null。它是 所有引用类型(AnyRef)的子类。 7)Nothing,是所有数据类型的子类,主要用在一个函数没有明确返回值时使 用,因为这样我们可以把抛出的返回值,返回给任何的变量或者函数。
整数类型(Byte、Short、Int、Long)
整型分类
**数据类型 ** | 描述 |
---|---|
Byte [1] | 8 位有符号补码整数。数值区间为-128 到 127 |
Short [2] | 16 位有符号补码整数。数值区间为 -32768 到 32767 |
Int [4] | 32 位有符号补码整数。数值区间为 -2147483648 到 2147483647 |
Long [8] | 64 位有符号补码整数。数值区间为 -9223372036854775808 到 |
9223372036854775807 = 2 的(64-1)次方-1 |
案例实操
(1)Scala 各整数类型有固定的表示范围和字段长度,不受具体操作的影响,以保证 Scala 程序的可移植性。
package chapter02
object TestDataType {
def main(args: Array[String]): Unit = {
// 正确
var n1:Byte = 127
var n2:Byte = -128
// 错误
// var n3:Byte = 128
// var n4:Byte = -129
}
}
(2)Scala 的整型,默认为 Int 型,声明 Long 型,须后加‘l’或‘L’
package chapter02
object TestDataType {
def main(args: Array[String]): Unit = {
var n5 = 10
println(n5)
var n6 = 9223372036854775807L
println(n6)
}
}
(3)Scala 程序中变量常声明为 Int 型,除非不足以表示大数,才使用 Long
**浮点类型(Float、Double) **
浮点型分类
数据类型 | 描述 |
---|---|
Float [4] | 32 位 IEEE 754 标准的单精度浮点数 |
Double [8] | 64 位 IEEE 754 标准的双精度浮点数 |
案例实操
val f1: Float = 1.2345f
val d1 = 34.2245
println(d1.getClass)
默认Double类型
字符类型(Char)
基本说明
字符类型可以表示单个字符,字符类型是 Char。
案例实操
(1)字符常量是用单引号 ' ' 括起来的单个字符。 (2)\t :一个制表位,实现对齐的功能 (3)\n :换行符 (4)\ :表示\ (5)" :表示"
package chapter02
object TestCharType {
def main(args: Array[String]): Unit = {
var c1: Char = 'a'
println("c1=" + c1)
//注意:这里涉及自动类型提升,其实编译器可以自定判断是否超出范围,
//不过 idea 提示报错
var c2:Char = 'a' + 1
println(c2)
//字符类型底层保存ASCII码
}
}

布尔类型(Boolean)
基本说明
(1)布尔类型也叫 Boolean 类型,Booolean 类型数据只允许取值 true 和 false (2)boolean 类型占 1 个字节。
案例实操
val isTrue: Boolean = true
println(isTrue)
Unit 类型、Null 类型和 Nothing 类型(重点)
基本说明
数据类型 | 描述 |
---|---|
Unit | 表示无值,和其他语言中 void 等同。用作不返回任何结果的方法的结果 类型。Unit 只有一个实例值,写成()。 |
**Null ** | null , Null 类型只有一个实例值 null |
Nothing | Nothing 类型在 Scala 的类层级最低端;它是任何其他类型的子类型。 当一个函数,我们确定没有正常的返回值,可以用 Nothing 来指定返回类 型,这样有一个好处,就是我们可以把返回的值(异常)赋给其它的函数 或者变量(兼容性) |
案例实操
(1)Unit 类型用来标识过程,也就是没有明确返回值的函数。
def m1(): Unit = {
println("m1被调用执行")
}
val a: Unit = m1()
println("a: " + a) //()
(2)Null 类只有一个实例对象,Null 类似于 Java 中的 null 引用。Null 可以赋值给任 意引用类型(AnyRef),但是不能赋值给值类型(AnyVal)
var jack = new Student("jack",21);
jack = null // 正确
var n1: Int = null // 错误
println("n1:" + n1)
(3)Nothing,可以作为没有正常返回值的方法的返回类型,非常直观的告诉你这个方法不会正常返回,而且由于 Nothing 是其他任意类型的子类,他还能跟要求返回值的方法兼容。
def m2(n: Int): Int = {
if (n == 0)
throw new NullPointerException
else
return n
}
val b: Int = m2(2)
println("b: " + b) //b:2
类型转换
数值类型自动转换
当 Scala 程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数值类型,这 个就是自动类型转换(隐式转换)。数据类型按精度(容量)大小排序为:
基本说明
(1)自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成 精度大的那种数据类型,然后再进行计算。 (2)把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动 类型转换。 (3)(byte,short)和 char 之间不会相互自动转换。 (4)byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型。
案例实操
package chapter02
object TestValueTransfer {
// 1. 自动类型转换
// (1)自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。
val a1: Byte = 10
val b1: Long = 2353
val result1: Long = a1 + b1
val result11: Int = (a1 + b1.toInt) // 强转
// (2)把精度大的数值类型赋值给精度小的数值类型时,就会报错,反之就会进行自动类型转换。
val a2: Byte = 10
val b2: Int = a2
// val c2: Byte = b2 // error
// (3)(byte,short)和char之间不会相互自动转换。
val a3: Byte = 10
val b3: Char = 'b'
// val c3: Byte = b3 // error
val c3: Int = b3
println(c3)
// (4)byte,short,char他们三者可以计算,在计算时首先转换为int类型。
val a4: Byte = 12
val b4: Short = 25
val c4: Char = 'c'
val result4: Int = a4 + b4
val result44: Int = a4 + b4 + c4
println(result44)
}
强制类型转换
基本说明
自动类型转换的逆过程,将精度大的数值类型转换为精度小的数值类型。使用时要加上强制转函数,但可能造成精度降低或溢出,格外要注意。
案例实操
(1)将数据由高精度转换为低精度,就需要使用到强制转换 (2)强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级 (3)基本类型转 String 类型(语法:将基本类型的值+"" 即可) (4)String 类型转基本数值类型(语法:s1.toInt、s1.toFloat、s1.toDouble、s1.toByte、s1.toLong、s1.toShort)
// 2. 强制类型转换
// (1)将数据由高精度转换为低精度,就需要使用到强制转换
val n1: Int = -2.9.toInt
println("n1: " + n1) //取整数部分,直接省去小数点后的数字
// (2)强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
val n2: Int = 2.6.toInt + 3.7.toInt
val n3: Int = (2.6 + 3.7).toInt
println("n2: " + n2)
println("n3: " + n3)
// 3. 数值类型和String类型的转换
// (1) 数值转String
val n: Int = 27
val s: String = n + ""
println(s)
// (2) String转数值
val m: Int = "12".toInt
val f: Float = "12.3".toFloat
val f2: Int = "12.3".toDouble.toInt
println(f2)
在将 String 类型转成基本数值类型时,要确保 String 类型能够转成有效的数据,比如我 们可以把"123",转成一个整数,但是不能把"hello"转成一个整数。 var n5:Int = "12.6".toInt 会出现 NumberFormatException 异常。