Java具有在实例上调用静态方法的不幸允许语法,尽管这带有警告。
从下面的示例来看,编译器似乎忽略了该实例,并根据编译时类直接调用静态方法,这证明它通过 null 引用成功。
但是,从以下示例来看,编译器似乎仍在实例上进行类型检查,
class Example
{
static void f1() {}
public static void main(String[] args) {
Example example1 = null;
example1.f1(); // works OK
((Example) null).f1(); // works OK
((Example) (Object) ("")).f1(); // throws cast exception
}
}
这是真的吗?为什么编译器不能忽略静态调用左侧的运行时实例?
在调用该方法之前抛出ClassCastException
。
是吗
String str = "";
Object o = (Object) str;
Example e = (Example) o; // exception
e.f1(); // never reached
编译器
需要知道调用哪个f1((方法。所以它需要投向左侧。
class Example
{
static void f1() {}
public static void main(String[] args) {
Example example1 = null;
((Example2) (Example) (Object) ("")).f1();
}
}
class Example2{
public void f1(){}
}