Java方法重载期间重合的参数数

时间:2016-06-09 14:24:57

标签: java overloading

我遇到了一个问题,我们需要使用方法重载来计算球体,圆柱体和圆锥体的体积。以下是我的代码,绝对没问题:

import java.util.*;
class Vol_Sph_Cyl_Con
{
    void calc_volume(double sp_rd)
    {
        double volume=(4*3.14*(Math.pow(sp_rd,3)))/3;
        System.out.println("Volume of the sphere is "+volume+" cc");    
    }
    void calc_volume(double cyl_rd, double cyl_he)
    {
        double volume=3.14*(Math.pow(cyl_rd,2))*cyl_he;
        System.out.println("Volume of the cylinder is "+volume+" cc");
    }
    void calc_volume(double con_rd,double con_he,double pie)
    {
        double volume=(pie*(Math.pow(con_rd,2))*con_he)/2;
        System.out.println("Volume of the cone is "+volume+" cc");
    }
    public static void main(String args[])
    {
        Scanner sc=new Scanner(System.in);
        Vol_Sph_Cyl_Con ob=new Vol_Sph_Cyl_Con();
        double sp_rad=0.0;
        do 
        {
            System.out.println("Enter radius of sphere to calculate the volume (in centimetres)");
            sp_rad=sc.nextDouble();
            if (sp_rad<=0)
            {
                System.out.println("Error!");
            }
        }while (sp_rad<=0);
        ob.calc_volume(sp_rad);
        double cyl_rad=0.0, cyl_hei=0.0;
        do
        {
            System.out.println("Enter the radius and the height of cylinder respectively to calculate volume (in centimetres)");
            cyl_rad=sc.nextDouble();
            cyl_hei=sc.nextDouble();
            if (cyl_rad<=0 || cyl_hei<=0)
            {
                System.out.println("Error!");
            }
        }while (cyl_rad<=0 || cyl_hei<=0);
        ob.calc_volume(cyl_rad,cyl_hei);
        double con_rad=0.0, con_hei=0.0, pi=3.14;
        do
        {
            System.out.println("Enter radius and height of cone respectively to calculate volume (in centimetres)");
            con_rad=sc.nextDouble();
            con_hei=sc.nextDouble();
            if (con_rad<=0 || con_hei<=0)
            {
                System.out.println("Error!");
            }
        }while (con_rad<=0 || con_hei<=0);
        ob.calc_volume(con_rad,con_hei,pi);
      }
   }

程序绝对没问题,但问题是,因为这是针对学校项目的,我不能在计算锥的值的方法中传递参数'pie',因为我们不允许明确地传递一些不是需要。但如果我不这样做,争论的数量就会重合。有没有办法解决这个问题,还是只是问题的问题?

3 个答案:

答案 0 :(得分:4)

目前,您的参数是要计算体积的几何体的定义值。如果您有两个或更多个几何体共享相同的定义值类型,那么您将无法根据类型区分它们,因为它们是相同的。正如tobias_k所指出的那样。

您可以采取的措施是为代码中的每个几何体添加一个表示。然后可以将它们用作体积计算方法的单个参数。

因此,对于您的示例,您需要:球体,圆柱体和圆锥体类。

public class Sphere {
}

public class Cylinder {
}

public class Cone {
}

由于这是一个家庭作业,我们应该留给你思考如何设计这些课程。你的重载方法看起来像这样:

void calc_volume(Sphere sphere) {}
void calc_volume(Cylinder cylinder) {}
void calc_volume(Cone cone) {}

如您所见,使用此设计可以处理的几何对象数量没有进一步的限制。

答案 1 :(得分:2)

无法在两组参数上解析三个方法:如果要传递圆锥体和圆柱体的高度和半径,则必须更改其中一个方法的名称。 / p>

但是,您可以用不同的方式概括您的问题:不是有两个单独的方法来计算锥体和圆柱体积,而是使用一种方法来计算锥体frustum的体积,这可以被推广到圆柱体(顶部半径=底部半径)和圆锥体(顶部半径= 0):

enter image description here

这只剩下两种方法 - 一种用于球体,一种用于锥体和圆柱体:

void calc_volume(double top, double bottom, double height) {
    double v = Math.PI * height * (top*top + top*bottom + bottom*bottom) / 3;
     System.out.println("Volume is " + v + " cc");
}

当您调用此方法计算圆锥体的体积时,请为0传递top,为bottom传递基础半径。对于圆柱体,传递topbottom的基础半径。

答案 2 :(得分:0)

有些人在评论中提到在这种情况下使用方法重载非常难看。我个人同意这一点。

无论如何,你可以创建&#34;参数&#34;传递参数的类,这样一次只需要一个参数。

球体的例子:

public class SphereArguments {
    private double radius;

    /**
     * @param radius
     */
    public SphereArguments(double radius) {
        this.radius = radius;
    }

    /**
     * @return the radius
     */
    public double getRadius() {
        return radius;
    }
}

calc_volume将成为:

void calc_volume(SphereArguments arg)
{
    double volume=(4*Math.PI *(Math.pow(arg.getRadius(),3)))/3;
    System.out.println("Volume of the sphere is "+volume+" cc");    
}

和电话:

ob.calc_volume(new SphereArguments(sp_rad));

对于圆柱体和{ConeArguments&#39;当然,您将以CylinderArguments类的方式做同样的事情。圆锥类。

另请注意,Java名称按惯例位于CamelCase,因此calc_volume应成为calcVolume ...