(2019春)软件构造:雨课堂试卷(二)(第3章)

文章目录

    • 3.1(a) Data Type and Type Checking
            • 多选题 第1题 2分
            • 单选题 第2题 1分
            • 多选题 第3题 2分
            • 单选题 第4题 1分
            • 多选题 第5题 2分
            • 填空题 第6题 2分
    • 3-1(b) Mutability and Immutability
            • 单选题 第1题 1分
            • 单选题 第2题 1分
            • 填空题 第3题 4分
            • 多选题 第4题 2分
            • 多选题 第5题 2分
            • 填空题 第6题 3分
            • 单选题 第7题 1分
    • 3.2 Specification
            • 多选题 第1题 2分
            • 单选题 第2题 1分
            • 填空题 第3题 3分
            • 多选题 第4题 2分
            • 多选题 第5题 2分
            • 单选题 第6题 1分
    • 3.3 Abstract Data Type (ADT)
            • 填空题 第1题 4分
            • 单选题 第2题 1分
            • 多选题 第3题 2分
            • 多选题 第4题 2分
            • 多选题 第5题 2分
            • 多选题 第6题 2分
            • 多选题 第7题 2分
            • 多选题 第8题 2分
            • 多选题 第9题 3分
    • 3.4 Object-Oriented Programming (OOP)
            • 多选题 第1题 2分
            • 多选题 第2题 2分
            • 多选题 第3题 2分
            • 单选题 第4题 1分
            • 多选题 第5题 2分
            • 多选题 第6题 2分
            • 多选题 第7题 2分
            • 单选题 第8题 1分
            • 单选题 第9题 1分
    • 3.5 Equality
            • 填空题 第1题 3分
            • 多选题 第2题 2分
            • 填空题 第3题 2分
            • 单选题 第4题 1分
            • 填空题 第5题 2分
            • 单选题 第6题 1分
            • 多选题 第7题 2分
            • 单选题 第8题 1分
            • 单选题 第9题 1分

3.1(a) Data Type and Type Checking

多选题 第1题 2分

Java中的Primitive Type(int, char, boolean等)和Object Type(String, Boolean, Calendar等)的差异是____

A 前者在stack中分配内存,后者在heap中分配内存
B 使用前者的时空代价低,使用后者的时空代价高
C 前者是immutable的,后者是mutable的
D 前者和后者中的某些类型可通过auto-boxing进行自动转换,例如intInteger

正确答案:ABD

单选题 第2题 1分

Static type checking 和 dynamic type checking 的区别,不正确的是____

A 前者在编译阶段发生,后者在运行阶段发生
B 前者比后者更能带来程序的健壮性,因为可以在程序投入运行前就发现错误
C 前者能发现数组访问越界的错误,后者能发现divide by 0的错误
D 前者是关于“类型合法性”的检查,后者是关于“值的合法性”的检查

正确答案:C

多选题 第3题 2分

以下代码段中,会在运行阶段发生错误的是___

A

int[] arr = new int[] {1,2};
arr[2] = 3;

B

int[] arr = new int[] {1.2};
arr[0] = "3";

C

String s = null;
System.out.println(s == null);

D

String s = null;
System.out.println(s.length());

正确答案:AD

单选题 第4题 1分

以下__不是static type checking所能处理的编程错误

A 所调用函数的参数数目错误
B 调用一个指向null的对象的某个方法
C 函数的return语句返回的变量类型与函数声明中的返回值类型不匹配
D 赋值语句右侧的值类型与左侧的变量类型不匹配

正确答案:B

多选题 第5题 2分

___不具备static typing (即static type checking)的能力

A Java
B C++
C Python
D Ruby
E Perl
F PHP

正确答案:CDEF

填空题 第6题 2分
String a = "5" + 6;
System.out.println(a);

会在控制台打印出什么? [填空1]

可填写“编译错误”、“运行错误”,或具体输出的字符串,无需带引号。

int a = "5" + 6;
System.out.println(a);

此时的打印输出呢? [填空2]

正确答案:
56;编译错误

3-1(b) Mutability and Immutability

单选题 第1题 1分

关于mutable和immutable的说法,不正确的是__

A 所有简单数据类型和所有相对应的封装类(Integer, Double, Boolean等)都是immutable的
B 所有数组都是mutable的
C 使用immutable类型可以降低程序蕴含bug的风险,但其时空性能相对较差
D 一个immutable的类,一旦其constructor方法执行结束并产生了类的实例,则该实例的任何成员变量都不能够再被做任何修改

正确答案:D

单选题 第2题 1分

针对final关键字,说法不正确的是___

A A final class declaration means it cannot be inherited.
B A final variable means it always contains the same value/reference but cannot be changed
C A final method means it cannot be overridden by subclasses
D The contents in a final Arraylist cannot be changed during its lifecycle.

正确答案:D

填空题 第3题 4分
String a = "a";
String c = a;
a += "b";
c += "c";

StringBuilder b = new StringBuilder(a);
StringBuilder d = b;
b.append("b");
d.append("c");

假设执行之后未进行任何垃圾回收,此时内存里共有 [填空1]String对象和 [填空2]StringBuilder对象

此时c的取值是 [填空3]d的取值是 [填空4]

正确答案:
3;1;ac;abbc

多选题 第4题 2分

关于immutable和mutable data type的说法,正确的__

A 使用不可变类型,对其频繁修改会产生大量的临时拷贝
B 可变类型可直接修改其值而无需太多拷贝,从而提高效率
C 不可辩数据类型更“安全”,因为其值无法修改
D 使用可变类型做“全局变量”,可在不同模块之间高效率的进行共享数据读写

正确答案:ABCD

多选题 第5题 2分
final List l1 = new ArrayList<>();
List l2 = new ArrayList<>();
1.	l1.add("a");
2.	l1.set(0, "b");
3.	l1 = l2;
4.	l2 = l1;

在上面标号1-4的四行中,无法通过static type checking的是_____

A 1
B 2
C 3
D 4

正确答案:C

填空题 第6题 3分
List k = new ArrayList<>();
k.add("lab1 ends");

Irerator it = k.iterator();
System.out.println(it.hasNext());

it.next();
System.out.println(it.hasNext());

k.remove(0);
System.out.println(it.hasNext());

分别输出的是 [填空1][填空2][填空3]

填写true或者false即可。

正确答案:
TRUE;FALSE;TRUE
答案解析:

第三个填空,输出TRUE,这让人很费解,试着查阅资料了解一下原因。

单选题 第7题 1分
List t = new ArrayList<>();
t.addAll(Array.asList("a","b"));
Iterator i = t.titerator();
while(i.hasNext())
	if(i.next() == "a")
		i.remove();

期望结果是t中只包含"b"
以下说法正确的是____

A Static type checking未通过
B 执行时出现dunamic error,抛出异常
C 正常执行,但结果与期望不一致
D 正常执行,结果与期望一致

正确答案:D

3.2 Specification

多选题 第1题 2分

两个方法具有“行为等价性(behavior equivalence)”,以下说法正确的是_____

A 站在客户端的视角看,它们实现相同的功能
B 站在客户端的角度看,它们可能展现出不同的性能
C 它们具有相同的规约(spec)
D 它们具有相同的实现算法和异常处理策略
E 其实是针对同一个spec来说是等价的。若对这个spec进行更改,这两个方法也许就不等价了

正确答案:ABCE

单选题 第2题 1分

以下关于方法spec的说法,不恰当的是__

A 程序员针对给定的spec写代码,需做到“若前置条件满足,则后置条件必须要满足”
B 前置条件是对client端的约束,后置条件是对开发者的约束
C 若客户端传递进来的参数不满足前置条件,则方法可直接退出或随意返回一个结果
D 一个方法的前置条件比另一个方法的前置条件更强,二者的后置条件相同,则前者spec的强度比后者大

正确答案:D

填空题 第3题 3分

在Java语法中,使用 [填空1] (annotation)表达一个方法的pre-condition,使用 [填空2] 和 [填空3] (annotation)表达方法的post-condition。

正确答案:
@param;@return;@throws

多选题 第4题 2分

以下说法正确的是___

A 除非在post-condition中明确声明过,否则方法内部代码不应该改变(mutate)输入参数
B 方法的spec描述里不能使用内部代码中的局部变量或该方法所在类的private属性
C 若在方法的post-condition中声明“client端不能修改该方法所返回的数量”,可以减少该方法的潜在bug
D 若为某方法设计JUnit test case,在任何test case中对该方法的调用必须遵循其pre-condition

正确答案:ABD

多选题 第5题 2分

如果修改了某个方法的spec使之变弱了,那么可能发生的是__

A Client调用该方法的代价变大了,即client需要对调用时传入该方法的参数做更多的检查
B 程序员实现该spec的难度增大了,自由度降低了
C 如果用椭圆面积表示spec的强度,那么该方法的椭圆面积增大了
D 该spec的实现方式更多了

正确答案:ACD

单选题 第6题 1分

这两个Spec的强度有何关系?
static int findOneOrMore,FirstIndex(int[] a, int val)

 requires: val occurs at least once in a
 effects: returns lowest index i such that a[i] = val

static int findCanBeMissing(int[] a, int val)

 requires: nothing
 effects: returns index i such that a[i] = val, or -1 if no such i

A 前者强于后者
B 前者弱于后者
C 二者相同
D Not compatible

正确答案:D

3.3 Abstract Data Type (ADT)

填空题 第1题 4分

WordList有四个方法,根据其方法定义来确定其类型

1. public WordList(List words)
2. public void unique()
3. public WordList getCapitalized()
4. public Map getFrequencies()

使用C、M、P、O分别表示Creator, Mutator, Producer, Observer

1 [填空1] 2 [填空2]
3 [填空3] 4 [填空4]

正确答案:
C;M;P;O

单选题 第2题 1分

以下关于ADT的RI和AF的说法,不正确的是___

A ADT的Abstract空间(A)中的某个值,在其Rep空间®中可能有多个值与其对应
B 若ADT的某个方法返回一个mutable的对象,并不一定表明该ADT产生了表示泄露
C 若ADT的任意costructor所构造出的object都满足RI、每个mutator方法执行结束后都保持RI为真,那么该ADT的RI就始终为真
D 一个immutable的ADT,其rep可以是mutable的

正确答案:C
答案解析:

针对B选项:通过defensive copy返回mutable对象,其实并未产生表示泄露

针对C选项:如果存在表示泄露,外部client就可以修改内部rep的值,就可能导致RI违反。

针对D选项:of course,只要没有rep exposure就没有问题。

多选题 第3题 2分

关于invariants、AF和RI,说法不正确的是__

A 如果一个immutable的ADT存在rep exposure,那么就违反了该ADT的invariants
B 如果在一个mutator方法内没有checkRep(),那么RI就可能被违反了
C 两个ADT有相同的rep和相同的AF,那么其RI一定相同
D 两个ADT有相同的rep和相同的RI,但可能AF不同

正确答案:C
答案解析:

针对A选项:immutability也是invariants的一部分,产生表示泄露就可能导致内部rep被修改,于是就不能保证immutable了,invariants就被违反了。

多选题 第4题 2分

用于检查ADT的Rep Invariants是否保持为真的checkRep()最好应该以下__类型的方法结束前调用。

A Mutator
B Creator
C Producer
D Observer

正确答案:ABCD
答案解析:

针对D选项:虽然observer方法不改变rep,但还是强烈建议return之前要checkRep()

多选题 第5题 2分
class C {
	private String s;
	private String t;
	...
}

它的可能的Rep Invariants会是__

A s contains only letters
B s.length() == t.length()
C s is the reverse of t
D s represents a set of characters

正确答案:ABC

多选题 第6题 2分

ADT的某个方法的spec需要以注释的形式放在代码中,在撰写这部分spec的时候,不能用到的信息包括__

A Parameters of operation
B Data type of return values of the operation
C Exceptions thrown by the operation
D Mathematical values in the Rep space ®
E Mathematical values in the Abstract space (A)

正确答案:D
答案解析:

Spec要给client看,那么所有内部的东西都不能用。R是rep的值空间,只能开发者自己了解。

多选题 第7题 2分

在对ADT的方法进行JUnit测试时,以下说法正确的是____

A 如果某方法的返回值为void,则无法为其撰写测试用例,因为无法assertEquals()
B 对constructor方法,测试用例中需要在构造新对象之后调用observer方法确认构造结果是否正确
C 对mutator方法,测试用例中需要在该方法执行之后调用producer方法确认是否做了正确的mutate
D 对observer方法,测试用例中需要使用其他三类方法构造一个对象,再执行该方法并判断结果是否正确

正确答案:BD

多选题 第8题 2分

以下说法不正确的是__

A 只要有public的field,就一定有表示泄露
B 只要有 非final的field,就一定产生表示泄露
C 除了初始化,Immutable的类中一定不能存在其他任何改变rep的方法
D checkRep()方法可能消耗大量计算,在程序投入实际运行的时候要注释掉

正确答案:BC
答案解析:

针对A选项:sure,所以迫不得已千万不要用public

针对B选项:final是来支持immutable的,与是否存在表示泄露无直接关系

针对C选项:可以有beneficent mutation

针对D选项:assert语句在投入真正运行的程序中是没有意义的,需要注释掉。当然,前提是开发者利用checkRep()已经发现了所有违反RI的bug并修复了。

多选题 第9题 3分

针对你设计的一个ADT,不应该提供给client看的内容包括__
A AF
B RI
C Rep exposure safety argument
D Spec
E Testing strategy
F Rep
G Implementation
H Test cases

正确答案:ABCEFGH

3.4 Object-Oriented Programming (OOP)

多选题 第1题 2分

关于staticfinal的说法,正确的是____

A 一个变量被声明为final,意味着它在被首次赋值之后,其内容就不能再变化
B static类型的方法,调用时无需创建类的实例对象,可直接通过类名使用
C 被声明为final类型的类,无法从中派生出子类
D 被声明为final类型的方法,无法在子类中被override
E 类A的static方法中不能直接调用A的instance方法(而是要new一个A的对象再调用);A的instance方法中可以直接调用A的static方法

正确答案:BCDE

多选题 第2题 2分

关于Java interface的说法,正确的是__

A 不能有static方法
B 不能有constructor(构造器)
C 不能有final方法
D 不能有private方法
E 不能有fields(属性)

正确答案:BCD
答案解析:

E选项:可以有属性的,都是public static final的。

多选题 第3题 2分

关于class和interface的说法,不正确的是____

A 一个接口可以extends一个或多个其他接口
B 一个类只能implements一个接口
C 一个类不能同时extends另一个类和implements一个接口
D 一个类implements了一个接口,意味着它必须要实现该接口中的所有方法
E 一个类除了实现其implements的接口中的方法,还可以增加新的方法

正确答案:BC

单选题 第4题 1分

某方法的定义是public int getLength (List list, boolean bFliter),以下___不是对该方法的合法重载

A private int getLength(List list, String regex)
B public Integer getLength(List list)
C public int getLength(List list) throws IOException
D public void getLength(List list, boolean bFliter)

正确答案:D

多选题 第5题 2分

关于Java OOPoverrideoverload的异同,以下说法不正确的是_____

A 前者的参数列表不能改变,后者的参数列表必须发生变化
B 前者的返回值类型不可变化,后者的返回值类型可以变化
C 前者抛出的异常可以变化,后者抛出的异常不能变化
D 前者的类型检查发生在run-time,后者的类型检查发生在compile-time
E 在子类里override父类方法时,方法前面必须使用@override;overload父类方法时,无需使用annotation

正确答案:CE
答案解析:

E选项:@override不是必需的,但是强烈建议使用,可以帮助开发者理解方法的“源头”

多选题 第6题 2分
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的是__

A

Car c = new Car();
c.refuel(10);

B

Car c = new Tesla();
c.refuel();

C

Car c = new Tesla();
c.refuel(10);

D

Tesla t = Tesla();
t.refuel(10);

正确答案:AC
答案解析:

Overload由static type checking负责

多选题 第7题 2分
class Car {
	public String refuel()
	{ return "R"; }
}
class Tesla extends Car {
	public String refuel() {return "C";}
	public String refuel(double price)
	{ return "P"; }
}

能获取内容为“C”的字符串是__

A

Car c = new Car();
c.refuel();

B

Car c = new Tesla();
c.refuel();

C

Car c = new Car();
((Tesla) c).refuel();

D

Tesla t = Tesla();
t.refuel();

正确答案:BD
答案解析:

Override在run-time做dynamic checking

单选题 第8题 1分

类A和B,B extends A,二者分别有一个apply(A a)方法,具有不同的返回值类型。
假如

A a = new A();
B b = new B();

那么以下正确的是__

A b.apply(a)((B) b).apply(a)不等价
B b.apply(a)((A) b).apply(a)不等价
C b.apply(a)((B) b).apply((B) a)不等价
D b.apply(a)((B) b).apply((A) a)不等价

正确答案:C
答案解析:

选项A:将b强转为(B)b,等于没转,b的类型本来就是B
选项D:也是类似的,两个强转都是没转

选项B:B是A的子类,所以b必然是A的实例,所以将b转成A(b),本质上还是等价的。

选项C:将a转(B) a,这个乡下强转做不到,该强转将会在运行时抛出异常ClassCastException。

单选题 第9题 1分

关于OOP polymorphism(多态)的各选项中,___不是同义词

A Ad hoc polymorphism 和 function overloading
B Parametric polymorphism 和 generics(泛型)
C Subtype polymorphism 和 inclusion polymorphism
D Generics和overriding

正确答案:D

3.5 Equality

填空题 第1题 3分

ADT的equals()需满足的三个性质是 [填空1] 性、[填空2] 性、 [填空3]

请填写中文

正确答案:
自反;对称;传递

多选题 第2题 2分

以下针对ADT等价性的说法,不正确的是____

A 如果对象a和b的R值被AF映射到相同的A值,则a和b等价
B 对对象a和b调用任何相同的方法,都会得到相同的返回值,则它们是等价的
C 对象a和b不等价,那么该ADT中不应存在任何方法op使得a.op()=b.op()
D 对象a和b是等价的,那么a和b的rep中每个field的值也一定是相等的

正确答案:CD
答案解析:

A选项是从AF的角度判断等价性。

B选项是从外部观察者的角度来判断等价性。

C选项:是可以存在这样的操作的。
即使这个操作返回相同的结果,该ADT还应有其他操作会让a和b执行后的结果不同。

填空题 第3题 2分

Java中有两种不同的操作来验证对象的等价性,分别为==和equals(),它们的“学名”是 [填空1] 等价性和 [填空2] 等价性。

请填写中文

正确答案:
引用;对象

单选题 第4题 1分

某个ADT的Rep是:

private int no;
private String name;

它的AF是:
AF(no) == ID of a student
那么以下equals()正确的是__

A return this.no == that.no
B return this.no == that.no && this.name == that.name
C return this.no == that.no && this.name.equals(that.name)
D return this.name.equals(that.name)

正确答案:A

填空题 第5题 2分

针对mutable的Java类,有两种等价性,分别为 [填空1] 等价性和 [填空2] 等价性。

请填写中文

正确答案:
观察;行为

单选题 第6题 1分

以下关于的等价性的说法,不正确的是____

A object类缺省的equals()是判断两个对象内存地址是否相等
B 若a和b满足a.equals(b)为真,那么a.hashCode() == b.hashCode()也应为真
Ca.equals(b)为假,那么a.hashCode() == b.hashCode()可以为真
D 针对mutable的类,由于其rep在变化,直接使用==判断是否相等即可,无需override equals()

正确答案:D
答案解析:

D选项:这要取决于实际需求。例如Java中List和Date等mutable的类,都override了equals()方法,实现观察等价性。

多选题 第7题 2分

关于hashCode()的说法,不正确的是__

B 具有相同hashCode()返回值的两个对象ab,必须做到a.equals(b)为真
ChashCode()始终返回同一个值,则违反了ObjecthashCode()的要求
D 如果不override hashCode()方法,Object类缺省实现也可以满足要求
E 一个对象实例的hashCode()返回值,在其生命周期内可以发生变化

正确答案:BCD
答案解析:

针对C选项:还是要看需求是什么,不能一概而论

针对D选项:mutable对象的hashCode在其mutator方法执行后,就会发生变化,因此在hash table中的位置也可能随之发生变化。

单选题 第8题 1分
Date d = new Date(2019,4,1);
Set hs = new HashSet<>();
Set ts = new TreeSet<>();
hs.add(d);
ts.add(d);

d.setYear(2020);

println(hs.contains(d));
println(ts.contains(d));

该代码执行之后会打印出____

A True; True
B True; False
C False; True
D False; False

正确答案:C
答案解析:

haahCode,顾名思义…

mutable对象的hashCode变化之后,只会影响受hashSet,不会影响TreeSet

单选题 第9题 1分
Date d = new Date(2019,4,1);
Date f = new Date(2019,4,1);

List al=new ArrayList<>();
List ll=new LinkedList<>();

al.add(d);
ll.add(f);

println(d.equals(f));
println(al.equals(ll));

该代码执行之后输出的是____

A True; True
B True; False
C False; True
D False; False

正确答案:A
答案解析:

Date是mutable的,它实现的是观察等价性,所以d和f两个值等价。

List也是mutable的,实现的也是观察等价性,所以判断其中每个元素的等价性,而d与f是等价的,故al和ll也是等价的。这个跟具体的类型(ArrayList和LinkedList)无关。

你可能感兴趣的:(软件构造)