Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在方法重载中传递不同数据类型的值_Java_Overloading - Fatal编程技术网

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

Java 在方法重载中传递不同数据类型的值,java,overloading,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 cal

我将一个双精度值传递给被重载的方法,但它将其作为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);
    }

}

当您传递的是int值而不是double。。。。所以“平方面积”正在计算中。对于“areaofcircle”,在调用函数时必须将十进制值作为参数传递

我只是将我的评论作为回答,因为这是解决您的问题的唯一方法,而无需强制执行


而不是使用
double
float
来区分应该计算哪些区域。就换个名字吧。这将消除看到代码时的许多头痛问题

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

是语言规范中解释这种行为的一些引用

第15.12.2.5节选择最具体的方法

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

在您的情况下,
calArea(float)
calArea(double)
都适用于单个
int
参数(
int
可以通过原语加宽转换转换为
float
double

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

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


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

调用“area of circle”方法的最简单方法就是从main方法调用“app.calArea(5d);”。通过写入5d或5.0d的圆面积,将调用方法,因为值5d被视为双精度。如果你想调用“正方形面积”的方法,你可以通过(1)app.calArea(5f)以任何一种方式调用或(2)应用程序calArea(5)

因此,如果您想继续使用方法重载并调用“areaofcircle”,您可以这样做

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);
    }

}
回答“为什么我的程序调用float‘areaofsquare’,而它应该调用‘areaofcircle’?”

这是因为没有找到接受int参数的精确匹配方法,因此基于加宽,调用匹配的最近方法(这里是它的float) 加宽按以下顺序进行 字节->短->整数->长->浮点->双精度

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

[若要检查此项,请尝试包含一个接受长参数的方法,您将看到它将有机会执行,而不是以前接受浮点参数的方法]

e、 g

  • 卡拉雷亚公共空间(内部a){ System.out.println(“int”); }

  • 公共空间卡拉雷(长a){ 系统输出打印项次(“长”); }

  • 公共空间卡拉雷(浮动a){ 系统输出打印项次(“浮动”); }
  • 公共空间卡拉雷(双a){ 系统输出打印项次(“双”); }
  • 方法调用为-calArea(5); 案例1:假设没有方法被评论 这里将调用接受int参数的方法

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

    案例3:现在再次评论方法1和方法2 这里将调用接受浮点参数的方法。
    以此类推……

    你不传递一个双精度,你传递一个整数。输出:正方形的面积是x边:25.0所以当传递时,我应该指定一个小数点来澄清双精度和整数的关系?@Lino不根据他指定的输出。而不是使用
    double
    float
    来区分应该计算哪些面积。就换个名字吧。这将消除看到代码时的许多头痛问题。
    app.calArea(5)
    会计算一个圆或一个正方形的面积吗?是的,这种方法的代码结构更好,但我试图在java中了解方法重载和类型提升主题,这就是为什么我将这些方法命名为类似的方法。谢谢你的邀请answer@Stewie不客气。我想这并不是方法重载的正确用例。不过,正方形需要一个
    float
    。浮点数是小数,这是很好的解释。我会记住这一点。感谢您抽出时间回答。