Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java初学者:强制转换是否会导致性能降低?_Java_Inheritance_Casting - Fatal编程技术网

Java初学者:强制转换是否会导致性能降低?

Java初学者:强制转换是否会导致性能降低?,java,inheritance,casting,Java,Inheritance,Casting,当我创建animalx=newdog()时如果我想使用Dog函数,我必须强制转换,对吗((狗)x).bark()

当我创建
animalx=newdog()时如果我想使用Dog函数,我必须强制转换,对吗<代码>((狗)x).bark()强制转换总是会增加开销,但很难说它是否会成为应用程序的瓶颈。这将取决于您的场景。可以通过在循环之外执行多次强制转换来避免多次强制转换:

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语句:)。签出此链接