我正在阅读从Java开始,本书中提出的挑战是:“编写一个具有三个重载静态方法的类,用于计算以下几何形状的区域:圆形,矩形和圆柱形。”圆的区域只需要一个参数,这里没有问题,所以我把这个方法留了下来。但矩形区域和圆柱区域都需要两个参数:
public class Area{
public static double area(double w, double l)
{
//Area of rectangle
return l*w;
}
public static double area(double r, double h)
{
//Area of a cylinder
return Math.PI * (r*r) *h;
}
}
使用上面的代码我收到警告“duplicate method area(double, double) in type Area."
我知道,如果我只是改变其中一个参数的类型我不会有这个问题,但这是唯一可以做到的方法吗?我不能有两个重载具有相同参数列表的静态方法?
这两种方法都是:
所以它们难以区分。您为正式参数选择的名称不会影响决策,因为(来自简单的“因为这就是语言的工作方式”)这些名称不会在调用area()的位置写入源代码中制作。
鉴于问题陈述,你几乎没有选择,只能将至少一个参数的类型改为两个重载中的一个。是否允许整数大小?浮动/双重让我有点紧张:犯错误太容易了。
我知道这是在Java中重载方法的练习,所以你必须遵循问题陈述。
然而,作为一个普遍的问题:给定一个名为Area的类,其中包含一堆静态区域计算器,IMO将每个这样的区域计算方法命名为它确实更能理解。所以例如areaOfCircle
和areaOfRectangle
。根据参数的类型进行不同的计算似乎无法理解好名称的方式。
圆的面积可以更改为半径为double,pi为float。这样编译器就会识别圆圈方法的差异。本课程的想法是,只要更改方法中的参数,就可以使用多个同名方法,这是重载方法的重点。
你可以做这样的事情:
public class Area {
// Rectangle
public static double calculateArea(int width, int length) {
return width * length;
}
// Cylinder
public static double calculateArea(double radius, int height) {
return Math.PI * Math.pow(radius, 2) * height;
}
// Circle
public static double calculateArea(double radius) {
return Math.PI * Math.pow(radius, 2);
}
}
然后使用以下方法调用它:
Area.calculateArea(2.0); // Call 'Circle' method
Area.calculateArea(2.0, 3); // Call 'Cylinder' method
Area.calculateArea(3, 5); // Call 'Rectangle' method
这是一个设计的答案,满足3个重载'area'方法的要求,而不必使用float或int,我们可能更喜欢double。
首先是Area类。对于每个形状,我们需要3个东西:一个(内部)类,它包含定义形状的值;提供该类对象的函数;和(关键)一个接受单个参数的area()方法,一个内部类的对象。这是满足“重载方法”要求的最后一项。
class Area {
static class Circle {
double radius;
Circle(double r) { radius = r; }
}
static Circle circle(double r) {
return new Circle(r);
}
static double area(Circle c) {
return PI * c.radius * c.radius;
}
static class Rectangle {
double length, width;
Rectangle(double l, double w) { length = l; width = w; }
}
static Rectangle rectangle(double l, double w) {
return new Rectangle(l, w);
}
static double area(Rectangle r) {
return r.length * r.width;
}
static class Cylinder {
double radius, height;
Cylinder(double r, double h) { radius = r; height = h }
}
static Cylinder cylinder(douvle r, double h) {
return new Cylinder(r, h);
}
static double area(Cylinder c) {
return 2 * PI * c.radius * c.height + // side
PI * c.radius * c.radius * 2; // ends
// see note!
}
]
现在,如何使用它们?这些示例显示了如何:
a1 = Area.area(Area.circle(1));
a2 = Area.area(Area.rectangle(2,3));
a3 = Area.area(Area.cylinder(4,5));
像“Circle circle(...){...}”这样的函数存在,所以我不必编写“new”来创建Circle等。
很难看,是吧?
注意:圆柱体“面积”的公式实际上是计算体积。 3-D固体的面积究竟是什么意思?如果你的意思是表面区域,那么它是两个末端圆圈加上包围的矩形,它构成了“侧面”。每个前者都有区域'pi r ^ 2';矩形的边有'2 pi r'和'h',因此区域为'2 pi r h'。