我遇到了一个问题,我们需要使用方法重载来计算球体,圆柱体和圆锥体的体积。以下是我的代码,绝对没问题:
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',因为我们不允许明确地传递一些不是需要。但如果我不这样做,争论的数量就会重合。有没有办法解决这个问题,还是只是问题的问题?
答案 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):
这只剩下两种方法 - 一种用于球体,一种用于锥体和圆柱体:
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
传递基础半径。对于圆柱体,传递top
和bottom
的基础半径。
答案 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
...