[英]Passing values of different data types in Method 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);
}
}
我只是将我的评论发布为答案,因为这是解决问题而无需强制转换的唯一方法。
而不是使用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
来提高精度。
调用“圆形区域”方法的最简单方法就是从main方法中调用“ 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);
}
}
以下是语言规范中的一些引语来解释此行为。
15.12.2.5节选择最具体的方法
如果多个成员方法既可访问又可应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。 Java编程语言使用选择最具体方法的规则。 非正式的直觉是, 如果第一种方法处理的任何调用都可以传递给另一个方法而没有编译时错误 ,则一个方法比另一种方法更具体。
在您的情况下, calArea(float)
和calArea(double)
都适用于单个int
参数(可以通过原始扩展转换将int
转换为float
或double
)。
现在,编译器需要确定哪个更具体。 最后,编译器选择了calArea(float)
因为它比calArea(double)
更具体。
适用于calArea(float)
每个调用都适用于calArea(double)
(从float
到double
隐式原始加宽转换),反之亦然(您需要calArea(double)
转换从double
到float
转换)。
因此,编译器选择了calArea(float)
重载。
回答“为什么我的程序在应调用“圆区域”时为何调用浮点数“方形区域”?”
这是因为未找到接受int参数的精确匹配方法,因此基于加宽,将调用匹配的最接近的方法(此处是其float)加宽发生在以下顺序字节中-> short-> int-> long-> float->双
在您的情况下,当您传递int参数时,其(int-> long-> float-> double)因此最接近的匹配是一种接受float参数的方法,因此调用了calArea(float a)
[要检查此尝试是否包含接受长参数的方法,您将看到它有机会执行,而不是较早的接受float参数的方法。
例如
public void calArea(int a){System.out.println(“ int”); }
public void calArea(long a){System.out.println(“ long”); }
方法调用是-calArea(5); 情况1:假设这里没有注释的方法将被调用接受int参数的方法。
情况2:现在注释/删除第一个方法(接受int参数),这里将调用接受长参数的方法。
情况3:现在再次注释方法1和2方法,这里将调用接受float参数的方法。 等等...
当您传递int值时,不能将double值...。因此正在计算“平方面积”。 对于“圆形区域”,您必须在调用函数时将十进制值作为参数传递。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.