public class NewMain
{
public static void main(String[] args)
{
long num = 100;
System.out.println(xMethod(5,1000000000000L));
}
public static int xMethod(int n, long x)
{
System.out.println("int, long");
return n;
}
public static long xMethod(long n, long x)
{
System.out.println("long, long");
return n;
}
}
对我来说,这看起来很模糊。
整数范围内的数字可以是long,使用num。
的声明来证明我很好奇如果我有两种不同参数的方法会发生什么。
显然,在编写参数时,数字必须在末尾有一个L表示它是长的,而在声明num时,这是不必要的。 这是为什么?
我首先想到的是,如果它在int的范围内,它会自动将其视为int,当它超出该范围时,它将被用作long。 但是,使用我的第二个参数,它不会通过,除非我把L。它说它不在int的范围内。
有人可以给出一些明确的规则吗?
答案 0 :(得分:3)
没有小数点的数字文字始终被视为int
,除非它具有指定其他方式的后缀(例如L)。
如果它超出int范围,则这是编译错误。
当声明num时,这是不必要的
您可以将int文字分配给长变量,因为不会丢失信息。
答案 1 :(得分:1)
引用Java语言规范:
如果整数文字的后缀为ASCII字母
long
或L
(ell),则其类型为l
; ,否则类型为int
(§4.2.1)。后缀
L
是首选,因为字母l
(ell)通常很难与数字1
(一)区分开来。
因此,整数是int
,除非以L
结尾。由于1000000000000
对于int
而言太大,因此必须以L
结尾,否则会出现编译错误(" The literal 1000000000000
类型的int
超出范围")。
3.10.2. Floating-Point Literals
浮点文字的类型为
float
,如果后缀为ASCII字母F
或f
; ,否则其类型为double
,并且可以选择以ASCII字母D
或d
(§4.2.3)为后缀。
因此,十进制数是double
,除非以f
结尾。
5.1.2. Widening Primitive Conversion
int
至long
,float
或double
float
至double
因此,编译器将静默扩展(转换)int
值为long
,如果需要。
在您的情况下,编译器更喜欢第一种方法,因为它可以在没有任何转换的情况下调用。
如果第一种方法不存在,则在将第一个参数隐式转换为long
后,将调用第二种方法。
答案 2 :(得分:1)
对于你的问题,我想到的几点很少
1.变量被声明为long,因此不需要将L作为变量值
2.如果要传递硬编码的数字文字,则将L放在末尾以使其长,否则所有数值都将被视为int(如果没有正确后缀)
3.你可以通过一个int代替长参数(自动加宽会发生)
如果没有明确的铸造,你就不能通过狭窄的类型代替更宽的类型
5.参数转换可以通过显式转换和自动加宽,而不考虑数值大小。
以下代码示例 - "内部INT LONG"将由于自动加宽而没有private static void aMethod(int a , int b)
public class IntVsLons {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a =100;
long b=200;
aMethod(a,a);
}
/*
private static void aMethod(int a , int b){
System.out.println("Inside INT INT ");
}
*/
private static void aMethod(int a , long b){
System.out.println("Inside INT LONG ");
}
private static void aMethod(long a, long b ){
System.out.println("Inside LONG LONG ");
}
希望它有所帮助!!
答案 3 :(得分:0)
您的担忧是有效的。看看这个场景:
public static void methodX(long x, int y){
}
public static void methodX(int x, long y){
}
在这种情况下,如果您调用以下内容,它将为您提供不同的结果:
methodX(123, 123); //Compilation error (reference to methodX is ambiguous)
methodX(123L, 123); //Ok!
methodX(123, 123L); //Ok!
第一次调用会给你错误,因为默认情况下没有后缀(你创建一个整数),它将能够适应两种重载方法。
一些额外信息
l
的后缀,则默认的整数值将为integer
d
,则默认小数值为double
。答案 4 :(得分:0)
没有小数点且没有后缀的数字文字(例如42
或100
)始终为int
类型。要使其成为long
,您必须添加后缀:42L
或100L
。
如果调用方法,参数的实际(编译时)类型将确定调用哪个重载方法。如果可以使用给定类型调用多个重载方法,则将采用最具体的方法。 (对于确切的规则,请阅读JLS的第15.2节。)因此,在您的情况下,如果第一个参数是int
,则将调用第一个方法重载,因为int
是更具体的是long
。
xMethod(1, 1) --> xMethod(int n, long x) is called
xMethod(1L, 1) --> xMethod(long n, long x) is called