快要考试了,根据所给提纲和上课所学边复习边罗列一下重难点吧。学得不好,如有疏漏欢迎指正!
一、基本数据类型、对象数据类型
数据类型:本质是一个集合
基本数据类型:只有值、无ID;不可变;在栈中;使用时存在,无法实现表达的统一;代价低
如:int、long、boolean、double、char
对象数据类型:继承自Object;既有ID也有值;有些可变;在堆中;代价昂贵
如:String、BigInteger、Classes、interfaces、arrays、enums、annotations
二、静态类型检查、动态类型检查
动态类型检查 >> 静态类型检查 >> 无检查
静态类型检查
可在编译阶段发现错误,避免将错误带入到运行阶段,可提高程序正确性、健壮性
语法错误、类名、函数名错误、参数数目错误、参数类型错误、返回值错误
-> 与类相关
动态类型检查
非法的参数值、非法的返回值、越界、空指针
-> 与值相关
注:Java是只进行静态检查的语言,运行出错时会停止不会查错
三、Mutable、Immutable
1.不变性:设计的重要原则
2.不变数据类型:
一旦被创建,其值不能改变——保证声明时无改变类的属性、方法
如果是引用类型,也可以是不变的:一旦确定其指向的对象,不能再被改变
final:
若final immutable类型,则运行中数据均不变——静态检查的一部分
若final mutable类型,不能指向新对象,可以改变值
final无法派生子类、final变量无法改变值/引用
final方法无法被子类重写
3.可变数据类型:
拥有方法可以修改自己的值、引用
方便分享、方便作为全局变量
4.example:
String:immutable
StringBuilder:mutable
5.二者比较
最终值是相同的
当只有一个引用指向该值,没有区别
多个引用时,immutable是牺牲速度换安全:
使用immutable,对其频繁修改会产生大量的临时拷贝(需要垃圾回收)
使用mutable,使可变类型最少化拷贝以提高效率
四、值的改变、引用的改变
改变引用是改变指针,改变值是在这个指针下改变对象内容
五、防御式拷贝
即返回一个全新的对象
大部分时候该拷贝不会被客户修改,可能造成大量的内存浪费
immutable效率更高,正是因为其不用进行防御式拷贝
六、Snapshot diagram(必考)
用于描述程序运行时的内部状态
优点:便于程序员之间的交流、便于刻画各类变量随时间变化、便于解释设计思路
基本类型的值:
对象类型的值:
immutable和mutable:
不可变对象/引用用双椭圆/箭头
注:引用是不可变的,但指向的值却是可变的;可变的引用,也可指向不可变的值
七、Specification、前置/后置条件
包含内容:输入、输出的数据类型、功能和正确性、性能
只讲“能做什么”,不讲“怎么实现”
example:
前置条件:对客户的约束,在使用方法时必须满足
后置条件:对开发者的约束,在结束方法时必须满足
契约:如果前置条件满足了,后置条件必须满足;而前置条件不满足,则方法可以做任何事
除非spec必须如此,否则不应该改变输入参数
限定“不可变”、不应靠用户/程序员道德限定
八、行为等价性
站在客户(需求)的角度考察是否等价
不是单纯地看实现代码,需要根据spec判断
实现相同的功能,但可能展现出不同的性能
九、归约的强度
归约变强:前置条件更弱,后置条件更强
-> implementor的自由度和责任越重,而client的责任越轻