目录
2.Static vs. dynamic data type checking(静态与动态数据类型检查)
2.3Static vs. Dynamic Checking
3.2Mutability and Immutability
3.3Advantage and Disadvantage of mutable types
4.Snapshot diagramas a code-level, run-time, and moment view
4.1Primitive and Object values in Snapshot Diagram
4.2Unreassignable/Immutable references ( final )
1.在编程语言中的数据类型
1.1基本数据类型
例如:
– int (for integers like 5 and -200, but limited to the range ± 2^31, or roughly ± 2 billion)
– long (for larger integers up to ± 2^63)
– boolean (for true or false)
– double (for floating-point numbers, which represent a subset of the real numbers)
– char (for single characters like 'A' and '$' )
1.2对象数据类型
例如:
– String represents a sequence of characters.
– BigInteger represents an integer of arbitrary size.
根据Java约定,基本数据类型为小写,而对象数据类型以大写字母开头。
1.3对象类型形成层次结构
除“object”外的所有类都有一个父类,并使用extends指定;
如果省略了extends,则默认其父类为“object”;
一个类是其所有父类的一个实例。
2.Static vs. dynamic data type checking(静态与动态数据类型检查)
2.1Static checking
2.2Dynamic checking
动态类型检查:在执行代码时会自动发现错误。一般情况下,它能检测出:
(1).非法的参数值. For example, the integer expression x/y is only erroneous when y is actually zero; otherwise it works. So in this expression, divide-by-zero is not a static error, but a dynamic error.
(2).非法的返回值, i.e. when the specific return value can’t be represented in the type.
(3).越界, e.g. using a negative or too-large index on a string.
(4).空指针,在空对象引用上面调用方法
2.3Static vs. Dynamic Checking
3.Mutability and Immutability
3.1Immutability 不变性
要在字符串 String 的末尾添加一些内容,必须创建一个新的字符串对象:
例如:StringBuilder as a mutable type
这个类有更改对象的值的方法,而不仅仅是返回新的值:
3.2Mutability and Immutability
当只有一个引用时,Mutability and Immutability之间的区别并不重要。但是,当对对象有其他引用时,它们的行为方式有很大的差异:
3.3Advantage and Disadvantage of mutable types
(1).使用不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收),可变类型可以最小化拷贝以提高效率,获得更好的性能。例如如下代码:
对于String,第一个数字(“0”)在构建最后一个字符串的过程中实际上被复制了n次,第二个数字被复制了n-1次,以此类推。 它实际上花费O(n²)时间来完成所有的复制,即使我们只连接了n个元素。
对于StringBuilder,它使用一个简单但聪明的内部数据结构,以避免做任何复制,直到最后,当要求与toString()调用的最终字符串。
(2).适合于在多个模块之间共享数据
Disadvantage:
可变性使您更难理解您的程序在做什么,也更难强制执行合同;不可变类型更容易避免bug,更容易理解,也更容易进行更改。例如:
3.4如何修改代码
4.Snapshot diagramas a code-level, run-time, and moment view
Snapshot diagrams用于描述程序运行时的内部状态,便于程序员之间的交流,便于刻画各类变量随时间变化,同时也便于解释设计思路 。
4.1Primitive and Object values in Snapshot Diagram
对于基本类型的值,原始值用裸常数表示。传入的箭头是对变量或对象字段中的值的引用。
对于对象类型的值,对象值是用其类型标记的圆,当我们想要显示更多细节时,我们在其中写字段名,箭头指向它们的值。对于更详细信息,字段可以包括它们声明的类型。
对于不可变对象(如:String),在快照图中用双边框表示,就像我们的图中的String字符串对象一样。
对于可变对象(如:StringBuilder):
4.2Unreassignable/Immutable references ( final )
在snapshot diagram中,不可重新分配的引用(final)用双箭头表示。
5.Useful immutable types
这种包装器得到的结果是不可变的:只能看;但是这种“不可变”是在运行阶段获得的,编译阶段无法据此进行静态检查