开发者学堂课程【Scala 核心编程-基础:Null Nothing Unit】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8895
Null Nothing Unit
目录
一、字符类型本质探讨
1、字符型 存储到计算机中,需要将字符对应的码值(整数)找出来
存储: 字符 --> 码值 --> 二进制 --> 存储
读取: 二进制 --> 码值 --> 字符 --> 读取
2、字符和码值的对应关系是通过字符编码表决定的(是规定好),这一点和 Java 一样。
var c3:Char = '国'
println("c3=" + c3 +“c3对应的码值=”+ c3.toInt)
二、布尔类型: Boolean
1、基本介绍
(1) 布尔类型也叫 Boolean 类型,Booolean 类型数据只允许取值 true 和 false
注意:在 scala 里布尔类型只允许取真和假。在有些编程语言里,还可以用零和非零来表示真或是假,但scala里只能是真或假。
(2) boolean 类型占1个字节。
布尔类型,只能是真和假,没有别的类型数据。不要用别的类型来替代布尔类型。
(3) boolean 类型适于逻辑运算,一般用于程序流程控制:
① if 条 件控制语句
② while 循环控制语句
③ do-while 循环控制语句
④ for 循环控制语句
boolean 类型主要用在 if 语句判断,while、do-while、for 循环控制语句中。
三、Unit 类型、Null 类型和 Nothing 类型
1、基本说明
在 Scala 里有 Unit、Null 和 Nothing 三个比较特别的类型。
Unit |
表示无值,和其他语言中 void 等同。用作不返回任何结果的方法的结果类型。Unit 只有一个实例值,写成()。 |
Null |
null, Null 类型只有一个实例值 null |
Nothing |
Nothing 类型在 Scala 的类层级的最低端;它是任何其他类型的子类型。 当一个函数确定没有正常的返回值,可以用 Nothing来指定返回类型,这样有一个好处,就是可以把返回的值(异常)赋给其它的函数或者变量(兼容性) |
(1)Unit 实例
Unit 代表 void 是非空。举例:
新建 Create New Scala Class,Name为UnitNulINothingDeme,
Kind为Object。打开编辑:
package com.atguigu.chapter02.datatype
object UnitNullNothingDemo {
def main(args: Array[String]): Unit = {
val res = sayHello()
println("res=" + res)
}
//Unit 等价 java 的 void,只有一个实例值()
def sayHello(): Unit = {
}
}
有一个函数叫做 sayHello,需要返回 Unit,unit 就代表 void,只有一个实例就是()。小括号代表 Unit。计算结果
val res = sayHello()
println("res=" + res)
运行结果:
res=()
看到res返回的是一对小括号,代表 unit。
(2)Null 实例
继续打开 UnitNullNothingDemo.scala 编辑
① 有一个类 class 叫 Dog,Dog 类型赋值为空,Null,程序没有报错。这里的 Dog 类属于 Anyref 的类。但不能这样给值。
再有一个 Char 类型1,给赋值为空,Null,看到程序也没有报错。
输入 println 结果。先注销 val char1: Char = null,运行。
……
def sayHello(): Unit = {
}
//Null 类只有一个实例对象,null, 类似于 Java 中的 null 引用。null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型
val dog: Dog = nu11
//val char1: Char = null
println("ok~~~")
}
class Dog {
}
这里也能正常运行。执行结果为:
OK~~~
res=()
看到结果能正常输出。
② 把这段代码放到主函数里面去,使程序看起来更加清晰。
……
val res = sayHello()
println("res=" + res)
//Null 类只有一个实例对象,null, 类似于 Java 中的 null 引用。null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型
val dog: Dog = nu11
//val char1: Char = null
println("ok~~~")
}
//Unit 等价 java 的 void,只有一个实例值()
def sayHello(): Unit = {
}
}
看输出顺序,运行结果为:
res=()
OK~~~
应该是先输出 res,再输出 OK~~~。
③ 再把//val char1: Char = null 打开,看到null下有一个下划线,下划线代表有隐式转换在里面。
再执行,看结果:
Error:(11, 23) an expression of type Null is ineligible for implicit conversion
val charl: Char = null
Err:(11, 23) type mismatch;
found : Null(nul)
required: Char
val charl: Char = null
看到报错。虽然在写程序的时候没有报错,但出现下划线就说明:隐式转换过不去。不能把一个空 null 隐式转换为Char。
编程中,看到值有下划线,就代表有转化的过程。如:不能把空转换为 Char,但可以把空给 Anyref 引用。
2、使用细节和注意事项
(1) Null 类只有一个实例对象,null, 类似于 Java 中的 null 引用。null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型(AnyVal:比如 Int, Float,Char,Boolean,Long,Double,Byte, Short)
(2) Unit 类型用来标识过程,也就是没有明确返回值的函数。由此可见,Unit 类似于 Java 里的 void。Unit 只有一个实例,(), 这个实例也没有实质的意义
def sayok(): Unit = { //println("sayok 被调用")
}
(3) Nothing, 可以作为没有正常返回值的方法的返回类型,非常直观的告诉这个方法不会正常返回,而且由于Nothing 是其他任意类型的子类,他还能跟要求返回值的方法兼容。
Def test():Nothing ={
throw new exception()
}
//没有正常返回值
是 sccla 底层最低端的类,它主要用来抛异常,而且可以用来做兼容性。
四、作业
1、在 Scala REPL 中,计算3的平方根,然后再对该值求平方。现在,这个结果与3相差多少?
提示: scala.math 找相应的方法
在 Scala 的 REPL 中,REPL 指的是交互指令的环境。
在计算机的开始菜单的搜索程序和文件中搜索 scala,打开 scala.bat,看到对话框
这就是 REPL 的运行环境。REPL 是(read->evaluateion->print->loop)的简称。
在 REPL 环境里计算3的平方根,然后再对这个值求平方,把值算出来之后再把相差结果算出来。
举例:求两个数的和。
先定义 num1等于10,回车,看到 num1: Int = 10,就意味着 num1已经被保存起来。这只是一句话。
原来写一个代码是形成一个整体。但这里是分开写的。
再定义 num2等于30。回车。现在有两个变量,num1和 num2。保存在缓存里。接着用 res=num1+num2,回车对比。
scala> val num1 = 10
num1: Int = 10
scala> val num2 = 30
num2: Int = 30
scala> val res = num1 + nun2
res: Int = 40
scala>
看到回车后结果是10+30=40
这就是在 REPL 中的基本使用。
作业1提示:在 scala.math 这个包下面有一个方法,想一想怎么去使用它。
2、Scala 语言的 sdk 是什么?
3、Scala 环境变量配置及其作用。
4、Scala 程序的编写、编译、运行步骤是什么?能否一步执行?
5、Scala 程序编写的规则。
6、简述:在配置环境、编译、运行各个步骤中常见的错误
7、如何检测一个变量是 val 还是 var?
8、Scala 允许你用数字去乘-个字符串,去 REPL 中试一下"crazy"*3。 这个操作做什么?在 Scaladoc 中如何找到这个操作?
去查手册,找一个字符串乘以三会得到什么结果?然后找到它的出处。
9、10 max2的含义是什么? max 方法定义在哪个类中?
10、用 BigInt计算2的1024次方
提示:在 BigInt 找相应的方法
11、在 Scala 中如何获取字符串“Hello”的首字符和尾字符?
提示:在 String 中找相应的方法