Java在实例上调用静态方法有一种不幸的允许语法,尽管这会带来警告。
从下面的例子看,编译器似乎忽略了实例,并根据编译时类直接调用静态方法,如通过空引用成功所证明的那样。
但是从以下示例中,似乎编译器仍然对实例进行类型检查,
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
}
}
这是真的吗?为什么编译器不能忽略静态调用左侧的运行时实例?
答案 0 :(得分:2)
在调用方法之前抛出setPositiveButton();
。
你做
ClassCastException
答案 1 :(得分:0)
编译器需要知道调用哪个f1()方法。所以它需要施放左侧。
class Example
{
static void f1() {}
public static void main(String[] args) {
Example example1 = null;
((Example2) (Example) (Object) ("")).f1();
}
}
class Example2{
public void f1(){}
}