我有方法重载,例如:
public int sum1(int a, int b)
{
int c= a+b;
System.out.println("The method1");
return c;
}
public float sum1(int a, float b)
{
float c= a+b;
System.out.println("The method2");
return c;
}
public double sum1(float a, float b)
{
double c= (double) a+b;
System.out.println("The method3");
return c;
}
从主要方法,假设我们有
double x=10.10f;
double y=10.20f;
x和y的表观类型是double,但实际类型是float。当我打电话
System.out.println(" the output is :"+cc.sum1(x,y));
编译时的错误。
The method sum1(int, int) in the type Class is not applicable for the arguments double, double).
它应该通过将double转换为float来进入sum1(即method3)
答案 0 :(得分:11)
TL;此答案的DR版本:
double
始终为double
,永远不是float
等。)x和y的表观类型是double,但实际类型是float
不,不是。您刚刚获得了从指定的float
字面值到double
值的转换。 实际值为double
。
原语不像对象一样工作 - 例如,int
变量中的int
值仍然不是double
。
使用整数类型示例更简单。假设我们有:
byte b = 100;
int x = b;
x
的值是32位整数,表示值100.它不知道"知道"它最初是从byte
值分配的...恰好是在转让时从byte
转换为int
。
将其与参考类型进行比较:
String x = "hello";
Object y = x;
此处,y
确实的值是对String
对象的引用。该类型信息被精确保存,因为可以包含它的整个对象,并且因为变量本身的值只是一个引用。 (这些位本身不需要作为任务的一部分进行更改 - 至少在一个简单的VM中,它们将是x
和y
中完全相同的位,因为它们& #39;指的是同一个对象。)
但即使在这种情况下,也会根据参数的编译时类型而不是执行时的实际值来进行重载解析。变量的执行时类型涉及的唯一方法是使用基于方法调用目标的覆盖。如果我们有:
Foo f = new X();
Foo g = new Y();
Foo h = new Z();
f.someMethod(g, h);
...然后编译器将在Foo
中查找一个方法,该方法有两个Foo
参数(或Object
或其他超类/接口) - 涉及的对象的实际类型是无关紧要的。但是,在执行时,如果在X
中覆盖了该方法,则由于对象f
的值的执行时类型,将调用该覆盖。 / p>
答案 1 :(得分:3)
将double转换为float可能会导致数据丢失,因为它是一个缩小的转换,因此不是由编译器自动完成的。如果你想要变量,你必须将变量显式地转换为浮动。
答案 2 :(得分:1)
不,变量的实际类型是double
。您分配给double
变量的常量的类型是float
。
答案 3 :(得分:0)
尝试添加新功能:public double sum1(double a,double b)。它会解决你的问题。 而且,这种铸造会导致数据丢失。
答案 4 :(得分:0)
Floats很有趣......他们总是试图自动转换为双打。此代码编译,每次都有浮点数。
public class wood {
public static void main(String[] args) {
float x = 10.1f;
float y = 10.2f;
System.out.println("Sum of x and y = " + sum1((float)x, (float)y));
}
public static float sum1(float x, float y) {
return (float)((float)x+(float)y);
}
}
编辑;请注意,使用括号外的强制转换运算符将在括号内部计算后进行转换。所以;
System.out.println((int)(50.5 + 50.7));
将打印出101。
在java中,一些数据转换是自动的,而其他数据转换需要强制转换运算符..简而言之,java会自动进行扩展转换,而您必须使用强制转换运算符来缩小转换。
原始数据类型的层次结构如下:
字节// 1个字节(-128到127)
短// 2个字节(超过32,000给/从0开始)
int // 4个字节(超过20亿次给/从0开始)
长// 8字节(超过9 quintillion(10 ^ 18)给出/取0)
float // 4个字节(保存7个小数位)
double // 8个字节(保存15个小数位)
java不会自动缩小转换范围,因为这样数据就有丢失的风险。字节和短字都将自动成为整数。
short s = 5;
byte b = 5;
short sum = s + b; //this will cause an error!
s和b自动扩展转换为int,如果没有强制转换操作符,则无法将int赋值为short。
short sum = (short)(s + b);
需要。