Допустим, класс Dog выглядит следующим образом:
package test;
public class Dog extends Animal {
public void bark(){
System.out.println("Woof woof");
}
}
А класс Animal выглядит следующим образом:
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
}
Итак, как вы видите, здесь есть дополнительный checkcast
, который разрешается по этой ссылке:
http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc2.html
Во избежание задержкив цикле, как блоки: приведите вне цикла и затем используйте ...