通过实例调用静态函数时是否忽略运行时实例?

时间:2018-01-10 07:05:38

标签: java null static-methods classcastexception

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
    }
}

这是真的吗?为什么编译器不能忽略静态调用左侧的运行时实例?

2 个答案:

答案 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(){}
}