数据类型:
基本数据类型:
只有值,没有ID,在栈中分配内存
对象数据类型:
既有ID,也有值,在堆中分配内存
静态/动态数据类型检查:
静态:在编译阶段,与类型相关,
检查语法错误,类名,函数名错误,参数数目、类型错误,返回值类型错误,
检查final类型的不可变
动态:在运行阶段,与值相关,检查非法参数(除零错误),越界,空指针,
检查immu类型的不可变
final
1. final类不能派生子类
2. final变量值不可变/引用不可变:
基本数据类型(int)值不可变;
对象数据类型(比如String)引用不可变(修饰为final后只能指向这个存储空间,不能指向别处)。
3. final方法不能被子类重写
防御式拷贝:
mutation类型的风险:
1. 传递可变类型的参数(可以改变其中的值,再次使用出现问题)
2. 返回可变类型的数据(如果接收方进行修改,有可能影响到程序内部)
使用防御式拷贝避免风险
1. 传递可变类型的参数时,在使用该参数的函数内部根据参数的值创建一个新的和参数相同类型的对象,用此来完成函数的一系列操作。此时外部改变参数的值,函数不会被修改。
2. 返回可变类型的数据时,通过拷贝返回对象的值,返回给客户端一个新的拷贝的对象,避免原来对象的值被改变。
防御式拷贝也有局限性:
大部分时候用户不会去恶意修改,可能造成内存的浪费。