软件构造week5

3.3Abstract Data Type(ADT)
第一题
类WordList有四个方法,根据其方法定义来确定其类型
public WordList(List words)->Creator
public void unique()->Mutator
public WordList getCaptitalized()->Producer
public Map<String ,Integer> getFrequencies()->Observer

第二题
下面关于ADT的RI和AF正确的:
ADT的Abstract空间(A)中的某个值,在其Rep空间(R)中可能有多个值和其对应
若ADT的某个方法返回一个mutable的对象,并不一定表明该ADT产生了表示泄露(defensive copy)
一个immutable的ADT,其rep可以是mutable的
不正确的:
若ADT的任意constructor所构造出的object都满足RI、每个mutator方法执行结束后都保持RI为真,那么该ADT的RI就始终保持为真
解析:
defensive copy返回mutable对象,其实并未产生表示泄露
如果存在表示泄露,外部client就可以修改内部rep的值,就可能导致RI违反
只要没有rep exposure就没有问题

第三题
关于invariants,AF和RI,说法正确的是
如果一个immutable的ADT存在rep exposure,那么就违反了该ADT的invariants
如果在一个mutator方法内没有checkRep(),那么RI就可能被违反了
两个ADT有相同的rep和相同的RI,但可能AF不同
不正确:
两个ADT有相同的rep和相同的AF,那么其RI一定相同
解析:
immutability也是invariants的一部分,产生表示泄露就可能导致内部rep被修改,于是就不能保证immutable了,invariants就被违反了

第四题
用于检查ADT的Rep Invariants是否保持为真的checkRep()最好应该以下类型的方法结束前调用
Mutator
Creator
Producer
Observer
解析:
虽然observe方法不改变rep,但还是强烈建议return之前要checkRep()

第五题
class{
private String s;
private String t;
}
它的可能Rep Invariant会是
s contains only letters
s.length()==t.length()
s is the reverse of t

第六题
ADT的某个方法的spec需要以注释的形式放在代码中,在撰写这部分spec的时候,不能用到的信息是:
Mathematical values in the Rep space®
可以使用:
Parameters of operation
Data type of return values of the operation
Exceptions thrown by the operation
Mathematical values in the Abstract space(A)
解析:
Spec要给client看,那么所有内部的东西都不能用。R是rep的值空间,只能开发者自己了解。

第七题
在对ADT的方法进行JUnit测试时,以下说法正确的是:
对constructor方法,测试用例中需要构造新对象之后调用observer方法确认构造结果是否正确
对observer方法,测试用例中需要使用其他三类方法构造一个对象,再执行该方法并判断结果是否正确
不正确:
如果某方法的返回值为void,则无法为其撰写测试用例,因为无法assertEquals()
对mutator方法,测试用例中需要在该方法执行之后调用producer方法确认是否做了正确的mutate

第八题
不正确:
只要有非final的field,就一定产生表示泄露
除了初始化,immutable的类一定不能存在其他任何改变rep的方法
正确:
只要有public的field,就一定有表示泄露
checkRep()方法可能消耗大量运算在程序投入实际运行的时候要注释掉
解析:
所以不到迫不得已千万不要用public
final是来支持immutable的,与是否存在表示泄露无直接关系
可以有beneficent mutation
assert语句在投入真正运行的程序中是没有意义的,需要注释掉。前提是开发者利用checkRep()已经发现了所有违法RI的bug并修复了

第九题
针对你设计的一个ADT,不应该提供给client看的内容包括:
AF
RI
Rep exposure
Testing strategy
Rep
Implementation
Test cases
提供:
Spec

3.4Object-Oriented Programming(OOP)
第一题
关于static和final的说法,正确的是:
static类型的方法,调用时无需创建类的实例对象,可直接通过类名使用
被声明为final类型的类,无法从中派生出子类
被声明为final类型的方法,无法在子类中被override
类A的static方法中不能直接调用A的instance方法(而是要new一个A的对象再调用);A的instance方法中可以直接调用A的static方法
不正确:
一个变量被声明为final,意味着它在被首次赋值之后,其内容就不能再变化

第二题
关于Java interface的说法,正确的是:
不能有constructor(构造方法)
不能有final方法
不能有private方法
可以有static方法
可以有fields(属性)
解析:
可以有属性的,都是public static final的

第三题
关于class和interface的说法,不正确的是:
一个类只能implements一个接口
一个类不能同时extends另一个类和implements一个接口
正确的:
一个接口可以extends一个或多个其他接口
一个类implements了一个接口,意味着它必须要实现该接口中的所有方法
一个类除了实现其implements的接口中的方法,还可以增加新的方法

第四题
某方法的定义是public int getLength (List <String> list, boolean bFliter),对该方法合法的重载:
private int getLength (List<String> list, String regex)
public Integer getLength (List<String> list)
public int getLength (List<String> list) throws IOException
不合法的:
public void getLength (List<Object> list, boolean bFliter)

第五题
关于Java OOP中override 和overload的异同,说法正确的是:
前者的参数列表不能改变,后者的参数列表必须发生变化
前者的返回值类型不可变化,后者的返回值类型可以变化
前者的类型检查发生在run-time,后者的类型检查发生在compile-time
不正确的:
前者抛出的异常可以变化,后者抛出的异常不能变化
在子类里override父类方法时,方法前面必须使用@Override;overload父类方法时,无需使用annotation
解析:
在子类里override父类方法时,@override不是必须的,但是强烈建议使用,可以帮助开发者理解方法的“源头”

第六题
class Car{
public String refuel()
{ return “R”;}
}
Class Tesla extends Car{
public String refuel(){return “C”;}
public String refuel(double price)
{return “p”;}
}
无法通过static type checking的是
Car c = new Car();
c.refuel(10);

Car c = new Tesla();
c.refuel(10);
可以通过:
Car c = new Tesla();
c.refuel;

Tesla t = Tesla();
t.refuel;
解析:
Overload由static type checking负责

第七题
class Car{
public String refuel()
{ return “R”;}
}
Class Tesla extends Car{
public String refuel(){return “C”;}
public String refuel(double price)
{return “p”;}
}
能获得内容为"C"的字符串是
Car c = new Tesla();
c.refuel();

Tesla t = Tesla();
t.refuel();
不能获得:
Car c = new Car();
c.refuel();

Car c = new Car();
((Tesla) c).refuel();
解析:
Override在run-time做dynamic checking

第八题
类A和B,BextendsA,二者分别有一个apply(A a)方法,具有不同的返回值类型
假如
A a = new A();
B b = new B();
下面正确的是:
b.apply(a)与((B) b).apply((B) a)不等价
不正确:
b.apply(a)与((B) b).apply(a)不等价
b.apply(a)与((A) b).apply(a)不等价
b.apply(a)与((B) b).apply((A) a)不等价
解析:
b.apply(a)与((B) b).apply(a)等价
将b强转为(B)b,等于没转,b 的类型本来就是B

b.apply(a)与((B) b).apply((A) a)等价
也是类似的,两个强转都是没转

b.apply(a)与((A) b).apply(a)等价
B是A的子类,所以b必然是A的实例,所以将b转成(A)b,本质上还是等价的。

b.apply(a)与((B) b).apply((B) a)不等价
将a转成(B) a,这个向下强转做 不到,该强转将会在运行时抛出异常 ClassCastException。

第九题
关于OOPpolymorphism(多态)不是同义词:
generics和overriding
同义词:
subtype polymorpgism 和 inclusion polymorphism
Parametric polymorphism 和 generics
ad hoc polymorphism 和function overloading

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值