A a;
a= new B(); // Proyección
Se dice que A es el tipo estático de la variable a y B es el tipo dinámico de a. El tipo estático siempre se determina en tiempo de compilación mientras que el tipo dinámico en general sólo se puede conocer en tiempo de ejecución y puede cambiar.
Dada una variable a, Java sólo permite invocar los métodos y accesar las variables conocidas para el tipo estático de a.
a.Incx(); // Ok
a.x; // Ok
a.Incz(); // error, Incz no está definido para A
Del mismo modo, Java sólo permite asignar una expresión a una variable de tipo A si el tipo de la expresión es A o una subclase de A:
B b= new A(); // error, el objeto no pertence a
// la clase B
A a= new B(); // Ok
...
B b= a; // error, la clase estática de a
// no es una subclase de B.
Un objeto se puede convertir a una referencia de la clase B mediante un cast:
A a=new B();
B b=(B)a;
b.Incz(); // Ok
( (B)a ).Incz(); // Ok
No todo objeto se puede convertir a la clase B.
A a= new A();
...
B b=(B)a; // Ok, en compilación, pero
// error en tiempo de ejecución
Java chequea durante la ejecución todas las conversiones explícitas (casts). Si el objeto no pertence a la clase a la cual se pretende convertir, entonces se produce una excepción.
No hay comentarios:
Publicar un comentario