本文根据课程ppt整理而成,仅供参考。
目录
1. Data type in programming languages
2. Static vs. dynamic data type checking
3. Mutability and Immutability
4.Snapshot diagram as a cod-elevel, run-time, and moment view
四、Data Type and Type Checking
1. Data type in programming languages
类型(type)是一组值,以及可以对这些值执行的操作。
变量(variables):存储特定类型值的命名位置。
2. Static vs. dynamic data type checking
Java是一种静态类型语言。所有变量的类型在编译时(在程序运行之前)都是已知的,因此编译器也可以推断出所有表达式的类型。如果 a 和 b 被声明为 int,则编译器推断a+b 也是 int类型。事实上,Eclipse 环境会在编写代码时执行此操作,因此在键入代码时可以发现许多错误。
在像 Python 这样的动态类型语言中,这种检查被推迟到运行时(当程序运行时)。
静态检查(static checking):在程序运行之前自动发现错误。(语法错误,类名、函数名错误,参数数目错误,参数类型错误,返回值类型错误)
动态检查(dynamic checking):执行代码时自动发现错误。(非法的参数值,非法的返回值,越界,空指针)
不检查(no checking):语言根本不能帮你找到错误。你必须自己去寻找,否则就会得到错误答案。
静态检查往往是关于类型,与变量具有的特定值无关的错误。静态类型保证变量将具有该集合中的一些值,但是直到运行时我们才确切知道它具有哪个值。因此,如果错误仅由某些值引起,例如除以零或索引超出范围,则编译器不会引发静态错误。相比之下,动态检查往往是关于由特定值引起的错误。
3. Mutability and Immutability
不变性(Immutability)是主要设计原则。
不变数据类型(Immutability):一旦被创建,其值不能改变。
Java提供了不可变的引用:赋值一次且永远不会重新赋值的变量(引用类型)。
最好使用 final 来声明方法的参数和尽可能多的局部变量,像变量的类型一样,这些声明是重要的文档,对代码的读者有用,并由编译器静态检查。注意: final类无法派生子类,final变量无法改变值/引用, final方法无法被子类重写。
不变对象:一旦被创建,始终指向同一个值/引用。
可变对象:拥有方法可以修改自己的值/引用。
4.Snapshot diagram as a cod-elevel, run-time, and moment view
快照图表示程序在运行时的内部状态:它的堆栈(正在进行的方法及其局部变量)和它的堆(当前存在的对象)。
使用快照图的目的:便于程序员之间的交流,便于刻画各类变量随时间变化,便于解释设计思路,便于后续更丰富的设计符号。
基元值由裸常量表示。 传入箭头是对变量或对象中的值的引用。如下图所示。
对象值是按其类型标记的圆圈。当我们想要显示更多详细信息时,我们会在其中写入字段名称,并用箭头指向它们的值。 有关更多详细信息,这些字段可以包含其声明的类型。
不可变对象(由其设计者旨在始终表示相同的值)在快照图中用双边框表示,就像图中的 String 对象一样。
String s = "a"; s = s + "b";
相比之下,StringBuilder(一个内置的Java类)是一个表示字符串的可变对象,它具有更改对象值的方法。
StringBuilder sb = new StringBuilder("a"); sb.append("b");
在快照图中,不可变的引用(final)由双箭头表示。