问题和练习的答案:对象

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);
    }
}