我正在阅读java中书籍数据结构和算法中的主题基本类型。 我引用了一些可能有用的主题文本:
"声明具有这些类型之一的变量只存储该类型的值, 而不是对某个对象的引用。整数常量,如14或195,属于类型 int,除非马上跟着' L'或者' l',在这种情况下,它们是long类型。 浮点常数,如3.1415或2.158e5,是double类型,除非 紧随其后的是F' F'或者' f',在这种情况下,它们是float类型。我们表明 Code Fragment 1.2中的一个简单类,它将许多基类型定义为local 主要方法的变量。" - 形成这本书
然后在示例代码中:
long l = 890L;
我的问题是,如果l(变量)的类型已经声明为long,为什么我需要将L放在最后?
例如,如果我这样做:
long l = 890;
它仍然可以工作,所以为什么在示例代码中写的长l = 890L;
答案 0 :(得分:2)
这是widening implicit conversion。 Java可以清楚地告诉您正在尝试将int值890
分配给长l
。这是成功的(没有演员表),因为它可以在没有任何数据丢失的情况下完成。
我无法告诉您为什么该示例使用890l
。我可以假设这样做是明确的,但这只是猜测。
答案 1 :(得分:2)
变量的类型和文字的类型之间存在区别。
在这种情况下:
long l = 890L;
你有一个long类型的变量和一个long类型的文字。当然这很有效。
在这种情况下:
long l = 890;
你有一个long类型的变量和一个int类型的文字。整数会自动提升为一个整数(因为它适合),这也适用。它与此相同:
int i = 890;
long l = i;
请注意,您无法执行此操作:
int i = 890L;
这是因为虽然在这种情况下890足够小以适合整数,但没有将longs自动转换为整数的一般规则,因为情况并非总是如此。
请注意,您也不能这样做:
long l = 3000000000;
这是因为你试图声明一个int类型的文字,但是这个数字太大而不适合int。
答案 2 :(得分:1)
我不确切地知道为什么它是这样设计的,但是如果你有一个没有L的整数,那么假设它是一个int。尝试在没有L的情况下定义一个大数字(在int范围之外),编译器会告诉你那里有错误。
同样适用于不是整数的数字:如果你想要一个浮点数,你必须添加一个F后缀(例如3.1415F),否则假设它是一个双精度数。
答案 3 :(得分:0)
为什么在示例代码中将其写为l = 890L;
更明确的是作者期望值很长。
就我个人而言,我更喜欢简洁并留给开发人员来计算价值,如果他们关心的话会很长,而且很可能他们甚至都不会考虑它。