# 对象-问题和练习
# 问题
以下程序出了问题?
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()); } }
1
2
3
4
5
6
7
8以下代码创建一个数组和一个字符串对象。代码执行后,对这些对象有多少个引用?垃圾收集是否有资格回收?
... String[] students = new String[10]; String studentName = "Peter Parker"; students[0] = studentName; studentName = null; ...
1
2
3
4
5
6程序如何销毁它创建的对象?
# 练习
修复 问题 1 中的程序
给定下面的类,调用 NumberHolder,编写一些创建类的实例代码,初始化其两个成员变量,然后显示每个成员变量的值
public class NumberHolder { public int anInt; public float aFloat; }
1
2
3
4
# 问题 - 答案
第一题
编译器会产生一个错误,局部代码块中的变量必须要先初始化才能使用。
第二题
students 对数组有一个引用,数组元素 0 对字符串有一个引用。两个对象都没有资格被回收,即便 studentName 被赋值成了 null。但是字符串还被数组元素 0 持有。
程序没有明确的销毁对象的能力。但是可以设置对象的所有引用为 null,以便符合垃圾回收的条件。
# 练习 - 答案
第一题
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()); } }
1
2
3
4
5
6
7
8第2题
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); } }
1
2
3
4
5
6
7
8
9