对象-问题与练习
问题
问题: 下面的程序有什么问题?
12345678public 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());}}问题: 以下代码创建了一个数组对象和字符串对象。当代码实行完毕后,有多少个指向那些对象的引用?是否两个对象都将会垃圾回收器回收?
123456...String[] students = new String[10];String studentName = "Peter Smith";students[0] = studentName;studentName = null;...问题: 程序是如何销毁一个它创建的对象的?
练习
练习: 修复
SomethingIsWrong
代码在问题1中的错误.练习: 已知以下类
NumberHolder
, 些以下代码创建一个该类的实例,初始化它的两个成员变量,然后显示每个成员变量的值。1234public class NumberHolder {public int anInt;public float aFloat;}
答案
问题答案
问题: 下面的程序有什么问题?
12345678public 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
运行时异常.问题: 以下代码创建了一个数组对象和字符串对象。当代码实行完毕后,有多少个指向那些对象的引用?是否两个对象都将会垃圾回收器回收?
123456...String[] students = new String[10];String studentName = "Peter Smith";students[0] = studentName;studentName = null;...答案: 有一个指向
students
数组的引用,并且数组里有一个指向字符串Peter Smith
的引用.两个对象都不会被垃圾回收器回收 .数组students
有一个指向studentName
的引用所以不会被回收,尽管studentName
已经被赋值为null
.studentName
对象也不会被回收因为students[0]
仍然在引用它。.问题: 程序是如何销毁一个它创建的对象的?
答案: 程序并没有显示的销毁一个对象。程序可以设置所有执行一个对象的引用为
null
,这样这个对象就符合被垃圾会少的条件。但是程序并没有销毁对象。
练习答案
练习: 修复
SomethingIsWrong
代码在问题1中的错误.Answer: 参考
SomethingIsRight
:12345678public 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
, 些以下代码创建一个该类的实例,初始化它的两个成员变量,然后显示每个成员变量的值。1234public class NumberHolder {public int anInt;public float aFloat;}答案: 参考
NumberHolderDisplay
:123456789public 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);}}