Subclases

La clase Grob tiene subclases: Box, Text, Ellipse.




Proyección

Grob go= box;

Definiciones:

Tipo estático de una variable: el tipo declarado para esa variable.

Ej: el tipo estático de go es Grob.

Tipo dinámico de una variable: el tipo del objeto referenciado por esa variable en un instante de la ejecución.

Ej: el tipo dinámico de go es Box.


Experimento 3: Cambie el tipo de la variable box a Object. Intente recompilar.


Grob go= new Box(...);
...
Box box= go; // ¡Error en compilación!
La variable go es de tipo Grob que tiene mayor rango que la variable box (de tipo Box).

Box < Grob < Object

String < Object

int[] < Object


Estrechamiento

Box box= (Box)go;     // Ok
String s= (String)o;  // Ok
Es posible asignar un variable a otra variable de menor rango utilizando un cast.


Object o= new Box(...); // Ok
...
String s= (String)o;  // Ok en compilación

          // ClassCastException en ejecución
Java verifica los casts en ejecución.

Dada v una variable de un tipo no primitivo:

tipo dinámico(v) <= tipo estático(v)

=> Java es robusto.


Pertenencia: instanceof

Object o= ...;
...
if (o instanceof String) {
  String s= (String) o;
  ...
}
else if (o instanceof Grob) {
  Grob go= (Grob) o;
  ...
}
Con instanceof se puede determinar si un objeto pertenece a una clase.


Object o= new Box(...);
...
if (o instanceof String) {
  String s= (String) o;
  ...
}
else if (o instanceof Grob) { // ¡Verdadero!
  Grob go= (Grob) o;
  ...
}
Todos los objetos de la clase Box también pertenecen a Grob.

Todos los objetos pertenecen a Object.