Java语言程序设计第十版第13章复习题答案
13.1 下列哪个类别定义了法律抽象类别?
**(a)class A {
abstract void unfinished() {
}
}
(b)public class abstract A {
abstract void unfinished();
}
© public class abstract A {
abstract void unfinished();
}
(d)abstract class A {
protected void unfinished();
}
(e)abstract class A {
abstract void unfinished();
}
(f)abstract class A {
abstract int unfinished();
}
e and f**
13.2 可以从GeometricObject类中删除getArea()和getPerimeter()方法。在GeometricObject类中将getArea()和getPerimeter()定义为抽象方法有什么好处?
好处是通用编程。GeometricObject类型的变量可以在编译时使用getArea和getPerimeter方法。
13.3对 还是错?
a.除了不能使用new运算符从抽象类创建实例之外,可以像非抽象类一样使用抽象类。
b.可以扩展抽象类。
c.非抽象超类的子类不能是抽象的。
d.子类无法覆盖超类中的具体方法来将其定义为抽象。
e.抽象方法必须是非静态的。
a. True
b. True
c. False
d. False
e. True
13.4 为什么以下两行代码会编译却导致运行时错误?
Number numberRef = new Integer(0);
Double doubleRef = (Double)numberRef;
在运行时,JVM尝试将numberRef转换为Double对象,但是numberRef是Integer的实例,而不是Double。
13.5 为什么以下两行代码会编译却导致运行时错误?
Number[] numberArray = new Integer[2];
numberArray[0] = new Double(1.5);
numberArray [0]是整数类型。在运行时将出现转换错误。
**13.6 显示以下代码的输出。
public class Test {
public static void main(String[] args) {
Number x = 3;
System.out.println(x.intValue());
System.out.println(x.doubleValue());
}
}
3
3.0
13.7 以下代码有什么问题?(请注意,在10.7节中介绍了Integer和Double类的compareTo方法。)
public class Test {
public static void main(String[] args) {
Number x = new Integer(3);
System.out.println(x.intValue());
System.out.println(x.compareTo(new Integer(4)));
}
}
该程序存在语法错误,因为x不具有compareTo方法。
13.8 以下代码有什么问题?
public class Test {
public static void main(String[] args) {
Number x = new Integer(3);
System.out.println(x.intValue());
System.out.println((Integer)x.compareTo(new Integer(4)));
}
}
该程序存在语法错误,因为在强制转换运算符之前执行了成员访问运算符.
13.9 可以使用Calendar类创建Calendar对象吗?
否。日历是一个抽象类。
13.10 Calendar类中的哪个方法是抽象方法?
Calendar类中的add方法是抽象的。
13.11 如何创建当前时间的Calendar对象?
使用GregorianCalendar类的构造函数,可以创建Calendar的实例。
13.12 对于Calendar对象c,如何获得其年,月,日,时,分和秒?
c.get(Calendar.YEAR)
c.get(Calendar.MONTH)
c.get(Calendar.DAY_ON_MONTH)
c.get(Calendar.HOUR)
c.get(Calendar.MINUTE)
c.get(Calendar.SECOND)
13.13 假设A是一个接口。您可以使用新的A()创建实例吗?
不可以
13.14 假设A是一个接口。您可以像这样声明类型A的引用变量x吗?
可以。
13.15 以下哪个是正确的接口?
(a)
interface A {
void print() { }
}
(b)
abstract interface A extends I1, I2 {
abstract void print() { }
}
(c)
abstract interface A {
print();
}
(d)
interface A {
void print();
}
(e)
interface A {
default void print() {
}
}
(f)
interface A {
static int get() {
return 0;
}
d
13.16 在以下代码中显示错误:
interface A {
void m1();
}
class B implements A {
void m1() {
System.out.println("m1");
}
}
接口中定义的所有方法都是公共的。当类实现接口时,必须将方法声明为public。能见度不能降低。
13.17对 还是错?如果一个类实现Comparable,则该类的对象可以调用compareTo方法。
True
13.18 以下哪项是String类中compareTo方法的正确方法标头?
public int compareTo(String o)
public int compareTo(Object o)
第一个是正确的。
13.19是否 可以编译以下代码?为什么?
Integer n1 = new Integer(3);
Object n2 = new Integer(4);
System.out.println(n1.compareTo(n2));
n1是一个Integer对象,其compareTo方法需要一个Integer参数,但是n2被声明为Object。编译器将引发错误。
13.20 您可以在一个类中定义compareTo方法,而无需实现Comparable接口。实施Comparable接口有什么好处?
通过实现Comparable接口,可以将类的对象传递给需要Comparable类型的方法。
13.21 以下代码有什么问题?
public class Test {
public static void main(String[] args) {
Person[] persons = {new Person(3), new Person(4), new Person(1)};
java.util.Arrays.sort(persons);
}
}
class Person {
private int id;
Person(int id) {
this.id = id;
}
}
答:Person类未实现Comparable接口,无法使用compareTo方法比较两个人员。
13.22 如果对象的类未实现java.lang.Cloneable,则可以调用clone()方法来克隆对象吗?Date类是否实现Cloneable?
否。是的,Date类实现Cloneable。
13.23 如果House类
如果CloneableCircle类未覆盖clone()方法,则该程序将收到语法错误,因为clone()受java.lang.Object保护。如果CloneableCircle在第31行中未实现java.lang.Cloneable,则该程序则该程序将收到运行时错误,因为在第7行中c2为null。
13.24 显示以下代码的输出:
java.util.Date date = new java.util.Date();
java.util.Date date1 = date;
java.util.Date date2 = (java.util.Date)(date.clone());
System.out.println(date == date1);
System.out.println(date == date2);
System.out.println(date.equals(date2));
true
false
true
13.25 显示以下代码的输出:
ArrayList list = new ArrayList<>();
list.add(“New York”);
ArrayList list1 = list;
ArrayList list2 = (ArrayList)(list.clone());
list.add(“Atlanta”);
System.out.println(list == list1);
System.out.println(list == list2);
System.out.println("list is " + list);
System.out.println("list1 is " + list1);
System.out.println("list2.get(0) is " + list2.get(0));
System.out.println("list2.size() is " + list2.size());
true
false
list is [New York, Atlanta]
list1 is [New York, Atlanta]
list2.get(0) is New York
list2.size() is 1
13.26 以下代码有什么问题?
public class Test {
public static void main(String[] args) {
GeometricObject x = new Circle(3);
GeometricObject y = x.clone();
System.out.println(x == y);
}
}
报告语法错误,因为clone()受对象保护。要启用克隆,请做两件事:(1)在类中为要克隆的对象重写clone();(2)为该类实现java.lang.Cloneable。
13.27 举一个例子说明为什么接口比抽象类更受青睐。
参照原文
13.28 定义术语抽象类和接口。抽象类和接口之间有何异同?
参照原文
13.29 对 还是错?
a.接口被编译成单独的字节码文件。
b.接口可以具有静态方法。
c.一个接口可以扩展一个或多个接口。
d.接口可以扩展抽象类。
e.抽象类可以扩展接口。
a. True
b. False
c. True
d. False
e. True
13.30 显示以下代码的输出?
Rational r1 = new Rational(-2, 6);
System.out.println(r1.getNumerator());
System.out.println(r1.getDenominator());
System.out.println(r1.intValue());
System.out.println(r1.doubleValue());
-1
3
0
0.333333333333
13.31 为什么以下代码错误?
Rational r1 = new Rational(-2, 6);
Object r2 = new Rational(1, 45);
System.out.println(r2.compareTo(r1));
对象类型r2没有compareTo方法。
13.32 为什么以下代码错误?
Object r1 = new Rational(-2, 6);
Rational r2 = new Rational(1, 45);
System.out.println(r2.compareTo(r1));
compareTo(Rational)方法在Rational类的参数中需要一个Rational类型对象。
13.33 如何使用一行代码而不使用if语句来简化清单13.13中的82.85行中的代码?
return (this.subtract((Rational)(other))).getNumerator() == 0;
13.34 仔细跟踪程序,并显示以下代码的输出。
Rational r1 = new Rational(1, 2);
Rational r2 = new Rational(1, -2);
System.out.println(r1.add(r2));
0/4
13.35 描述班级设计准则。
参照原文。