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

问题描述 投票:0回答:4

我正在阅读从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."我知道,如果我只是改变其中一个参数的类型我不会有这个问题,但这是唯一可以做到的方法吗?我不能有两个重载具有相同参数列表的静态方法?

java static static-methods
4个回答
3
投票

这两种方法都是:

  • 被称为'区域'
  • 取两个类型'double'的参数

所以它们难以区分。您为正式参数选择的名称不会影响决策,因为(来自简单的“因为这就是语言的工作方式”)这些名称不会在调用area()的位置写入源代码中制作。

鉴于问题陈述,你几乎没有选择,只能将至少一个参数的类型改为两个重载中的一个。是否允许整数大小?浮动/双重让我有点紧张:犯错误太容易了。


我知道这是在Java中重载方法的练习,所以你必须遵循问题陈述。

然而,作为一个普遍的问题:给定一个名为Area的类,其中包含一堆静态区域计算器,IMO将每个这样的区域计算方法命名为它确实更能理解。所以例如areaOfCircleareaOfRectangle。根据参数的类型进行不同的计算似乎无法理解好名称的方式。


1
投票

圆的面积可以更改为半径为double,pi为float。这样编译器就会识别圆圈方法的差异。本课程的想法是,只要更改方法中的参数,就可以使用多个同名方法,这是重载方法的重点。


0
投票

你可以做这样的事情:

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

0
投票

这是一个设计的答案,满足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'。

© www.soinside.com 2019 - 2024. All rights reserved.