我将一个双精度值传递给正在重载的方法,但它将其视为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);
}
}
答案 0 :(得分:4)
我只是发表评论作为答案,因为这是解决您的问题而无需强制转换的唯一方法。
不要使用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
,以提高精度。
答案 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参数的方法]
例如
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参数的方法。 等等...
答案 4 :(得分:-2)
当您传递的int值不为double ....时,正在计算“平方面积”。对于“圆形区域”,您必须在调用函数时将十进制值作为参数传递。