计算各种形状面积的重载静态方法,重复方法警告

我正在阅读从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."


陪伴而非守候
浏览 131回答 4
4回答

慕桂英4014372

这两种方法:被称为“区域”取两个类型为“double”的参数所以他们是无法区分的。您为正式参数选择的名称不会影响决策,因为(从琐碎的“因为这就是语言的工作方式”开始)这些名称在调用 area() 时不会写在源代码中。给定问题陈述,您别无选择,只能将至少一个参数的类型更改为两个重载之一。是否允许整数大小?Float/Double让我有点紧张:这太容易犯错误了。我知道这是在Java中重载方法的练习,所以你必须遵循问题陈述。然而,作为一个普遍的问题:给定一个名为Area的类和一堆静态面积计算器,IMO命名每个这样的面积计算方法来说明它到底做了什么确实更容易理解。例如和.根据参数的类型进行不同的计算似乎一目了然地无法理解好名称的方式。areaOfCircleareaOfRectangle

冉冉说

圆的面积可以更改为半径作为双精度,pi 作为浮点数。这样,编译器将识别圆圈方法的差异。本课的想法是,只要您更改方法中的参数,就可以拥有多个同名的方法,这就是重载方法的意义所在。

jeck猫

你可以做这样的东西: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' methodArea.calculateArea(2.0, 3); // Call 'Cylinder' methodArea.calculateArea(3, 5); // Call 'Rectangle' method

精慕HU

这是一个人为的答案,它满足了3个重载“区域”方法的要求,而不必在我们可能更喜欢双精度的情况下使用浮点数或int。首先是区域类。对于每个形状,我们需要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));像“圆圆(...)”这样的函数{ ... }"存在,所以我不必写“新”来创建一个圆圈,等等。很丑吧?注意:圆柱体“面积”的公式实际上是计算体积。3D实体的面积到底是什么意思?如果你指的是表面积,那么它是两个末端圆圈加上环绕的矩形,形成“侧面”。前者的每个区域都有区域“pi r^2”;矩形有边'2 pi r'和'h',因此面积'2 pi r h'。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java