我了解以下代码无效
Float a=3
因为它被翻译为Float a = Integer.valueOf(3)。我们将在LHS上有一个Float引用,在RHS上有一个Integer对象,它是不兼容的。但是:
1
`Short a=3;`
这是有效的,虽然在这里,我们将对LHS和RHS上的整数对象进行简短引用。
2
Float a=(Float) 3
如果我们没有使用类型3,它将被翻译为Integer.valueOf(3)。现在,它会被翻译为Float.valueOf(3)吗?
答案 0 :(得分:2)
如果您的问题是“为什么Float f = 3;不编译,但Short s = 3;是吗?”,那么答案是:
Java编译器对整数常量做了一些特殊工作,使它们适合左侧:它找到最合适的类型并使用它。所以,
Short s = 3;
编译为
Short s = Short.valueOf(3);
基本上,当你写
时会发生同样的魔术short s = 3;
但这只适用于整数,而不适用于浮点值。
答案 1 :(得分:1)
简短形式是:
Float a=3.0f;
对于Double类型:
Double b=3.0;
答案 2 :(得分:0)
如果尝试使用大于它可以容纳的值来初始化变量(无论值的数字形式如何),编译器将给出错误消息。
char c = 0xffff; // max char hex value
byte b = 0x7f; // max byte hex value
short s = 0x7fff; // max short hex value
请注意上面的代码中char,byte和short的最大十六进制值。如果超过这些值,编译器将自动使值为int,并告诉您需要缩小转换。你会知道你已经跨过了界限。
因此,在您的情况下Short s = 3
实际上变为Short s = new Short(3)
并且有效。 (自动装箱时不使用valueOf方法,因为现代IDE有选项将这些自动装箱标记为错误,我们可以用valueOf方法替换它们以获得更好的内存管理)
在第二种情况下,Float a=(Float) 3
将成为Float.valueOf(3)
答案 3 :(得分:0)
无法指定短和字节常量,因此编译器允许您透明地转换int常量。 java中有浮点常量,因此它不支持隐含转换。如果你想浮点数/浮点数,我建议你使用浮点数常量。
Byte b = 3;
Short s = 3;
Integer i = 3;
Long l = 3L;
Float f = 3f;
Double d = 3d;