我在方法重载方面有些困惑,任何人都可以解决这个问题。
在我的示例类中,我有一个名称显示的方法,它被重载,代码如下所示。
class Sample {
void display(byte num) {
System.out.println("under byte");
}
void display(short num){
System.out.println("under short");
}
void display(int num) {
System.out.println("under int");
}
void display(long num) {
System.out.println("under long");
}
public static void main(String... args) {
Sample sample = new Sample();
sample.display(10);
sample.display(128);
sample.display(134572);
sample.display(65757l);
}
}
我的输出为
under int
under int
under int
under long
为什么即使数字小于127也jvm没有调用接受byte作为参数的方法?
提前致谢
答案 0 :(得分:5)
没有后缀的整数值的文字总是由编译器视为int
字面值。因此,无论实际值如何,都会在前3个案例中选择display(int num)
。
在最后一种情况下,您传递了一个带有l
后缀的文字,后缀被视为long
,这就是调用接受long
的方法的原因。
答案 1 :(得分:1)
byte :8位有符号整数。可以保存-128到127之间的值。 短:16位有符号整数。可以保存-32,768到32,767之间的值。 int :32位有符号整数。可以保持从-2,147,483,648到2,147,483,647的值。 长:64位整数。可以容纳非常大的数字(-2 ^ 63到2 ^ 63-1)。
通常情况下,从较大数据类型到较低数据类型的转换不是强制性的,系统本身将负责这一点,但我们必须明确提及将较低数据类型转换为较高数据类型。
覆盖代码中的所有方法。试试这个
Sample sample = new Sample();
sample.display((byte)10);
sample.display((short)128);
sample.display(134572);
sample.display(65757l);
答案 2 :(得分:0)
为什么即使数字小于127也jvm没有调用接受byte作为参数的方法?
因为文字127的类型是int
(根据JLS 15.8.1)。 int
类型无法隐式转换为byte
或short
,因此前两个重载不兼容。 int
参数的方法更具体(JLS 15.12.2.5),而不是long
参数的方法,这就是为什么选择它,除了你的上一个例子由于文字以long
结尾,因此使用l
参数。 (顺便说一句,我建议使用L
作为后缀而不是l
;它更清晰的IMO。)
调用方法和分配变量之间存在差异。这没关系:
byte b = 127;
因为127是一个赋给byte
的常量表达式,并且它已知是该字节的有效值。这是分配上下文,分配上下文的有效转换在JLS 5.2中指定。
进行方法调用时,从参数类型到参数类型的转换是而不是被视为赋值上下文。相反,这是一个调用上下文(JLS 5.3)。这是Java语言设计者的选择 - 语言可以以允许它的方式设计,但事实并非如此。这种差异在JLS 5.3中被提及:
严格或松散的调用上下文都不包括赋值上下文中允许的整数常量表达式的隐式缩小。 Java编程语言的设计者认为,包含这些隐式缩小转换会增加重载决策规则的复杂性(§15.12.2)。
答案 3 :(得分:0)
The values of the integral types are integers in the following ranges:
对于字节,从-128到127,包括
简而言之,从-32768到32767,包括
对于int,从-2147483648到2147483647,包括
很长一段时间,从-9223372036854775808到9223372036854775807,包括在内
对于char,从'\ u0000'到'\ uffff'包含,即从0到 65535
如果您明确使用后缀l
或L
(Reference)
如果整数文字以ASCII为后缀,则其长度为long 字母L或l(ell);否则它的类型为int(§4.2.1)。
如此有效,你在传递那些int时调用你的int
重载版本:
sample.display(10);
sample.display(128);
sample.display(134572);
例如,如果您需要调用short
重载版本,则必须先缩小该值:
sample.display((short) 10);
答案 4 :(得分:0)
您需要澄清整数数字的type
,否则它会始终将该数字视为int
。 (除了更大的数字)
答案 5 :(得分:0)
Java中整数的默认数据类型是整数,因此每个调用都委托给接受int类型参数的方法。
如果要调用其他方法,可以在方法调用期间键入强制转换为该类型的值,也可以声明该类型的变量并在方法调用期间传递该变量。
答案 6 :(得分:0)
您的问题有三个基本原则:
<强>字面强>: 如果编写sample.display(10),则默认情况下Java编译器将数字10视为int变量类型的整数文字。
<强>重载强>: 您有4个具有单个参数的重载方法。当值传递给方法时,编译器将选择具有最接近输入值类型的参数数据类型的值。在这种情况下,编译器将对前3个调用执行display(int num),因为输入值是整数文字。第四个将执行display(long num)因为输入值很长。
<强>铸造强>: 如果要执行显示(字节数)和显示(短麻木),则需要将int类型的输入值向下转换为byte和short。因为从int到byte或short的向下转换是一个缩小的转换,所以你必须明确地做。
sample.display(10) -> sample.display((byte)10);
sample.display(128) -> sample.display((short)128);