文档

Java™教程
路径:学习Java语言
课程:类和对象
首页 > 学习Java语言 > 类和对象

问题和练习的答案:对象

问题

  1. 问题: 下面的程序有什么问题?

    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

  2. 问题: 以下代码创建了一个数组和一个字符串对象。执行代码后,这两个对象有多少个引用存在?其中任何一个对象是否符合垃圾回收的条件?

    ...
    String[] students = new String[10];
    String studentName = "Peter Smith";
    students[0] = studentName;
    studentName = null;
    ...
    

    答案: 数组students有一个引用,并且该数组有一个引用指向字符串Peter Smith。这两个对象都不符合垃圾回收的条件。数组students不符合垃圾回收的条件,因为它有一个引用指向对象studentName,即使该对象已经被赋值为null。对象studentName也不符合条件,因为students[0]仍然指向它。

  3. 问题: 程序如何销毁它创建的对象?

    答案: 程序不会显式地销毁对象。程序可以将所有引用设置为null,以使其符合垃圾回收的条件。但是程序实际上并不销毁对象。

练习题

  1. 练习:修复名为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());
        }
    }
    
  2. 练习:给定以下名为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);
        }
    }
    

上一页:问题和练习:对象