|
Unfortunately... this only works when we access the member variable(s)...
This solution will only work when all instance variables in the class are public:
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;
}
}
|
Instance variables in classes are often private because we want data field encapsulation (discussed later):
public class Circle
{
private 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;
}
}
|
DEMO: demo/03-classes/11-copy ---- compile error...
What is the solution ???
The "copy" constructor is a constructor that has a object variable of the classname as parameter:
public class Circle { private 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 Circle(Circle c) /** Constructor 3: copies Circle c */ { radius = ????????; // What should we do here ? } public double getArea() /** Return the area of this circle */ .. public void setRadius(double newRadius) /** Set new radius for this circle */ .. } |
The "copy" constructor will copy all the instance variables from its input parameter to the new object... how ??
To copy the instance variables, use assignment:
public class Circle { private 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 Circle(Circle c) /** Constructor 3: copies circle c */ { radius = c.radius; // Copies c.radius to radius of new Circle object } public double getArea() /** Return the area of this circle */ .. public void setRadius(double newRadius) /** Set new radius for this circle */ .. } |
DEMO: demo/03-classes/11-copy
Before: (fails when radius is private) public static void main(String[] args) { Circle circle1 = new Circle(4); // Make a copy of circle1 Circle circle2 = new Circle(); circle2.radius = circle1.radius; // Fail due to private access } |
DEMO: demo/03-classes/11-copy