Sha*_*eep 12 java casting overloading
在我的铸造课上,老师教给我们一个有趣的事实如下.
class Casting {
public static void main(String args[]){
int i = 10;
byte b = i;
System.out.println(b);
}
}
Run Code Online (Sandbox Code Playgroud)
我们收到了一个错误
java:5: possible loss of precision
Run Code Online (Sandbox Code Playgroud)
然后我们更改了代码如下
class Casting1 {
public static void main(String args[]){
final int i = 10;
byte b = i;
System.out.println(10);
}
}
10
Run Code Online (Sandbox Code Playgroud)
我们得到了正确的输出.至于原因,他告诉我们当我们修改变量时final,变量可以存储在最小的数据类型中.在这种情况下是一个byte.这就是我们能够在不使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
我得到了输出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)
Run Code Online (Sandbox Code Playgroud)
这是什么原因?我有什么不明白的地方吗?
小智 2
您混淆了变量的内存空间及其类型。调用方法 m(...) 将首先检查参数变量的类型。这里它是一个 int,所以无论内存中 int 的大小如何,它都会选择相应的重载方法。
尽管我真的很欣赏你的第一个例子,它让我们了解了最终标识符的一个特征。