Scala学习笔记-day02(1)(20-50-31)

值类型隐式转换

概念:
    当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)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容