|
Consider the instance methods in the Circle class definition again:
public class Circle { public double radius = 1; /** The radius of this circle */ public Circle() { } /** Constructor 1 for a circle object */ public Circle(double newRadius) /** Constructor 2 for a circle object */ { radius = newRadius; // Member radius not accessed with a ref. var ?? } public double getArea() /** Return the area of this circle */ { return 3.14159 * radius * radius; } public void setRadius(double newRadius) /** Set new radius for this circle */ { radius = newRadius; } } |
We access the member variable radius without using any reference variable !!! How is this possible ???
Here is the dirty little secret about Java's instance methods:
|
When we define a class as follows:
public class Circle { public double radius = 1; /** The radius of this circle */ public Circle() { } /** Constructor 1 for a circle object */ public Circle(double newRadius) /** Constructor 2 for a circle object */ { radius = newRadius; } public double getArea() /** Return the area of this circle */ { return 3.14159 * radius * radius; } public void setRadius(double newRadius) /** Set new radius for this circle */ { radius = newRadius; } } |
The Java compiler will secretly insert the implicit parameter this in every instance method (and constructor):
public class Circle { public double radius = 1; /** The radius of this circle */ public Circle(Circle this) { } public Circle(Circle this, double newRadius) { radius = newRadius; } public double getArea(Circle this) { return 3.14159 * radius * radius; } public void setRadius(Circle this, double newRadius) { radius = newRadius; } } |
The parameter this is equal to the reference variable used to access the object (E.g.: circle1.getArea())
The Java compiler will also insert this. to every member access in an instance method (and constructor):
public class Circle { public double radius = 1; /** The radius of this circle */ public Circle() { } /** Constructor 1 for a circle object */ public Circle(double newRadius) /** Constructor 2 for a circle object */ { this.radius = newRadius; } public double getArea() /** Return the area of this circle */ { return 3.14159 * this.radius * this.radius; } public void setRadius(double newRadius) /** Set new radius for this circle */ { this.radius = newRadius; } } |
We can add the
this variable
ourselves (if you wish)
DEMO:
03-classes/08-this/Circle.java
(proof
that the parameter variable
this
exists !)
Example to illustrate the passing of the implicit parameter:
|
Example to illustrate the passing of the implicit parameter:
|
|
DEMO: 03-classes/09-this/Circle.java
|
|
|