Scala系列一:变量和数据类型
一、变量和常量
常量:在程序执行过程中,值不会被改变的变量。
1.Java变量和常量语法
- 变量类型 变量名称 = 初始值
- final 常量类型 常量名称 = 初始值
2.基本语法
-
var 变量名 [:变量类型] = 初始值 var i:Int = 10
-
val 常量名 [:常量类型] = 初始值. val j:Int = 20
-
声明变量时,类型可以省略,编译器自动推导,即类型推导
-
类型确定后,就不能修改,说明scala是强数据类型语言
-
变量声明时,必须要有初始值
-
在声明/定义一个变量时,可以使用var或者val来修饰,var修饰的变量可以改变,val修饰的变量不可改。
二、标识符的命名规范
Scala对各种变量、方法、函数等命名时使用的字符序列称为标识符。
命名规则:
-
Scala中的标识符声明,基本和Java是一致的,但是细节上会有所变化,有以下三种规则:
-
以字母或者下划线开头,后接字母、数字、下划线
-
以操作符开头,且只包含操作符(±*/#!等)
-
用反引号
....
包括的任意字符串,即使是Scala关键字(39个)也可以
Scala关键字:
- package,import,class,object,trait,extends,with,type,for
- private,protected,abstract,scaled,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
三、字符串
- 字符串,通过+号连接
- printf用法:字符串,通过%传值
- 字符串模版(插值字符串):通过$获取变量值
- 三引号表示字符串,保持多行字符串的原格式输出
printf("%d岁的%s喜欢打球",age,name)
println(s"${age}岁的${name}"喜欢打球")
println(f"The num is ${num}%2.2f")
val sql = s"""
|select *
|from
|student
|where
|name = ${name}
|and
| age > ${age}
|""".stripMargin
四、读写文件
import scala.io.Source
import java.io.{File,PrintWriter}
object Test_FileIo{
def main(args: Array[String]): Unit = {
//从文件中读取数据
Source.fromFile("src/main/resources/test.txt").foreach(print)
//将数据写入文件
val writer = new PrintWriter(new File("src/main/resources/output.txt"))
writer.write("hello java scala")
writer.close()
}
}
五、Java数据类型
Java基本类型:
- char、byte、short、int、long、float、double、boolean
Java引用类型:对象类型
Java基本类型的包装类:
- Character、Byte、Short、Integer、Long、Float、Double、Boolean
六、Scala数据类型
- Scala中一切数据都是对象,都是Any的子类
- Scala中数据类型分为两大类:数值类型(AnyVal)、引用类型(AnyRef),不管是值类型还是引用类型都是对象
- Scala数据类型仍然遵守,低精度的值类型向高精度值类型自动转换(隐式转换)
- Scala中的StringOps是对Java中的String增强
- Unit:对应Java中的void,用于返回值的位置,表示方法没有返回值。Unit是一个数据类型,只有一个对象就是0。Void不是数据类型,只是一个关键字。
- Null是一个类型,只有一个对象就是null。它是所有引用类型(AnyRef)的子类。
- Nothing:所有数据类型的子类,主要用在一个函数没有明确返回值时使用,因为这样可以把抛出的返回值,返回给任何的变量或者函数。
七、整数类型
- Byte、Short、Int、Long
- Scala的整数类型就是用于存放整数值的,比如12、30等
整型分类
数据类型 | 描述 |
---|---|
Byte[1] | 8位有符号补码整数,数值区间为-128到127 |
Short[2] | 16位有符号补码整数。数值区间为-32768到32767 |
Int[4] | 32位有符号补码整数。数值区间为-2147483648到2147483647 |
Long[8] | 64位有符号补码整数。数值区间为-9223372036854775808到9223372036854775807=2的(64-1)次方-1 |
val a1 = 127
val a4 = 123456567554L
val b1: Byte = 10
val b3: Byte = (b1 + 20).toByte
八、字符类型
val c1: Char = 'a'
//特殊字符
val c3: Char = '\t'
//转义字符
val c5 = '\\' //表示\自身
val c6 = '\"'. //表示"
//字符变量底层保存ASCII码
val i1: Int = c1
println("i1: " + i1)
val i2: Int = c2
println("i2: " + i2)
val c7: Char = (i1 + 1).toChar
println(c7)
//布尔类型
val isTrue: Boolean = true
println(isTrue)
九、Unit类型、Null类型和Nothing类型
数据类型 | 描述 |
---|---|
Unit | 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成0。 |
Null | null,Null类型只有一个实例值null |
Nothing | Nothing类型在Scala的类层级最低端。它是任何其他类型的子类型。当一个函数,确定没有正常的返回值,可以用Nothing来指定返回类型,这样的好处是把返回的值赋给其他的函数或者变量 |
//空值Unit
def m1(): Unit = {
println("m1被调用执行")
}
val a: Unit = m1()
println("a: " + a)
//空引用Null
var student: Student = new Student("fy",20)
student = null
println(student)
//Nothing
def m2(n: Int): Int = {
if(n == 0)
throw new NullPointerException
else
return n
}
val b = m2(0)
println(b)
十、类型转换
-
当Scala程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数值类型。这个就是自动类型转换(隐式转换)。
-
数据类型按精度(容量)大小排序为:
-
Byte
-
Short Char
-
int
-
Long
-
Float
-
Double
-
自动提升原则:有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度大的那种数据类型,然后再进行计算。
-
把精度大的数值类型赋值给精度小的数值类型时,就会报错。反之就会进行自动类型转换。
-
byte、short和char之间不会相互自动转换
-
byte、short、char三者可以计算,在计算时首先转换为int类型。
val a1: Byte = 10
val b1: Long = 2355
val result1: Long = a1 + b1
val result2: Int = (a1 + b1.toInt) //强转
//byte、short、char三者之间可以计算,首先转为int类型
val a4: Byte = 12
val b4: Short = 25
val c4: Char = 'c'
val result: Int = a4 + b4 + c4
println(result)
十一、强制类型转换
- 自动类型转换的逆过程,将精度大的数值类型转换为精度小的数值类型,使用时要加上强制转换函数,但可能造成精度降低或溢出,要格外注意。
- Java: int num = (int)2.5
- Scala:var num: Int = 2.7.toInt
//数值转String
val n: Int = 27
val s: String = n + ""
println(s)
//String转数值
val m: Int = "12".toInt
val f: Float = "12.3".toFloat
val f2: Int = "12.3".toDouble.toInt