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