TheMuffinMan
TheMuffinMan

Reputation: 55

Program print keeps print 0.0 for Cylinder area, volume, range + inheritance java

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

Upvotes: 0

Views: 225

Answers (2)

jace
jace

Reputation: 1674

It's because you only instantiate the object and entered to constructor but not in the other method.

    Cylinder Cylinder1 = new Cylinder(30, 10);
    Cone Cone1 = new Cone(10, 20);
    RoundShape RoundShape1 = new RoundShape(50);

no one called in these methods

    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;
    }

and the rest methods. Call them from constructor or from main if you want to calculate through method like:

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);

    double roundArea = RoundShape1.calcArea();//then use this
    string roundMessage = RoundShape1.toString();//and this whatever you want.

    //do it in others too

    //print for objects
    System.out.println(Cylinder1);
    System.out.println(RoundShape1);
    System.out.println(Cone1);
}

Upvotes: 0

Hovercraft Full Of Eels
Hovercraft Full Of Eels

Reputation: 285405

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() + ".";
    }
}

Upvotes: 4

Related Questions