Question: What's wrong with the following program?
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()); } }
Answer: The code never creates a
Rectangle
object.
With this simple program, the compiler generates an error.
However, in a more realistic situation,
myRect
might be initialized to null
in one place,
say in a constructor,
and used later.
In that case, the program will compile just fine,
but will generate a NullPointerException
at runtime.
Question: The following code creates one array and one string object. How many references to those objects exist after the code executes? Is either object eligible for garbage collection?
... String[] students = new String[10]; String studentName = "Peter Smith"; students[0] = studentName; studentName = null; ...
Answer: There is one reference to the students
array and that array
has one reference to the string Peter Smith
.
Neither object is eligible for garbage collection.
Question: How does a program destroy an object that it creates?
Answer: A program does not explicitly destroy objects.
A program can set all references to an object to null
so that it becomes eligible for garbage collection.
But the program does not actually destroy objects.
Exercise: Fix the program called SomethingIsWrong
shown in Question 1.
Answer: See
SomethingIsRight
:
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()); } }
Exercise: Given the following class,
called
NumberHolder
, write some code that creates an instance of the class,
initializes its two member variables,
and then displays the value of each member variable.
public class NumberHolder { public int anInt; public float aFloat; }
Answer: See
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); } }