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



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

相关内容

  • 没有找到相关文章

最新更新