在方法重载中传递不同数据类型的值

时间:2018-07-03 08:35:19

标签: java overloading

我将一个双精度值传递给正在重载的方法,但它将其视为float并调用该方法以查找平方面积。浮点值的末尾应带有“ f”,才算是浮点值?那么为什么我的程序在应该调用“圆形区域”时为什么调用浮动“方形区域”呢?

public class App {
    public void calArea(float a) {
        System.out.println("Area of square is Side x Side : " + a * a);
    }

    public void calArea(float a, float b) {
        System.out.println("Area of rectangle is length x width" + a * b);
    }

    public void calArea(double r) {
        double area = (Math.PI * r * r);
        System.out.println("Area of circle is Radius x Radius x PI : " + area);
    }

    public static void main(String[] args) {

        App app = new App();

        app.calArea(5);
    }

}

5 个答案:

答案 0 :(得分:4)

我只是发表评论作为答案,因为这是解决您的问题而无需强制转换的唯一方法。

不要使用doublefloat来区分应计算的面积。只是使用不同的名称。看到您的代码时,这将消除很多麻烦。

  

app.calArea(5)将计算圆形或正方形的面积吗?

所以只需将代码更改为此:

public class App {
    public void calAreaSquare(double a) {
        System.out.println("Area of square is Side x Side : " + a * a);
    }

    public void calAreaRectangle(double a, double b) {
        System.out.println("Area of rectangle is length x width" + a * b);
    }

    public void calAreaCircle(double r) {
        double area = (Math.PI * r * r);
        System.out.println("Area of circle is Radius x Radius x PI : " + area);
    }

    public static void main(String[] args) {

        App app = new App();

        app.calAreaCircle(5);
    }
}

我还建议仅使用double,以提高精度。

答案 1 :(得分:2)

调用“圆形区域”方法的最简单方法是从主方法中调用“ app.calArea(5d); ”。通过写入5d或5.0d面积的圆将被调用,因为值5d被视为两倍。如果您要调用“正方形区域”方法,则可以通过(1) app.calArea(5f); 或(2) app.calArea( 5)

因此,如果您想继续进行方法重载并调用“圆形区域”,可以通过这种方式完成

public class App {
    public void calArea(float a) {
        System.out.println("Area of square is Side x Side : " + a * a);
    }

    public void calArea(float a, float b) {
        System.out.println("Area of rectangle is length x width" + a * b);
    }

    public void calArea(double r) {
        double area = (Math.PI * r * r);
        System.out.println("Area of circle is Radius x Radius x PI : " + area);
    }

    public static void main(String[] args) {

        App app = new App();

        app.calArea(5d);
    }

}

答案 2 :(得分:1)

Here是语言规范中的一些引言,解释了这种行为。

  

第15.12.2.5节选择最具体的方法

     

如果可以使用多个成员方法并且适用于   方法调用,有必要选择一种方法来提供   运行时方法分派的描述符。 Java编程   语言使用选择最具体方法的规则。的   非正式的直觉是,一种方法比另一种方法更具体   第一种方法处理的任何调用都可以传递给   另一个没有编译时错误。

对于您而言,calArea(float)calArea(double)都适用于单个int参数(int可以转换为float或{{1 }}通过原始的扩展转换)。

现在,编译器需要确定哪个更具体。最后,编译器选择了double,因为它比calArea(float)更具体。

每个适用于calArea(double)的调用都适用于calArea(float)(从calArea(double)float的隐式原始加宽转换),反之亦然(您需要强制转换)从double转换为double)。

因此,编译器选择了float重载。

答案 3 :(得分:1)

回答“为什么我的程序为什么应该调用“圆面积”时才调用浮点数“正方形面积”?”

  

这是因为未找到接受int参数的精确匹配方法,因此基于加宽,调用了与之匹配的最近方法(此处为float)   扩大顺序如下   字节->短->整数->长->浮点数->双重

在您的情况下(int-> long-> float-> double) 当您传递int参数时,因此最接近的匹配是一个接受float参数的方法,因此calArea(float a)称为

[要检查此尝试是否包含接受长参数的方法,您将看到它有机会执行,而不是较早的接受float参数的方法]

例如

  1. public void calArea(int a){ System.out.println(“ int”); }

  2. public void calArea(long a){ System.out.println(“ long”); }

  3. public void calArea(float a){ System.out.println(“ float”); }
  4. public void calArea(double a){ System.out.println(“ double”); }

方法调用为-calArea(5); 情况1:可以说没有方法发表评论 这里将调用接受int参数的方法。

情况2:现在注释/删除第一个方法(接受int参数) 这里将调用接受长参数的方法。

情况3:现在再次注释方法1和2方法 这里将调用接受float参数的方法。 等等...

答案 4 :(得分:-2)

当您传递的int值不为double ....时,正在计算“平方面积”。对于“圆形区域”,您必须在调用函数时将十进制值作为参数传递。