Java 如何区分int和long?
对我来说,这看起来很模棱两可 整数范围内的数字可以是长的,这可以通过声明num来演示 我很好奇如果我有两种不同参数的方法会发生什么 显然,在编写参数时,数字的末尾必须有一个L,以表示它是长的,而在声明num时,这是不必要的。 为什么会这样 我首先想到,如果它在一个int的范围内,它会自动认为它是一个int,当它超过这个范围时,它会被用作一个long。 但是,对于我的第二个参数,它不会通过,除非我把L放进去。它说它不在int的范围内Java 如何区分int和long?,java,int,long-integer,Java,Int,Long Integer,对我来说,这看起来很模棱两可 整数范围内的数字可以是长的,这可以通过声明num来演示 我很好奇如果我有两种不同参数的方法会发生什么 显然,在编写参数时,数字的末尾必须有一个L,以表示它是长的,而在声明num时,这是不必要的。 为什么会这样 我首先想到,如果它在一个int的范围内,它会自动认为它是一个int,当它超过这个范围时,它会被用作一个long。 但是,对于我的第二个参数,它不会通过,除非我把L放进去。它说它不在int的范围内 有人能给出一些明确的规则吗?没有小数点的数字文字总是被视为int
有人能给出一些明确的规则吗?没有小数点的数字文字总是被视为
int
,除非它的后缀另有规定(如L)
如果超出int的范围,则这是一个编译错误
在声明num时,这不是必需的
您可以为长变量指定一个int文本,因为不会丢失信息。您关心的问题是有效的。看看这个场景:
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;
}
}
在这种情况下,如果调用以下命令,将得到不同的结果:
public static void methodX(long x, int y){
}
public static void methodX(int x, long y){
}
第一次调用会给您带来错误,因为默认情况下没有后缀(您创建了一个整数),这将能够适应两个重载方法
一些附加信息
- 如果没有后缀
,默认的整数值将是l
整数
- 如果没有后缀
,默认的十进制值将是一个d
double
L
或L
作为后缀,则其类型为long
否则为int
()类型
首选后缀L
,因为字母L
(ell)通常很难与数字1
(一)区分
因此,整数是int
,除非以L
结尾。由于10000000000
对于int
而言太大,因此必须以L
结尾,否则会出现编译错误(“int类型的10000000000
文本超出范围”)
如果浮点文本的后缀是ASCII字母F
或F
,则它的类型为float
否则,其类型为double
,并且可以选择使用ASCII字母D
或D
()作为后缀
因此,十进制数是一个双精度
,除非以f
结尾
到int
,long
或float
double
到float
double
int
值扩展(转换)为long
在您的例子中,编译器更喜欢第一个方法,因为它可以在不进行任何转换的情况下被调用
如果第一个方法不存在,则在第一个参数隐式转换为
long
后,将调用第二个方法。没有小数点和后缀的数值文本,例如42
或100
始终是int
类型。要使其成为长
,必须添加后缀:42L
或100L
如果调用方法,参数的实际(编译时)类型将决定调用哪个重载方法。如果可以使用给定类型调用多个重载方法,则将采用最具体的方法。(要了解确切的规则,请阅读的第15.2节。)因此,在您的情况下,如果第一个参数是int
,则将调用第一个方法重载,因为int
更具体为long
methodX(123, 123); //Compilation error (reference to methodX is ambiguous)
methodX(123L, 123); //Ok!
methodX(123, 123L); //Ok!
关于你的问题,我想了几点,
1.变量声明为长,则无需将L作为变量值
2.如果要传递一个硬编码的数字文字,请将L放在末尾以使其变长,否则所有数值都将被视为int(如果后缀不正确)
3.您可以传递int代替long参数(将发生自动加宽)
4.如果没有显式强制转换,则无法通过窄类型代替宽类型
5.参数转换可以通过显式转换和自动加宽进行,而不考虑数值大小 对于下面的代码示例,由于自动加宽和缺少
专用静态无效方法(INT a,INT b)
希望能有帮助 我明白了。因此,除非有后缀,否则默认值为int?带小数点,默认值是否为double?@JohnDoe yes。类似地,带有浮点的文字(如1.0)也是双精度的。
xMethod(1, 1) --> xMethod(int n, long x) is called
xMethod(1L, 1) --> xMethod(long n, long x) is called
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 ");
}