Question:
How can code in one frame construct an object whose
constructor is declared in another frame? For example,
new
parent.SomeObject();
does not seem to work.
Why?
Answer:
Good question! As in C++, constructors in Java are not considered
methods. They don't return values, and the implicit "this" parameter
passed to a constructor is a pointer to the memory area allocated by the
call to new immediately preceding the constructor. Thus,
new Robot(x, y, z);
is roughly equivalent to the C code:
Robot *a;
a = malloc(sizeof(Robot));
Robot(a, x, y, z);
Assume the class
Robot
looks like this:
class Robot {
Robot(...) { ... } // Robot constructor
SomeObject(...) { ... } // your SomeObject "constructor"
// etc.
}
and here's your declaration of parent:
Robot parent = new Robot(...);
Unfortunately for you, Java regards
SomeObject
as an ordinary
Robot
method, not a constructor. Thus, the call
new parent.SomeObject(x, y, z);
would (if it worked at all) pass a pointer to parent as the implicit
parameter of
SomeObject
, not the space allocated by new:
SomeObject(parent, x, y, z);
This picture could become murky in the near future; I hear Sun is
considering nested classes in a future release of Java.