TheMuffinMan - 10 months ago 61

Java Question

I have tried this a couple of different ways. It is required I use the inheritance to extend these classes. Every time I run the program it just out puts 0.0 for volume and area. Radius displays correctly. Output at the bottom.

`public class Base_HW04Q1`

{

public double pi = 3.14, l, radius, height, area, volume;

public static class RoundShape extends Base_HW04Q1 {

public RoundShape(double radius) {

this.radius = radius;

}

public double calcArea () {

area = (radius * radius) * pi;

return area;

}

public String toString() {

return "A Round Shape of radius: " + radius + ", area " + area + ".";

}

}

public static class Cylinder extends Base_HW04Q1

{

public Cylinder(double radius, double height) {

this.radius = radius;

this.height = height;

}

public double calcArea() {

l = Math.sqrt((radius * radius) + (height * height));

area = 2 * pi * radius * height + 2 * pi * l;

return area;

}

public double calcVolume() {

volume = pi * (radius * radius) * height;

return volume;

}

public String toString() {

return "A Cylinder of radius: " + radius + ", area " + area + " and a volume of " + volume;

}

}

public static class Cone extends Base_HW04Q1 //TODO: This line is almost, but not quite, complete.

{

public Cone(double radius, double height) {

this.radius = radius;

this.height = height;

}

public double calcArea() {

l = Math.sqrt((radius * radius) + (height * height));

area = (pi * radius * l) + (pi * radius * radius);

return area;

}

public double calcVolume() {

volume = 0.333 * pi * radius * radius * height;

return volume;

}

public String toString() {

return "A Cone of radius: " + radius + ", area " + area + " and a volume of " + volume;

}

}

public static void main(String[] args)

{

//object creation

Cylinder Cylinder1 = new Cylinder(30, 10);

Cone Cone1 = new Cone(10, 20);

RoundShape RoundShape1 = new RoundShape(50);

//print for objects

System.out.println(Cylinder1);

System.out.println(RoundShape1);

System.out.println(Cone1);

}

}

Output:

A Cylinder of radius: 30.0, area 0.0 and a volume of 0.0 A Round Shape

of radius: 50.0, area 0.0. A Cone of radius: 10.0, area 0.0 and a

volume of 0.0

Answer Source

Your `toString()`

never calls the methods that do the calculations and instead prints the default 0.0 field values. You will run this risk if `toString()`

is ever called before the `calcXxxx()`

methods are called, i.e., before the calculated fields have been given a decent value. The best solution is to prevent this problem from happening in the first place by entirely getting rid of fields for calculated values, for instance area and volume. Instead within toString(), call the methods to get these values.

e.g.,

```
public double pi = 3.14, l, radius, height; // , area, volume;
public static class RoundShape extends Base_HW04Q1 {
public RoundShape(double radius) {
this.radius = radius;
}
public double calcArea () {
return (radius * radius) * pi;
// return area;
}
public String toString() {
return "A Round Shape of radius: " + radius + ", area " + calcArea() + ".";
}
}
```