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)
我理解这个问题可能需要一些专业知识来回答,所以谢谢你的帮助.请提供一些有价值的解释.
如果你看一下字节码,也不会更贵.我反而担心构建和投掷的大量开销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语句分支.