Java初学者:强制转换是否会导致性能降低?
当我创建Java初学者:强制转换是否会导致性能降低?,java,inheritance,casting,Java,Inheritance,Casting,当我创建animalx=newdog()时如果我想使用Dog函数,我必须强制转换,对吗((狗)x).bark()
animalx=newdog()时代码>如果我想使用Dog函数,我必须强制转换,对吗<代码>((狗)x).bark()比如说我会在for循环中多次使用它,这会导致性能降低吗?除了每次强制转换,还有其他方法吗?强制转换总是会增加开销,但很难说它是否会成为应用程序的瓶颈。这将取决于您的场景。可以通过在循环之外执行多次强制转换来避免多次强制转换:
Animal x = new Dog();
Dog dog = (Dog)x;
Now loop and call dog.bark() as many times as you like
强制转换总是会增加开销,但很难说它是否会成为应用程序的瓶颈。这将取决于您的场景。可以通过在循环之外执行多次强制转换来避免多次强制转换:
Animal x = new Dog();
Dog dog = (Dog)x;
Now loop and call dog.bark() as many times as you like
我倾向于在本地使用实现类型,同时返回基类型。大概是这样的:
public Animal createAnimal(){
Dog dog = new Dog();
dog.bark();
dog.bite();
dog.houl();
return dog;
}
package test;
public class Dog extends Animal {
public void bark(){
System.out.println("Woof woof");
}
}
package test;
public class Animal {
public void sayHello(){
System.out.println("Hello !!");
}
public static void main(String[] args) {
Animal a = new Dog();
a.sayHello();
((Dog)a).bark();
}
}
Compiled from "Animal.java"
public class test.Animal extends java.lang.Object{
public test.Animal();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public void sayHello();
Code:
0: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #21; //String Hello !!
5: invokevirtual #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
public static void main(java.lang.String[]);
Code:
0: new #31; //class test/Dog
3: dup
4: invokespecial #33; //Method test/Dog."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #34; //Method sayHello:()V
12: aload_1
13: checkcast #31; //class test/Dog
16: invokevirtual #36; //Method test/Dog.bark:()V
19: return
}
我倾向于在本地使用实现类型,同时返回基类型。大概是这样的:
public Animal createAnimal(){
Dog dog = new Dog();
dog.bark();
dog.bite();
dog.houl();
return dog;
}
package test;
public class Dog extends Animal {
public void bark(){
System.out.println("Woof woof");
}
}
package test;
public class Animal {
public void sayHello(){
System.out.println("Hello !!");
}
public static void main(String[] args) {
Animal a = new Dog();
a.sayHello();
((Dog)a).bark();
}
}
Compiled from "Animal.java"
public class test.Animal extends java.lang.Object{
public test.Animal();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public void sayHello();
Code:
0: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #21; //String Hello !!
5: invokevirtual #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
public static void main(java.lang.String[]);
Code:
0: new #31; //class test/Dog
3: dup
4: invokespecial #33; //Method test/Dog."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #34; //Method sayHello:()V
12: aload_1
13: checkcast #31; //class test/Dog
16: invokevirtual #36; //Method test/Dog.bark:()V
19: return
}
像演员一样
Dog dog = (Dog) animal;
是一个所谓的“检查”演员。因此在运行时,它是一个简单的if语句(是animal实现Dog的实例),它抛出一个ClassCastException
。因此,如果强制转换正常,它至少不会提供任何合理的性能开销,但如果转换失败,它将显示异常,并且异常处理是一个消耗性能的“操作”
所以,如果你投下了一些东西,而且投下的不会失败,我相信不会有性能问题。但是如果您的强制转换经常失败,那么您应该稍微更改一下算法。类似于
Dog dog = (Dog) animal;
是一个所谓的“检查”演员。因此在运行时,它是一个简单的if语句(是animal实现Dog的实例),它抛出一个ClassCastException
。因此,如果强制转换正常,它至少不会提供任何合理的性能开销,但如果转换失败,它将显示异常,并且异常处理是一个消耗性能的“操作”
所以,如果你投下了一些东西,而且投下的不会失败,我相信不会有性能问题。但是如果您的强制转换经常失败,那么您应该稍微更改一下算法。假设Dog类是这样的:
public Animal createAnimal(){
Dog dog = new Dog();
dog.bark();
dog.bite();
dog.houl();
return dog;
}
package test;
public class Dog extends Animal {
public void bark(){
System.out.println("Woof woof");
}
}
package test;
public class Animal {
public void sayHello(){
System.out.println("Hello !!");
}
public static void main(String[] args) {
Animal a = new Dog();
a.sayHello();
((Dog)a).bark();
}
}
Compiled from "Animal.java"
public class test.Animal extends java.lang.Object{
public test.Animal();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public void sayHello();
Code:
0: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #21; //String Hello !!
5: invokevirtual #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
public static void main(java.lang.String[]);
Code:
0: new #31; //class test/Dog
3: dup
4: invokespecial #33; //Method test/Dog."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #34; //Method sayHello:()V
12: aload_1
13: checkcast #31; //class test/Dog
16: invokevirtual #36; //Method test/Dog.bark:()V
19: return
}
动物类是这样的:
public Animal createAnimal(){
Dog dog = new Dog();
dog.bark();
dog.bite();
dog.houl();
return dog;
}
package test;
public class Dog extends Animal {
public void bark(){
System.out.println("Woof woof");
}
}
package test;
public class Animal {
public void sayHello(){
System.out.println("Hello !!");
}
public static void main(String[] args) {
Animal a = new Dog();
a.sayHello();
((Dog)a).bark();
}
}
Compiled from "Animal.java"
public class test.Animal extends java.lang.Object{
public test.Animal();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public void sayHello();
Code:
0: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #21; //String Hello !!
5: invokevirtual #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
public static void main(java.lang.String[]);
Code:
0: new #31; //class test/Dog
3: dup
4: invokespecial #33; //Method test/Dog."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #34; //Method sayHello:()V
12: aload_1
13: checkcast #31; //class test/Dog
16: invokevirtual #36; //Method test/Dog.bark:()V
19: return
}
如果您看到生成的字节码,它将如下所示:
public Animal createAnimal(){
Dog dog = new Dog();
dog.bark();
dog.bite();
dog.houl();
return dog;
}
package test;
public class Dog extends Animal {
public void bark(){
System.out.println("Woof woof");
}
}
package test;
public class Animal {
public void sayHello(){
System.out.println("Hello !!");
}
public static void main(String[] args) {
Animal a = new Dog();
a.sayHello();
((Dog)a).bark();
}
}
Compiled from "Animal.java"
public class test.Animal extends java.lang.Object{
public test.Animal();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public void sayHello();
Code:
0: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #21; //String Hello !!
5: invokevirtual #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
public static void main(java.lang.String[]);
Code:
0: new #31; //class test/Dog
3: dup
4: invokespecial #33; //Method test/Dog."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #34; //Method sayHello:()V
12: aload_1
13: checkcast #31; //class test/Dog
16: invokevirtual #36; //Method test/Dog.bark:()V
19: return
}
从“Animal.java”编译而来
公共类test.Animal扩展java.lang.Object{
公共测试。动物();
代码:
0:aload_0
1:invokespecial#8;//方法java/lang/Object。“:()V
4:返回
公共空间:sayHello();
代码:
0:getstatic#15;//字段java/lang/System.out:Ljava/io/PrintStream;
3:ldc#21;//字符串你好!!
5:invokevirtual#23;//方法java/io/PrintStream.println:(Ljava/lang/String;)V
8:返回
公共静态void main(java.lang.String[]);
代码:
0:new#31;//类测试/狗
3:dup
4:invokespecial#33;//方法测试/狗。”“:()V
7:astore_1
8:aload_1
9:invokevirtual#34;//方法sayHello:()V
12:aload_1
13:checkcast#31;//类测试/狗
16:invokevirtual#36;//方法测试/狗吠:()V
19:返回
}
因此,正如您所看到的,这里有一个额外的checkcast
,它是根据以下链接解决的:
为了避免环形块中的延迟:
在循环外强制转换,然后使用…让我们假设Dog类是这样的:
public Animal createAnimal(){
Dog dog = new Dog();
dog.bark();
dog.bite();
dog.houl();
return dog;
}
package test;
public class Dog extends Animal {
public void bark(){
System.out.println("Woof woof");
}
}
package test;
public class Animal {
public void sayHello(){
System.out.println("Hello !!");
}
public static void main(String[] args) {
Animal a = new Dog();
a.sayHello();
((Dog)a).bark();
}
}
Compiled from "Animal.java"
public class test.Animal extends java.lang.Object{
public test.Animal();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public void sayHello();
Code:
0: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #21; //String Hello !!
5: invokevirtual #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
public static void main(java.lang.String[]);
Code:
0: new #31; //class test/Dog
3: dup
4: invokespecial #33; //Method test/Dog."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #34; //Method sayHello:()V
12: aload_1
13: checkcast #31; //class test/Dog
16: invokevirtual #36; //Method test/Dog.bark:()V
19: return
}
动物类是这样的:
public Animal createAnimal(){
Dog dog = new Dog();
dog.bark();
dog.bite();
dog.houl();
return dog;
}
package test;
public class Dog extends Animal {
public void bark(){
System.out.println("Woof woof");
}
}
package test;
public class Animal {
public void sayHello(){
System.out.println("Hello !!");
}
public static void main(String[] args) {
Animal a = new Dog();
a.sayHello();
((Dog)a).bark();
}
}
Compiled from "Animal.java"
public class test.Animal extends java.lang.Object{
public test.Animal();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public void sayHello();
Code:
0: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #21; //String Hello !!
5: invokevirtual #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
public static void main(java.lang.String[]);
Code:
0: new #31; //class test/Dog
3: dup
4: invokespecial #33; //Method test/Dog."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #34; //Method sayHello:()V
12: aload_1
13: checkcast #31; //class test/Dog
16: invokevirtual #36; //Method test/Dog.bark:()V
19: return
}
如果您看到生成的字节码,它将如下所示:
public Animal createAnimal(){
Dog dog = new Dog();
dog.bark();
dog.bite();
dog.houl();
return dog;
}
package test;
public class Dog extends Animal {
public void bark(){
System.out.println("Woof woof");
}
}
package test;
public class Animal {
public void sayHello(){
System.out.println("Hello !!");
}
public static void main(String[] args) {
Animal a = new Dog();
a.sayHello();
((Dog)a).bark();
}
}
Compiled from "Animal.java"
public class test.Animal extends java.lang.Object{
public test.Animal();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public void sayHello();
Code:
0: getstatic #15; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #21; //String Hello !!
5: invokevirtual #23; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
public static void main(java.lang.String[]);
Code:
0: new #31; //class test/Dog
3: dup
4: invokespecial #33; //Method test/Dog."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #34; //Method sayHello:()V
12: aload_1
13: checkcast #31; //class test/Dog
16: invokevirtual #36; //Method test/Dog.bark:()V
19: return
}
从“Animal.java”编译而来
公共类test.Animal扩展java.lang.Object{
公共测试。动物();
代码:
0:aload_0
1:invokespecial#8;//方法java/lang/Object。“:()V
4:返回
公共空间:sayHello();
代码:
0:getstatic#15;//字段java/lang/System.out:Ljava/io/PrintStream;
3:ldc#21;//字符串你好!!
5:invokevirtual#23;//方法java/io/PrintStream.println:(Ljava/lang/String;)V
8:返回
公共静态void main(java.lang.String[]);
代码:
0:new#31;//类测试/狗
3:dup
4:invokespecial#33;//方法测试/狗。”“:()V
7:astore_1
8:aload_1
9:invokevirtual#34;//方法sayHello:()V
12:aload_1
13:checkcast#31;//类测试/狗
16:invokevirtual#36;//方法测试/狗吠:()V
19:返回
}
因此,正如您所看到的,这里有一个额外的checkcast
,它是根据以下链接解决的:
为了避免环形块中的延迟:
跳出循环,然后使用…可能会有所帮助您可能问错了问题。“将动物创建为新狗()
,然后使用狗的功能”这一设计值得商榷。@David,伙计!你的评论让我改变了整个计划,是的,你是对的,非常感谢!可能会有帮助你可能问错了问题。“将动物创建为新狗(),然后使用狗的功能”这一设计值得商榷。@David,伙计!你的评论让我改变了整个计划,是的,你是对的,非常感谢!这不是一个简单的if语句。它是一系列if语句:)。签出此链接不是一个简单的if语句。它是一系列if语句:)。签出此链接