3.1 数据类型与类型检验
一、数据类型
数据类型分为以下两种:
基本数据类型:int、long、boolean、double、char
对象数据类型:String、BigInteger等
他们的区别如下图:
二、静态、动态检查
静态类型:在编译阶段进行类型检查,可在编译阶段发现错误,避 免了将错误带入到运行阶段,可提高程序正 确性/健壮性
包括:语法错误, 类名/函数名错误, 参数数目错误,返回值类型错误
例如:int a = 18.7 //error,String a = 1; //error等等
动态类型:在运行阶段进行类型检查
包括:非法的参数值. 非法的返回值, 越界, 空指针
找bug的时机:静态类型检查>>动态>>无检查
静态检查:关于“类型”的检查,不考虑值 动态检查:关于“值”的检查
三、可变性与不可变性
1)赋值:通过”=“给变量赋值
2)改变一个变量与改变一个变量的值的区别:
改变一个变量:将该变 量指向另一个值的存储空间
改变一个变量的值:将 该变量当前指向的值的存储空间中写入一个新的值。
3)不变性:
不变数据类型:一旦被创建,其值不能改变。如果是引用类型,也可以是不变的:一旦确定其指向的对象,不能在被改变。
关于final
1.修饰类当用final去修饰一个类的时候,表示这个类不能被继承。注意:a. 被final修饰的类,final类中的成员变量可以根据自己的实际需要设计为fianl。b. final类中的成员方法都会被隐式的指定为final方法。
2.修饰方法
被final修饰的方法不能被重写。
注意:
a. 一个类的private方法会隐式的被指定为final方法。
b. 如果父类中有final修饰的方法,那么子类不能去重写。
3.修饰成员变量:
注意:
a.必须要赋初始值,而且是只能初始化一次。
b.被final修饰的成员变量赋值,有两种方式:1、直接赋值 2、全部在构造方法中赋初值
c.如果修饰的成员变量是基本类型,则表示这个的值不能再修改。
d.如果修饰的成员变量是一个引用类型,那么这个引用的地址不能修改,但是所指向的对象里面的内容还是可以更改的。
例如String是不可变的数据类型,
在上面的例子中,s添加了b,s指向了一个新对象。
当有多个引用时,就会产生区别,例如下图
使用不可变类型,频繁修改会产生大量的临时拷贝。但是更”安全“
使用可变数据类型,可获得更好的性能,也适合在多个模块之间共享数据
例如下面这个例子,由于list可变。导致调用sumAbsolute时将list的值全部改为正数,两个输出结果都变为10。
防御性拷贝:
下面的程序会对groundHogAnswer的month修改,导致错误,使用防御性拷贝,
return new Date(groundhogAnswer.getTime());
通过防御式拷贝,给客户端返回一个全新的Date对象
四、Snapshot diagram 用于描述程序运行时的内部状态
便于程序员之间的交流
便于刻画各类变量随时间变化
便于解释设计思路
基本类型的值:
对象类型的值:
不可变对象:用双线椭圆
对象值的修改:左不可变,右可变
不可变的引用:用双线箭头
引用时不可变的,但指向 的值却可以是可变的 ;可变的引用,也可指向不可变的值