值类型隐式转换
概念:
当Scala程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这个就是自动类型转换(隐式转换)(按容量大小进行排序 byte,short(char),int,float,double,long
自动类型转换细节说明:
1. 由多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算
eg: 5.6+10 = > Double
2. 当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,就会报错,反之就会进行自动类型转换
3. (byte,short) 和 char 之间不会相互自动转换
eg:
val n1:Byte = 12
val n2:Char= n1 : Expression of type Byte doesn't conform to expected type Char
4. (byte,shor),char他们三者之间可以进行计算,在计算时首先转换为int类型,
5. 自动提升原则,表达式结果的类型自动提升为操作数中最大的类型
强制类型转换
介绍:
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型,使用是要加上强制转换函数,但可能造成精度降低或溢出,格外要注意
eg val num:Int = 1
val num1:Short = 1.toShort
强制类型转换细节说明:
1. 当进行数据的从 大 ---> 小 ,就需要使用到强制转换
2. 强制符号只针对于最近的操作数有效,往往会使用小括号提升优先级10 * 5.2.toInt = 10* (5) 而不是52.toInt 10 * (5.2.toInt)
3. Char 类型 可以保存Int的常量值,但不鞥能保存Int的变量值,需要强转
4. Byte 和 Short 类型在进行运算时,当做Int类型处理
值类型转换题:
1. var s:Shosrt = 5 //Ok
s = s-2 // error Int --> Short
2. var b:Byte = 3 // ok
b = b+4 // error
b += 4 // error 这点和java不一样,Scala 底层不会进行转换,Java会进行类型转换
b = (b + 4).toByte //Ok
3. var c:Char = 'a' //Ok
var i:Int = 5 //Ok
var d:Float = 314F //Ok
var result:DOuble = c+i+d //Ok
4. var b:Byte = 5
var s:Short = 3
var t:Short = s+b //Error
var t2 = s+b //Ok -- 使用了类型推导
值类型和String类型的转换
介绍:
在程序开发中,我们经常需要将基本数据类型转成String类型,或者将String类型转成基本数据类型
基本数据类型转String类型
语法:
将基本数据类型的值+"" 即可
var b:Byte = 3 // ok
var c:String = b +"
String 类型转成基本数据类型
语法:
通过基本类型的String的toXxx方法即可
前提:
在将String类型转成基本数据类型时,要确保String类型能够转成有效的数据,比如可以吧'123'转成123,eg:"23.2".toInt 就会报错,类型Flaat - >Int
注意事项:
1) 将String 类型转成基本数据类型时,要确保Strign类型能够转成有效的数据,
2 思考"12.5" 能不能转换成Int?
// 在Scala 中 ,不是讲小数点后的数据进行截取,而是会抛出异常
var r:String = "12.5"
val n1:Int = r.toInt
java.lang.NumberFormatException: For input string: "6.5"
标识符的命名规范
标识符概念
1. Scala 对各种变量,方法,函数等命名时使用的字符序列称为标识符
2. 凡是自己可以起名字的地方都叫标识符
标识符的命名规则
Scala 中的标识符声明,基本和Java是一致的,但是细节上会有所变化
1. 首字符为字母,后续字符任意字母和数字,美元符号,可后接下划线_
2. 数字不可以开头
3. 首字符为操作符(比如+-*/),后续字符也需要跟操作符,至少一个(反编译)
// 首字符为操作符比如(-+*/)
val ++ = "hello scala" // ok --> 反编译: &plus&plus
val + q = "abc" // error
4. 操作符(比如+-*/) 不能在标识符中间和最后
5. 用反引`` 扩起来的任意字符串,即使是关键字(39) 也是[True]
val `true` = 1
println(`true`)
习题:
hello // ok
hello12 //ok
1hello // error
h-b // errot
x h // error
h_4 // ok
_ab //ok
Int //ok 在Scala中,Int不是关键字,而是预定义标识符,可以用,但是不推荐使用
Float //
_ // 不可以,因为在Scala 中,_ 由很多其他的作用,因此不能使用
var _ = "hack"
print(_)// ok 可以编译运行, I don't know why
println(_) // error 可以编译,不能运行
Abc // ok
_*_ // ok
-q // error
标识符的命名规范
1. 包名:尽量采取有意义的包名,简短,由意义
2. 变量名,函数名,方法名 采用驼峰法
Scala关键字
运算符:
1. 算术运算符(+-*/% ) (10.0 /3).formatted("%.2f")3.33
% 的运算的原则 : a%b = a- a/b*b
-10 % -3 = -10 - (-10 / 3 ) *3 -1
2. 赋值运算符
3. 比较运算符(关系运算符)
4. 逻辑运算符
5. 位运算符
Scala中没有 ++ 和 --,而使用 += 1 和 -= 1
var num = 1
num++ // error
num += 1// ok
解题思路
1. 搞清楚需求(读题)
2. 思路分析
3. 代码实现
关系运算符
1. 关系运算符的结果都是boolean型,也就是要么是True,要么是False
2. 关系表达式 经常用在if结构的条件中或循环结构的条件中
3. 关系运算符的使用和java一样表达式 a>b
4. 使用陷阱: 如果两个浮点数进行比较,应当保证数据类型一致
逻辑运算符:
介绍:
连接多个条件(一般来讲是关系表达式),最终的结果也是一个Boolean值)
Scala中支持代码块返回一个值
面试题
有两个变量,a和b,要求将其进行交换,但是不允许使用中间变量,最终打印结果:
var a = 10
var b = 8
a^=b
b^=a
a^=b
print(a,b)
a += b
b = a - b
a -= b
print(a,b)