从接口vs从父类转换

Nou*_*vay -2 java polymorphism inheritance

鉴于上课

public class Dog extends Animal implements Friend{

  ...
}
Run Code Online (Sandbox Code Playgroud)

以下哪项性能更为昂贵?

Dog myDog = (Dog) someAnimal;//where Animal someAnimal
Run Code Online (Sandbox Code Playgroud)

要么

Dog myDog = (Dog) someFriend;//where Friend someFriend
Run Code Online (Sandbox Code Playgroud)

我理解这个问题可能需要一些专业知识来回答,所以谢谢你的帮助.请提供一些有价值的解释.

ζ--*_*ζ-- 5

如果你看一下字节码,也不会更贵.我反而担心构建和投掷的大量开销ClassCastExceptions,这恰好在这两种情况下,如果转换失败.无论如何,instanceof也不会特别伤害你,并且如果不能发生演员,你可以减少性能损失.

这是将一个声明为CharSequence(接口)的变量转换为String:

  public static void main(java.lang.String...);
    Code:
       0: ldc           #2                  // String a
       2: astore_1
       3: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       6: aload_1
       7: checkcast     #4                  // class java/lang/String
      10: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      13: return
Run Code Online (Sandbox Code Playgroud)

并将类转换为子类:

  public static void main(java.lang.String...);
    Code:
       0: new           #2                  // class A$B
       3: dup
       4: invokespecial #3                  // Method A$B."<init>":()V
       7: astore_1
       8: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
      11: aload_1
      12: checkcast     #2                  // class A$B
      15: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      18: return
}
Run Code Online (Sandbox Code Playgroud)

无论如何,这是影响instanceof:

  public static void main(java.lang.String...);
    Code:
       0: new           #2                  // class A$B
       3: dup
       4: invokespecial #3                  // Method A$B."<init>":()V
       7: astore_1
       8: aload_1
       9: instanceof    #2                  // class A$B
      12: ifeq          25
      15: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
      18: aload_1
      19: checkcast     #2                  // class A$B
      22: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      25: return
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,它只是一个额外的字节码操作(通常只检查对象实例中存在的几个元素)和一个if语句分支.