动态,静态

Java是⼀种静态类型的语⾔。所有变量的类型在编译的时候就已经知道了(程序还没有运⾏),所以编译器也可以 推测出每⼀个表达式的类型。例如,如果 a 和 b 是 int 类型的,那么编译器就可以知道 a+b 的结果也是 int 类 型的。事实上,Eclipse在你写代码的时候就在做这些检查,所以你就能够在编辑的同时发现这些问题。
在动态类型语⾔中(例如Python),这种类型检查是发⽣在程序运⾏的时候。 静态类型是静态检查的⼀种——检查发⽣在编译的时候。本课程的⼀个重要⽬标就是教会你避免bug的产⽣,静态 检查就是我们知道的第⼀种⽅法。其中静态类型就阻⽌了⼀⼤部分和类型相关的bug——确切点说,就是将操作符 ⽤到了不对应的类型对象上。

例如,试图将两个字符串进⾏算术乘法

“5”*“6”

静态类型检查就会在你编辑代码的时候发现这个bug,⽽不是等到你编译后运⾏程序的时候。

编程语⾔通常能提供以下三种⾃动检查的⽅法:
静态检查: bug在程序运⾏前发现 动态检查: bug在程序运⾏中发现 ⽆检查: 编程语⾔本⾝不帮助你发现错误,你必须通过特定的条件(例如输出的结果)检查代码的正确性。
很明显,静态检查好于动态检查好于不检查。
这⾥有⼀些“经验法则”,告诉你这静态和动态检查通常会发现什么bug: 静态检查 :
语法错误,例如多余的标点符号或者错误的关键词。即使在动态类型的语⾔例如Python中也会做这种检查: 如果你有⼀个多余的缩进,在运⾏之前就能发现它。 错误的名字,例如 Math.sine(2) . (应该是 sin .) 参数的个数不对,例如 Math.sin(30, 20) . 参数的类型不对 Math.sin("30") . 错误的返回类型 ,例如⼀个声明返回 int 类型函数 return "30";
动态检查 : ⾮法的变量值。例如整型变量x、y,表达式 x/y 只有在运⾏后y为0才会报错,否则就是正确的。 ⽆法表⽰的返回值。例如最后得到的返回值⽆法⽤声明的类型来表⽰。 越界访问。例如在⼀个字符串中使⽤⼀个负数索引。 使⽤⼀个 null 对象解引⽤。( null 相当于Python中的 None )
静态检查倾向于 类 型 错 误 ,即与特定的值⽆关的错误。正如上⾯提到过的,⼀个类型是⼀系列值的集合,⽽静态类 型就是保证变量的值在这个集合中,但是在运⾏前我们可能不会知道这个值的结果到底是多少。所以如果⼀个错误 必须要特定的值来“触发”(例如除零错误和越界访问),编译器是不会在编译的时候报错的。

与此相对的,动态类型检查倾向于特定值才会触发的错误

猜你喜欢

转载自www.cnblogs.com/yry1160300116/p/9189275.html