scala安装使用教程_一篇搞定!-CSDN博客
1.7 Scala数据类型
# Any是所有类型的父类
它定义了一些通用的方法如equals、hashCode和toString。Any有两个直接子类:AnyVal和AnyRef。
# AnyVal是所有值类型的父类
有9个预定义的非空的值类型分别是:Double、Float、Long、Int、Short、Byte、Char、Unit和Boolean。Unit是不带任何意义的值类型,它仅有一个实例可以像这样声明:()。所有的函数必须有返回,所以说有时候Unit也是有用的返回类型。
# AnyRef是所有引用类型的父类
AnyRef代表引用类型。所有非值类型都被定义为引用类型。在Scala中,每个用户自定义的类型都是AnyRef的子类型。如果Scala被应用在Java的运行环境中,AnyRef相当于java.lang.Object。
# Nothing是所有类型的子类
Nothing是所有类型的子类,也是Null的子类,他没有一个具体的实例对象,常见的应用如:抛出异常、程序exit,无限循环等,返回值为Nothing类型。
Nothing没有对象,但是可以用来定义类型。例如,如果一个方法抛出异常,则异常的返回值类型就是Nothing(虽然不会返回) 。
def get(index:Int):Int = {
if(x < 0) throw new Exception(...) //返回值类型Nothing
else ....
}
# Null是所有引用类型的子类
Null只有一个实例对象null,主要用来和其他的JVM语言进行互操作,但是几乎不应该在Scala代码中使用。
Scala 与 Java有着相同的数据类型:
数据类型 | 描述 |
---|---|
Byte | 8位有符号补码整数。数值区间为 -128 到 127 |
Short | 16位有符号补码整数。数值区间为 -32768 到 32767 |
Int | 32位有符号补码整数。数值区间为 -2147483648 到 2147483647 |
Long | 64位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 |
Float | 32 位, IEEE 754标准的单精度浮点数 |
Double | 64 位 IEEE 754标准的双精度浮点数 |
Char | 16位无符号Unicode字符, 区间值为 U+0000 到 U+FFFF |
String | 字符序列 |
Boolean | true或false |
Unit | 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。 |
Null | null |
Nothing | Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。 |
Any | Any是所有其他类的超类 |
AnyRef | AnyRef类是Scala里所有引用类(reference class)的基类 |
Scala数据类型的位数,不受具体OS的影响,以保证Scala程序的可移植性。
1.7.1 值类型AnyVal
Scala和Java一样,有8种数值类型Byte、Char、Short、Int、Long、Float、Double和一个Boolean类型,和Java不同的是 ,Scala没有基本类型与包装类型之分,这些类型都是类,有自己的属性和方法。
bash
// 相当于Java的包装类;
1.toString()
1.to(10)
1.7.1.1 整型
Byte
// 直接使用整数赋值时,会被判断为Int类型,需要定义时指定类型
var b: Byte = 2 //b为变量,2为字面量
Short
// 直接使用整数赋值时,会被判断为Int类型,需要定义时指定类型
var s: Short = -3
// 低精度可直接隐式转换为高精度
s = b // Byte->Short
Int
// 可以直接使用数字赋值
var i = 5
// 低精度可直接隐式转换为高精度
i = b // Byte->Int
i = s // Short->Int
Long
// 直接使用小数赋值时,会被判断为Int,需要在小数后添加字母L
var l = 200L
var l1: Long = 200L
// 低精度可直接隐式转换为高精度
l = b // Byte->Long
l = s // Short->Long
l = i // Int->Long
1.7.1.2 Unit
// Unit为空类型,相当于void,使用()进行初始化
var u = ()
1.7.1.3 Boolean
// 定义Boolean类型,只能为true或者false
var b1 = false
var b2: Boolean = true
1.7.2 类型转换
1.7.2.1 自动类型转换
值类型可以按照下面的方向进行转换:
val x: Long = 987654321
val y: Float = x // 9.8765434E8 (note that some precision is lost in this case)
当Double转为Int时,错误如下:
scala> val i:Int=10d
<console>:11: error: type mismatch;
found : Double(10.0)
required: Int
val i:Int=10d
1.7.2.2 强制类型转换
Java中的强制类型转换:
int a = (int) 100.00;
scala中处理:
cpp
//toByte toChar toDouble toFloat toInt toLong
//toShort toString
scala> val a = 19.9
a: Double = 19.9
scala> val b = a.toInt
b: Int = 19
scala> val c=a.asInstanceOf[Int] //类似Java中的强制类型转换:(int)a
c: Int = 19
Scala与Java类型检查和转换对比
Scala | Java |
---|---|
obj.isInstanceOf[C] | obj instanceof C |
obj.asInstanceOf[C] | (C)obj |
classOf[C] | C.class |
1.7.2.3 数值类型和字符串类型的转换
数值类型转字符串类型
val s1 = true+""
val s2 = 3.1415+""
val s3 = 100 +""
字符串类型转数值类型
val s4 = "3.14"
s4.toDouble
小结:
低位数可以向高位数数转换。如Byte->Short
字符可以转整形或浮点型,不同长度字符应使用不同位数的整型
整型可以转浮点型,允许精度丢失。如Long->Float
代码
Scala
package com.qianfeng.scala
/**
* 变量必须赋值或者是使用占位符初始化
* val 变量名称[:类型] = 值 : 不可变 ,相当于java的final修饰
* var 变量名称[:类型] = 值 : 可变
* lazy val 变量名称[:类型] = 值 懒加载,必须使用val
*
* 注意:
* 1、官方推荐我们使用val
* 2、类型自动推断
*/
object Demo02_Variable {
def main(args: Array[String]): Unit = {
val a = 100
val b:String = "abc"
println(a)
//修改a的值
//a = 200 //报错:不能改变值
var c = 100
println(c)
c = 200
println(c)
lazy val d = 1000
println(d)
//lazy var dd = 1000 //报错:lazy只能修饰val变量
//多变量
val (aa,cc,dd) = (1,2,"hello")
println(aa,dd)
val i1,i2 = 10
println(i1,i2)
//类型定义
val i3 = 200L //定义Long类型
var u = () //定义unit类型
println(i3,u)
//转换
//val i4:Int = i3 //不能直接转
val i4:Int = i3.toInt
val i5:Double = 3.14F
//val i6:Int = 3.14D //不能直接转
println(i4,i5)
//val b2Int = b.toInt //
val i7 = "12"
val i8 = i7.toInt //字符串转int
val i9 = i8+"" //int转字符串
println(i9.isInstanceOf[String])
println(i8.isInstanceOf[Int])
}
}