在选角课上,老师教了我们一个有趣的事实。
class Casting {
public static void main(String args[]){
int i = 10;
byte b = i;
System.out.println(b);
}
}
我们遇到了一个错误
java:5: possible loss of precision
然后我们改了代码如下
class Casting1 {
public static void main(String args[]){
final int i = 10;
byte b = i;
System.out.println(10);
}
}
10
我们得到了正确的输出。至于原因,他告诉我们,当我们修改变量 final
时,变量会以尽可能小的数据类型存储。在本例中是一个字节
。这就是我们能够在不使用 cast 关键字的情况下进行转换的原因。
但是当我们这样使用方法重载时,
class A {
void m(int i){
System.out.println("int");
}
void m(byte b){
System.out.println("byte");
}
public static void main(String args[]){
A a1 = new A();
final int i = 10;
a1.m(i);
}
}
我得到了输出 int
。如果最终变量以尽可能低的数据类型存储,则应为 byte
。所以我在没有重载的情况下尝试了以下代码。
class A {
void m(byte b){
System.out.println("byte");
}
public static void main(String args[]){
A a1 = new A();
final int i = 10;
a1.m(i);
}
}
java:9: m(byte) in A cannot be applied to (int)
这是什么原因?我有什么误解吗?
最佳答案
您混淆了变量的内存空间及其类型。 调用方法 m(...) 将首先检查参数变量的类型。这里它是一个 int,因此无论 int 在内存中的大小如何,它都会选择相应的重载方法。
虽然我真的很感谢你第一个将光线带入最终标识符的特征之一的例子。
关于java - 最终类型转换概念不适用于重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30368618/