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