又要写实验三又要复习,实验三已经写了好几天还没写完,停下来写一篇博客,总结一下最近写实验和复习学到的东西和遇到的一些问题。
1.关于目录结构的问题:
由于这次实验是自己从零开始写,就碰到了一些目录结构的问题。首先是src文件夹中的类是不能直接被它的子文件夹中的类调用的,可能需要加import,但是import的都是src下的子文件夹,直接写在src下的类我就不知道怎么办了。
然后就是IDEA的Ctrl+Shift+T创建对应测试类的方法会在测试类对应目录下创建测试类,所以要求src文件夹和test文件夹有相同的目录结构。
2.定义异常类的方法:
一般是继承Exception类:
3.关于对象调用的到底是父类还是子类的方法的问题:写实验三时碰到了一个问题,简化之后就是有一个父类A和它的子类B,我把一个定义为类型A的变量a用一个类型B的变量赋值,然后a调用A和B中都有的一个方法,实际上调用的是B定义的方法,也就是说一个变量调用的方法和它的类型无关,和它里面实际存的东西有关。
4.public,protected,default,private:前面一直以为default就是private…原来default是单独的一种。它们4个的区别:public是在哪都能用;protected是在外部包不能用,但如果是它的子类可以用;default子类也不行,只能在本包中用;private更严格,只能在类内部用。
5.关于等价性的复习:immutable和mutable的等价性是不一样的。
immutable的等价性分程序员和用户两个角度,程序员认为AF相等就是相等,但用户是不知道AF的,所以用户只能通过observer来判断两个对象是否相等,这就给observer的设计提出了要求:AF相同的两个对象,所有observer的返回值必须相同。一个例子是我用一个字符串s(表示空间)实现一个字母集合(抽象空间)的ADT,我的observer就不能是返回s的首个字母,因为这样可能使两个AF相同的对象返回不同的值。其实这也可以认为是一种规约设计的不合理,因为它造成了表示泄露,破坏了表示独立性:我的ADT只限定了是一个字母集合,没要求用字符串实现。
mutable的等价性分观察等价性和行为等价性:观察等价性就对应于immutable中的用observer判断等价,也是我们一般认为的等价。行为等价性就是调用对象的任何方法都有一致的结果,比观察等价性多的就是使用mutator做相同修改后值相同,实际上实现行为等价性使用的是引用等价性,就是指向的内存空间必须相同。java对大部分可变数据类型使用观察等价性,这可能导致bug,一个例子是一个List的集合,我们对其中某一个list调用add后,发现对集合使用contains函数不再包含该list了,这是因为add会改变equals和hashcode的结果,对象初始被放到集合里建立了一个由它的hash值到它的映射,而对象的hash值改变后,这个映射并没有被改变,也就是hash table的RI被破坏了,所以我们按新的hash值去找是找不到的,而我们用一个迭代器却可以找到这个元素,可能是因为迭代器是按初始映射遍历的。这个例子的问题就在于我们判断两个list对象的相等使用的是他们的hashcode,这使用的是观察等价性而不是行为等价性。
08-17
08-17
08-17