一 ,变量 :
1 ,变量赋值 : var ,val
- 代码 :
object Aa2 {
def main(args: Array[String]): Unit = {
var a:Int = 1;
val b:String="a"
println(1+""+b)
}
}
- 区别 : var 和 val
var 变量可变
val 变量不可变 - 为什么这样设计 :
1 ,编程中,我们会经常修改对象的属性值,很少改变成为另一个对象。
2 ,val 效率高,没有线程安全问题 - 推荐使用 : val
- 如果需要改变对象,才使用 : var
- 原理 : val 修饰的变量,底层相当于用了 final 修饰。
2 ,默认类型 :
- 小数 : 默认 Double
- 整数 : 默认 Int
3 ,内存图 :
- 真实值 : 放在内存中。
- 我们的变量 : 引用了内存中的值。
4 ,逃逸分析 :
- 什么样的对象放在堆内存 :
1 ,生命周期比较长。
2 ,大量的被别的对象所引用。
3 ,放入堆内存的目的 : 跨栈 。 - 什么样的对象放在栈内存 :
如果一个数据空间,他知识临时用一下,就把它放在栈中 - 不要忘了根本原则 :
放入堆内存的目的是,跨栈 。
5 ,声明变量 : 类型推导
- 我们可以不指定类型,因为 scala 可以做类型推导
- 验证 :
object Aa2 {
def main(args: Array[String]): Unit = {
var a = 1;
println(a.isInstanceOf[Int])
}
}
- 成功的标志 : 看到 true
6 ,类型不改 :
- 可以修改值。
object Aa2 {
def main(args: Array[String]): Unit = {
var a = 1;
a = 2;
println(a)
}
}
- 不可以修改类型 :报错
7 ,需要初始值 : 不可以不赋值
8 ,特殊使用 : +
- 两边都是数字 : 数学运算
- 有一边是字符串 : 拼接
如果不赋值,会报错
二 ,数据类型 :
1 ,与 java 比较 :
- 有相同的
- 也有不同的
2 ,全是对象 :
scala 中全是对象类型,没有 java 的基本类型。
3 ,顶级父类型 :
Any
4 ,值类型 : 对象
AnyVal
5 ,引用类型 :
AnyRef
6 ,类关系图 :
- 实线 : 继承关系
- 虚线 : 隐式转换
- 值型 : 各种内置对象,可以赋值
- 引用型 : 集合 + java 类 + 自定义 scala 类
- Null : 所有引用型的子类,只有一个实例 : null
- Nothing : 所有类型的子类
7 ,抛异常 : Nothing 的使用
object Aa2 {
def main(args: Array[String]): Unit = {
println(pao)
}
def pao() :Nothing = {
throw new Exception("出错啦")
}
}
8 ,隐式转换 : 低到高,可以直接转 :
- 低到高 : 可以。
- 高到低 : 不可以。
- 代码 :
def main(args: Array[String]): Unit = {
// 默认类型 Double
var a = 1.0
// 指定类型 float
var b = 2.0f
// 隐式转换
a=b
print(a)
}
9 ,Unit :
只有一个值,()
相当于 void
10 ,整数类型 :
11 ,关于 Char :
object Aa2 {
def main(args: Array[String]): Unit = {
var a:Char = ('a'+1).toChar
println(a)
}
}
12 ,字符类型的本质 :
- 存储:字符——>码值——>二进制——>存储
- 读取:二进制——>码值——> 字符——>读取
13 ,特殊类型 :
- Unit :表示无值,和其他语言中 void 等同。用作不返回任何结果的方法的结果类型。Unit 只有一个实例值,写成 ()。
- Null :null , Null 类型只有一个实例值 null
- Nothing :Nothing类型在Scala的类层级的最低端;它是任何其他类型的子类型。
当一个函数,我们确定没有正常的返回值,可以用Nothing 来指定返回类型,这样有一个好处,就是我们可以把返回的值(异常)赋给其它的函数或者变量(兼容性)