我了解以下代码无法正常工作

Float a=3

因为它翻译为float a = integer.valueof(3)。我们将在LHS上有一个浮点参考,而RHS上的整数对象是不兼容的。但 :

1.

     `Short a=3;`

这确实有效,尽管再次在这里,我们将在RHS上有一个简短的引用和整数对象。

2.

Float a=(Float) 3

如果我们没有打字3,它将被翻译为integer.valueof(3)。现在,它会被翻译成float.valueof(3)吗?

有帮助吗?

解决方案

如果您尝试初始化一个比值大的变量(不管值的数值形式如何),则编译器将为您提供错误消息。

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方法替换它们以获得更好的内存mgmt)

在第二种情况下 Float a=(Float) 3 会变成 Float.valueOf(3)

其他提示

如果您的问题是“为什么float f = 3;不编译,而是简短s = 3;是否?”,那么答案是:

Java编译器在整数常数上进行了一些特殊的工作,以使其与左侧拟合:它找到了最合适的类型并使用它。所以,

Short s = 3;

被编译为

Short s = Short.valueOf(3);

本质上,当您写作时也会发生同样的魔术

short s = 3;

但这仅适用于整数,而不是用于浮点值。

简短的形式是:

Float a=3.0f;

对于双重类型:

Double b=3.0;

无法指定简短和字节常数,因此编译器允许您透明地翻译INT常数。 Java中有浮动常数,因此不支持隐含的翻译。如果您想要浮子/浮子,我建议您使用浮点常数。

Byte b = 3;
Short s = 3;
Integer i = 3;
Long l = 3L;
Float f = 3f;
Double d = 3d;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top