3.1数据类型和类型检查
主要内容:
- 基本/对象数据类型
- 静/动态类型检查
-
可变/不可变数据类型
- 值/引用的改变
- SnapShot
-----------------------------------------------------------------------------------------------------------------
1.基本数据类型与对象数据类型的区分
联系:
将基本数据类型包装为对象类型:
Boolean,Integer,Short 等等
尽量避免使用这种对象类型,一般是在集合定义的时候使用。
2.静态类型检查与动态类型检查:
静态类型检查:在编译的时候检查(JAVA)
检查:语法错误,类名。函数名,参数类型,返回值错误
在编译阶段发现错误,避免将错误带到运行阶段
动态类型检查:运行时检查
检查:非法参数值,非法返回值,数组等越界,空指针
区别:静态类型检查是关于值的类型的检查,不检查具体的值
动态类型检查是关于值的检查
动态>静态>不检查
----------------------------------------------------------------------------------------------------
3.可变性与不可变性
改变一个变量:将该变量指向另一个存储空间(改变引用指向的地址)
改变变量的值:刷先内存空间,将新的值存入内存
不可变性:一旦不创建,值不可以被改变
引用类型也可以是不变的(final Person)
(final关键字较特殊,无法被继承,被重写,无法改变值,也无法改变引用)
不可变对象:一旦被创建,始终指向一个值/引用
可变对象:拥有可以修改自己值/引用的方法
(final 创建的immutable String这种不可变对象和String 本身这种不可变对象是不一样的,final是完全不能修改什么都不能改变,而不加final则是通过指向新的对象来改变,改变引用的值)
final String a="a"
a=a.concat("b") //error
String b="b"
b=b.concat("c")//正确,
不可变对象不是不能修改,而是对他修改要让他指向新的对象,需要产生大量拷贝。
而可变类型则不需要产产生拷贝,但是不安全
(String 是immutable的,但是StringBuilder是mutable,Date是mutable的)。
防御式拷贝可以改变可变对象的安全性:拷贝一个新的对象(无论是传参还是返回)--我觉得这就是模仿了Immutable的特性
单引用时,可变与不可变无区别,当有多个引用时,差别出现:
可以发现a这个引用指向的对象已经变了,但是b仍然指向原先的对象
-----------------------------------------------------------------------------------------------------------------4.SnapShot快照
不可变引用:双箭头
不可变的引用,其引用是不变的,但值是可变的(引用未变指它的地址没有改变)
但是如果是String ,加上final,引用不变,值也不能变
可变引用:单箭头
可以指向不可变的值(String)
可变引用(与对象是不是可变与不可变的无关系,只要用final 的就是不可变引用,其余的是可变引用)
引用改变:指向的地址改变