问题和练习的答案:对象
Questions
- 问题 :以下程序有什么问题?
public class SomethingIsWrong {
public static void main(String[] args) {
Rectangle myRect;
myRect.width = 40;
myRect.height = 50;
System.out.println("myRect's area is " + myRect.area());
}
}
答案 :代码从不创建Rectangle对象。使用此简单程序,编译器会生成错误。但是,在更现实的情况下,myRect
可能会在一处(例如在构造函数中)初始化为null
,然后再使用。在这种情况下,程序将编译得很好,但是会在运行时生成NullPointerException
。
- 问题 :以下代码创建一个数组和一个字符串 对象。代码执行后,存在多少对这些对象的引用?这两个对象都可以进行垃圾收集吗?
...
String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
studentName = null;
...
答案 :对students
数组有一个引用,而该数组有对字符串Peter Smith
的引用。这两个对象都没有资格进行垃圾回收。数组students
不具有垃圾回收的资格,因为它对对象studentName
具有一个引用,即使该对象已被赋值为null
。对象studentName
不符合条件,因为students[0]
仍引用该对象。
- 问题 :程序如何销毁它创建的对象?
答案 :程序不会显式销毁对象。程序可以将对对象的所有引用都设置为null
,以使其有资格进行垃圾回收。但是该程序实际上并没有销毁对象。
Exercises
- 锻炼 :修复问题 1 中显示的名为
SomethingIsWrong
的程序。
答案 :请参见SomethingIsRight:
public class SomethingIsRight {
public static void main(String[] args) {
Rectangle myRect = new Rectangle();
myRect.width = 40;
myRect.height = 50;
System.out.println("myRect's area is " + myRect.area());
}
}
- 练习 :给定以下名为NumberHolder的类,编写一些代码来创建该类的实例,初始化其两个成员变量,然后显示每个成员变量的值。
public class NumberHolder {
public int anInt;
public float aFloat;
}
答案 :请参见NumberHolderDisplay:
public class NumberHolderDisplay {
public static void main(String[] args) {
NumberHolder aNumberHolder = new NumberHolder();
aNumberHolder.anInt = 1;
aNumberHolder.aFloat = 2.3f;
System.out.println(aNumberHolder.anInt);
System.out.println(aNumberHolder.aFloat);
}
}