Definiciones: una clase que se deriva de otra clase se denomina subclase (también una clase derivada , clase extendida o clase hija ). La clase de la cual se deriva la subclase se denomina superclase (también una clase base o una clase principal ).
Una subclase hereda todos los miembros públicos y protegidos de su elemento primario, sin importar en qué paquete esté la subclase.
Si la subclase está en el mismo paquete que su elemento primario, también hereda los miembros privados del paquete del elemento primario. Puede usar los miembros heredados tal como están, reemplazarlos, ocultarlos o complementarlos con nuevos miembros:
Los campos heredados se pueden usar directamente, al igual que cualquier otro campo.
Puede declarar un campo en la subclase con el mismo nombre que el de la superclase, escondiéndolo así (no recomendado).
Puede declarar nuevos campos en la subclase que no están en la superclase.
Los métodos heredados se pueden usar directamente tal como son.
Puede escribir un nuevo método de instancia en la subclase que tenga la misma firma que el de la superclase, anulándola así.
Puede escribir un nuevo método estático en la subclase que tenga la misma firma que el de la superclase y así ocultarlo .
Puede declarar nuevos métodos en la subclase que no están en la superclase.
Puede escribir un constructor de subclase que invoca el constructor de la superclase, implícitamente o utilizando la palabra clave super.
Una subclase no hereda los privatemiembros de su clase principal. Sin embargo, si la superclase tiene métodos públicos o protegidos para acceder a sus campos privados, estos también pueden ser utilizados por la subclase.
#conversión implícita
Casting muestra el uso de un objeto de un tipo en lugar de otro tipo, entre los objetos permitidos por la herencia y las implementaciones. Por ejemplo, si escribimos
Object obj = new MountainBike ();
entonces obj es ambos an Object y a MountainBike(hasta el momento en que obj se le asigna otro objeto que no es a MountainBike). Esto se llama conversión implícita .
Si, por otro lado, escribimos
MountainBike myBike = obj;
obtendríamos un error en tiempo de compilación porque objel compilador no sabe que es a MountainBike. Sin embargo, podemos decirle al compilador que prometemos asignar un MountainBikea obj mediante conversión explícita:
MountainBike myBike = (MountainBike) obj;