Java教程是为JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
有关Java SE 9和后续版本中更新的语言特性的摘要,请参见Java语言变更。
有关所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息,请参见JDK发行说明。
问题: 下面的程序有什么问题?
public class SomethingIsWrong {
public static void main(String[] args) {
Rectangle myRect;
myRect.width = 40;
myRect.height = 50;
System.out.println("myRect的面积是 " + 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,以使其符合垃圾回收的条件。但是程序实际上并不销毁对象。
练习:修复名为SomethingIsWrong的程序,参见问题1。
答案:请参见SomethingIsRight:
public class SomethingIsRight {
public static void main(String[] args) {
Rectangle myRect = new Rectangle();
myRect.width = 40;
myRect.height = 50;
System.out.println("myRect的面积是" + 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);
}
}