软件构造 第三章 学习笔记
1.基本数据类型和对象数据类型
基本数据类型类似于之前c语言学习的int char double等,都属于基本数据类型,其特点是只有值,均为不可变(immutable),栈中保存。而由此带来的效果也是明显的,代价低。对于其中immutable的理解在于
例如int i=1;i=2 此时是创造了一个新的地址空间存储2,i指向了这个新的地址空间。
对象数据类型是类,继承于object,将基本数据类型进行包装得来。通常我们在使用list,map等集合时会用到(这种容器要求类),但是会降低 效率。存在自动转换机制。部分可变,部分不可变,例如String是不可变的。
2.类型转换问题
谈到了两种方式,动态与静态检查两种。静态检查的方式有多种,我们常用的eclipse,vs等会在还在代码阶段就指出问题,例如int t="a"; 还有一部分会在编译阶段检查出(实际上和typing阶段指出问题类似) 这种称为static checking 还有动态检查dynamic checking 即在程序运行阶段检查异常(java异常机制等) 一般来说 静态>>动态>>无
静态检查包括多个检查内容:语法错误,函数/类名错误,参数数目类型错误,返回值类型错误等。这些在日常的vs和eclipse等比较常见。
动态检查往往会检查出一些不太容易发现的问题,例如数组越界等,非法返回值,空指针等。一些问题往往只能在动态检查中找出
静态检查偏向于对于类型的检查,动态检查是对于值得检查。
3.可变与不可变
这里稍微有点抽象,但是非常重要。首先要明白,改变一个变量不等于改变一个变量的值(在这里我们这样认为) 改变一个变量=改变变量,使其指向另一个地址空间。 改变一个变量的值=改变现在变量指向地址空间存储的内容。 两者显然有着很大的差别。
不变对象:一旦创建,其指向的地址空间永远不会变化。 关键字:final 例如final int i=5 类似于c中的constant 可变对象:拥有方法改变自身的值
经典的不变对象:String String b="a" b=b.concat("b") 此时b从指向"a" 重新构建一个空间存储"ab"然后再指向新的空间。 StringBuilder就是可变对象,会直接在原有空间上进行修改。 两者在有多个对象引用时会产生区别。 不变对象更加地安全,但是也会产生更多的拷贝副本,浪费资源,这里就涉及到了上学期讲的一部分垃圾回收机制问题。
为了效率与安全,可变数据类型会使用防御性拷贝,节省了资源,数据也更加安全。
可变值的不可变引用:
final StringBuilder ab="abc" ab.apend("d") ab=new.... 这种情况下编译器就会报错
有关容器的可变与不可变,会在lab2的总结中提到
浙公网安备 33010602011771号