Scala变量类型及类型转换
Scala中的变量类型:
1、Scala中有⼀个根类Any,它是所有类的⽗类
2、Scala中⼀切皆对象,分为AnyVal (值类型)和 AnyRef(引⽤类型)都是Any的⼦类
3、Null是Scala的特别类型 只有⼀个值 null ,他是所有引⽤类型(AnyRef及其⼦类)的的⼦类。
4、Nothing 类型是所有类型的⼦类(包括Null) ,在开发中通常将Nothing类型的值返回给任意变量或者函数
5、Scala中仍然遵守,低精度的值向⾼精度的值⾃动转换(隐式转换),如下代码
var num =1.2;//默认为double
var num2=1.7f;//float
num=num2;//⾃动转换
num2=num//报错,应该改为 Float
Scala 数据类型清单如下:
各个类型之间的继承关系及隐式转换关系如下图:
整型类型:
包括Int Short Byte Long
1、Scala各整数类型有固定的范围和字段长度,不收OS的影响,保证Scala程序的可移植性
2、整数默认为Int 类型,声明Long类型需要在后边加L 或l
浮点类型:
包括 Float 和Double ⽤来表⽰⼩数 如 1.2
1、与整型类似,浮点型也有固定的⽅位和长度,不受OS影响
2、Scala中浮点型默认为Double 如果要声明 Float 需要在后边加 F或f 如: var num:Float = 1.3f;
3、Double 类型精度⽐Float ⾼,Float类型⼀般到⼩数点后7位就会出现精度不准确。通常情况下应该使⽤double类型测试代码:
//测试变量类型
def testVarType():Unit ={
var age:Int = 10
var sal:Double = 10.1
var name:String = "tom"
var isPass:Boolean =false
//Scala 中⼩数默认是 double ,整数默认是Int
var score:Float = 10.1f //⼩数赋值给 Float必须加f
print(s"${age} ${name}")
/*
1、变量类型可以省略,编译器会⾃动推导
2、类型确定后就不能更改,Scala是强类型的语⾔
3、⽤var 声明的变量是可变的,⽤val声明的变量是不可变得但是对象的值是可变的相当于java中final 变量
为什么会有这样的设计:
1)在实际编程中⼤部分时候创建⼀个对象是为了读取和改写他的属性,但是引⽤不会变
如:Person p= new Person(); p.age=19,p.name="tom";⼀般不会 p= new Person();
这个时候使⽤val
2)因为val没有线程安全问题,效率较⾼,推荐使⽤val
3)如果对象需要改变则需要使⽤var
4、Scala 中变量的声明需要初始值不像java 中有默认值
*/
var per:Person = new Person();
per.age=10;
per.name="tom"
per=new Person();
val per2:Person = new Person();
per2.name="tom2"
per2.age=12
//per2=new Person(); //因为per2使⽤val声明,重新赋值会报错
//+号当两边都是数值类型则做算数运算,如果有⼀⽅是字符串则做拼接运算
println("1+11->"+(1+11))
}
字符类型Char:
字符类型可以表⽰单个字符,16位(两个字节)⽆符号Unicode字符 区间值位 U+0000 U+FFFF
1、声明使⽤ ‘’ ru var c1=‘a’
2、可以使⽤转义字符 来代表特殊字符型常量 如 var c3=‘\n’
3、可以直接将整数赋值给Char类型变量,输出时按照该值对应的unicode字符输出
4、Char 类型可以进⾏运算,预算时相当于⼀个整数
⽰例如下:
def testVarType2():Unit ={
//可以将范围内的整形值直接赋值给 Char类型
var ch1:Char=97;
//输出char类型时会输出该数字对应的unicode字符
println("ch1->"+ch1)//a
var char2:Char = 'a'
//Char 变量可以当做数字进⾏运算
var num= char2+10;
println("num="+num);//num=107
//下边三个赋值语句为什么前两句报错后⼀句正确?
//因为当吧计算结果赋值给你⼀个变量编译器会判断类型及取值范围,⽽直接将⼀个字⾯量如98 ,赋值给⼀个变量,编译器值判断取值范围。
// var c2:Char = 'a'+1 //该语句报错
//var c3:Char = 97+1 //该语句也报错
var c4:Char= 98 //语句不报错
}
布尔类型 Boolean
Boolean 占⼀个字节,只允许取值 true 或false 主要⽤于逻辑运算
Unit 类型 Null类型 Nothing类型
1、Null类型只有⼀个取值 null ,类似于java 中的null 引⽤。null可以赋值给任意引⽤类型 (AnyRef),但是不能赋值给 AnyVal类型
2、Unit ⽤来标识没有明确返回值的函数,相当于java中的void,Unit只有⼀个实例:(),这个实例也没有任何实质意义
3、Nothing可以作为没有正常返回值的⽅法的返回类型,⾮常直观的告诉你这个⽅法不会正常返回,⽽且由于Nothing是其他任意类型的⼦类,还能跟要求返回值的⽅法兼容。
⽰例代码:
def testVarType3():Unit ={
val res = hello()
//打印Unit 显⽰()
println("res="+res)
//Null 类型的值 null 可以赋值给任意 AnyRef类型但是不能赋值给AnyVal类型
var dog:Dog = null;
var num:Int = null;//运⾏时会报错 type mismatch
/*
Error:(66, 19) type mismatch;
found : Null(null)
required: Int
var num:Int = null;//运⾏会报错
*/
}
//Unit 等价于java 中的void
def hello():Unit={
}
class Dog{}
值类型隐式转换:
1、多种类型数据混合运算时,系统⾸先将所有数据转换成容量最⼤的那种数据类型,然后进⾏运算 1.5+10 结果为double 类型
2、当我们把精度达的数据类型赋值给精度⼩的类型时就会报错
3、byte short 和char 不会⾃动转换浮点型变量float
4、byte short char 在计算时会转换成 Int类型
5、⾃动提升原则:表达式结果类型⾃动提升为操作数中精度/范围最⼤的类型
def testVarType4():Unit ={
var n1=10;
var n2=1.1f;
var n3=n1+n2//结果类型为Float
var n4:Byte=10;
// var n5:Char = n4 //报错因为不会⾃动进⾏类型转换
}
强制类型转换
1、⾃动类型转换的逆过程 将容量⼤的数据类型转换为容量⼩的数据要使⽤强制转换
var num:Int = Int 和java 中不同 int num = (int)2.5 因为Scala中都是对象
2、Char 类型可以保存 Int常量值但是不能保存Int变量值
var char1:Char =1;//正确
var num:Int =1;
char1=num;//错误这个时候必须使⽤强制类型转换 char1 = Char;
3、Byte 和Short 在运算时当做Int 处理
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论