变量
-
语法规则:
val/var 变量名 [:数据类型] = 初始值
-
示例:
object VariableDemo {
def main(args: Array[String]): Unit = {
//使用val定义的变量值是不可变的,相当于java里用final修饰的变量
val i = 1
//使用var定义的变量是可变得,在Scala中建议使用val
var s = "hello"
//变量名在前,类型在后
val str: String = "com/hc"
}
}
数据类型
Scala 与 Java 有着相同的数据类型,在 Scala 中数据类型都是对象。 Scala 数据类型分为两大类 AnyVal(值类型) 和 AnyRef(引用类型),不管是 AnyVal 还是 AnyRef 都是对象。 说明:
- Unit 类型比较特殊,这个类型只有一个实例( )
- Null 类型只有一个值null,它是所有AnyRef 的子类
- Nothing 类型是所有类的子类。在开发中通常可以将 Nothing 类型的值返回给任意变量或者函数,通常在抛出异常时使用。比如:
def sayHello: Nothing = {
throw new Exception("抛出异常")
}
示例:
object TypeDemo01 {
def main(args: Array[String]): Unit = {
var num1: Int = 10
//在 scala 中,如果一个方法没有形参则可以省略()
println(num1.toDouble + "\t" + num1.toString) //因为 Int 是一个类,因此它的实例就可以使用很多方法
fun()
fun
}
def fun(): Unit = {
println("say hi")
}
}
结果:
说明:
- Scala 各整数类型有固定的表数范围和字段长度,不受具体OS的影响,这可以保证Scala程序的可移植性。
- Scala 的整型常量/字面量默认为 Int 型,声明 Long型常量/字面量须后加’l’或’L’
- Scala 程序中变量常声明为 Int 型,除非不足以表示大数,才使用 Long。
示例:
def main(args: Array[String]): Unit = {
println("long 的最大值" + Long.MaxValue + "~" + Long.MinValue)
var i = 10 //i Int
var j = 10l //j Long
var e = 9223372036854775807L //9223372036854775807 超过 int
}
浮点类型
Scala 的浮点类型可以表示一个小数,比如 123.4f、7.8、0.12等。
数据类型说明Float32位IEEE 754标准的单精度浮点数Double64位IEEE 754标准的双精度浮点数说明:
- 与整数类型类似,Scala浮点类型有固定的表数范围和字段长度,不受具体OS的影响
- Scala 的浮点型常量默认为Double型,声明Float型常量须后加’f’或’F’
- 通常情况下,应该使用 Double 型,因为它比 Float 型更精确(小数点后大致7位)
浮点型常量有两种表示形式
- 十进制数形式:如:5.12 、512.0f、.512 (必须有小数点)
- 科学计数法形式:如:5.12e2 == 5.12×102、5.12E-2 == 5.12÷102
示例:
def main(args: Array[String]): Unit = {
var f1: Float = 1.1 //error
var f2 = 1.2
var f3: Double = 1.3
var f4: Double = 1.5f
}
字符类型:Char
字符类型可以表示单个字符,字符类型是Char,16位无符号 Unicode 字符(2个字节),区间值为U+0000到U+FFFF。
示例:
def main(args: Array[String]): Unit = {
var c1: Char = 'a'
var c3: Char = 98 + 1 //报错,因为运算就会有类型,Int=>char报错
var c2: Char = 99 //没有运算,编译器只判断范围有没有越界
println(c1 + " " + c2)
}
Unit 类型、Null 类型和 Nothing 类型
类型说明Unit表示无值,和Java语言中的void等同。用于不返回任何结果的方法的结果类型。Unit只有一个实例值()NullNull类型只有一个实例值null,这个实例也没有实质的意义NothingNothing类型是任何其它类型的子类型。当一个函数没有正常的返回值时,可以用Nothing来指定返回类型。这样做的好处是,我们可以把返回值(异常)赋给其它的函数或者变量。
说明:
- Unit 类型用来标识没有明确返回值的函数。Unit 类似于Java里的void。Unit 只有一个实例()。
- Null 类只有一个实例对象null,类似于 Java 中的 null。null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal: 比如 Int, Float, Char, Boolean, Long, Double, Byte, Short)
- Nothing可以作为没有正常返回值的方法的返回类型,标识方法不会正常返回。由于 Nothing 是其他任意类型的子类,它跟要求返回值的方法兼容。
示例:
object FunDemo {
def sayHello(): Unit = { // 定义一个方法
}
class Dog {
}
def main(args: Array[String]): Unit = {
val res = sayHello()
println("res=" + res)
val dog: Dog = null // null可以赋值给任意引用类型(AnyRef)
val c: Char = null //错误,null 不能赋值给值类型
}
}
数据类型转换
值类型转换
当 Scala 程序在进行赋值或者运算时,精度小的类型会自动转换为精度大的数据类型,这个就是自动类型转换(隐式转换 implicit conversion)。 自动类型转换细节说明:
- 表达式结果的类型会自动提升为操作数中最大的类型
- 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
- byte, short和 char之间不会相互自动转换。
- byte,short,char三者可以计算,在计算时首先转换为 Int 类型
示例:
def main(args: Array[String]): Unit = {
var n1 = 10
var n2 = 1.1f
//有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
var n3 = n1 + n2
//byte, short和 char 之间不会自动的转换类型
var n4: Byte = 10
var char1 : Char = n4 // 错误,因为 byte 不能自动转换 char
}
强制类型转换
强制类型转换为自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。强制类型转换可能造成精度降低或溢出,使用时需要加上强制转函数。 强制类型转换细节说明
- 当数据的从大到小赋值时,就需要使用到强制转换,注意有精度的损失
- 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
- Char 类型可以保存 Int 的常量值,但不能保存 Int 的变量值,需要强转
- Byte 和 Short 类型在进行运算时,当做 Int 类型处理 示例:
def main(args: Array[String]): Unit = {
val num1: Int = 10 * 3.5.toInt + 6 * 1.5.toInt // 36
val num2: Int = (10 * 3.5 + 6 * 1.5).toInt // 44
println(num1 + " " + num2)
val c1 : Char = 1
val num3 = 1
val c2 : Char = num3 //错
}
值类型和String类型之间的转换
将 String 类型转成基本数据类型时,要确保 String 类型能够转成有效的数据,比如可以把 “123” 转成一个整数,但是不能把 “hello” 转成一个整数。 示例:
def main(args: Array[String]): Unit = {
val str = 3.14+""
var str2:String = "14"
val num1 = str2.toInt
val num2 = str2.toByte
val num3 = str2.toLong
}