【问题标题】:Overloaded static methods that calculate the area of various shapes, duplicate method warning重载计算各种形状面积的静态方法,重复方法警告
【发布时间】:2019-03-26 22:24:26
【问题描述】:

我正在阅读从 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(2.0, 2.0) 2 编译器应该推断出哪个方法?所以它不会成功。
  • 不,您不能重载具有相同参数的方法。您可以创建area(double w, double l)area(float r, float h),但在使用这些方法传递正确的数据时必须非常细心/小心。
  • 为什么投反对票?对我来说,这似乎是一个合理的问题。 练习 似乎有点人为(请参阅我的回答中关于命名的评论),但面对这个练习,这个问题看起来很合理。

标签: java static static-methods


【解决方案1】:

这两种方法:

  • 被称为“区域”
  • 接受两个“double”类型的参数

所以它们是无法区分的。您为形式参数选择的名称不会影响决策,因为(从微不足道的“因为这就是语言的工作原理”)这些名称并未在调用 area() 时写入源代码中制作。

鉴于问题陈述,您别无选择,只能将至少一个参数的类型更改为两个重载之一。是否允许整数大小? float/double 让我有点紧张:太容易出错了。


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

但是,作为一个普遍问题:给定一个名为 Area 的类,其中包含一堆静态面积计算器,IMO 将每个这样的面积计算方法命名以说明它的实际作用确实更容易理解。例如areaOfCircleareaOfRectangle。根据参数的类型进行不同的计算似乎并不像好名字那样一目了然。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以做这样的事情:

      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
      

      【讨论】:

        【解决方案4】:

        这是一个人为的答案,它满足 3 个重载“区域”方法的要求,而不必在我们可能更喜欢双精度的地方使用浮点或整数。

        首先是 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'。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-31
          • 1970-01-01
          相关资源
          最近更新 更多