Está en la página 1de 51

Taller de Programación Básica

en java

Facilitadores:

• ISC. MARIBEL BUENO QUIÑONES


• MC. MA. ELENA MONTES ALMANZA
• ME. PEDRO CELESTINO RAMIREZ
HERENCIA Y
POLIMORFISMO
Sobreescritura y Sobrecarga
Herencia.
• Esto es una de las
bases de la extends después
reutilización de del nombre de la
código, en lugar clase.
de copiar y
pegar.
Definir una clase
tomando como Se especifica
•.
base a otra agregando la
clase ya claúsula : class Subclase extends SuperClase{ }
existente.

Los
constructores Al heredar de
son utilizados, una clase
pero no base,
heredados. heredaremos :

• atributos
• métodos,
Mecanismo para extender clases

• Una clase • La clase que


adquiere o hereda hereda se llama • La clase base se
los atributos y subclase. llama superclase.
métodos de otra.

“Un La
objeto de tipo
relación
• Prueba de subclase debe ser
validez: “Es un”
también de tipo
superclase.”
Mecanismo para extender clases
Ejemplo:

Vehiculo

start(): void

extends

Coche

drive(): void
Ejemplo 2:

Variable de instancia

extends
Resultado:
Herencia
Miembros heredados

Una subclase hereda de su superclase (por el


momento):
 Variables de instancia públicas
 Métodos públicos

 Todos los anteriores pueden ser utilizados en la


subclase como si hubieran sido declarados en ella.
Miembros no heredados

 Una subclase no hereda:


 Propiedades privadas
 Constructores

 Los miembros no heredados no pueden


aparecer en el código de la subclase.
Miembros no heredados: variables de instancia
Privadas

 Las variables privadas no son heredadas, por lo


que no pueden aparecer en el código de la
subclase.

 Sin embargo se puede hacer uso indirecto de ellas


en la subclase, a través de los métodos públicos
de manipulación implementados en la respectiva
superclase.

Acceso de miembros private a través de
métodos públicos
Miembros no heredados: Constructores

 Los constructores no son heredados, por lo que


cada subclase debe tener su(s) propio(s)
constructor(es).
 Sin embargo en los constructores se puede invocar

al constructor de la superclase con la instrucción:


 super( lista parámetros )

La instrucción super() debe ser la primera instrucción


del constructor.
Miembros no heredados:
Constructores
Miembros no heredados:
Constructores
Miembros no heredados: Constructores

La llamada al constructor del padre puede ser:


 Implícita:

 Si se omite, se llamará implícitamente al constructor


por defecto
 Equivale a poner como primera sentencia super();

 Si no existe el constructor por defecto en la clase


padre dará un error en tiempo de compilación
Miembros no heredados: Constructores

 Explícita:
 super(); o super(a,b); o …
 Dependiendo de si el constructor al que invocamos
tiene o no argumentos
Miembros no heredados: Constructores
Miembros no heredados: Constructores
Referencias, tipos y subtipos
 Una variable de referencia puede
referenciar objetos del mismo tipo de la
variable (esto ya lo sabíamos).
 Ejemplo:
Persona p = new Persona();
 Una variable de referencia puede
referenciar objetos de cualquier subtipo de
la variable.
 Ejemplos:
Persona p = new Alumno();
Persona p = new Tesista();
Referencias, tipos y subtipos
 clase Object, una variable de este tipo puede
referenciar
 objetos de cualquier tipo. Ejemplos:
Object o = new Persona();
Object o = new Tesista();
Object o = new Lavadora();
Referencias, tipos y subtipos
 En consecuencia, un arreglo de tipo Object puede
almacenar cualquier tipo de objeto en sus
posiciones:
 Object[] arr = new Object[10];
 arr[1] = new Persona();
 arr[2] = new Tesista();
 arr[3] = new Lavadora();
 Una variable de referencia de un
determinado tipo NO puede referenciar
objetos de un supertipo.
 Por
lo anterior, las siguientes asignaciones
NO son válidas:
 Alumno a = new Persona();
 Tesista t = new Alumno();
 Tesista t = new Persona();
Operador instanceof y herencia

Todo objeto es instancia de la clase a la que


pertenece, como también instancia de su
superclase.

Un objeto de la clase lavadora es también un


electrodoméstico
Operador instanceof: ejemplo
Realizar la siguiente actividad…

Ejercicio 5, 6 y 7
Polimorfismo

Hay varias  Cuando invocamos el mismo


formas de nombre de método sobre instancias
polimorfismo de distinta clase (sobreescritura)
 cuando creamos múltiples
constructores
 cuando a través del subtipo asignamos
una instancia de una subclase a una
referencia a la clase base.
Sobreescritura de métodos
 Una subclase puede modificar el
comportamiento heredado de la
superclase, substituyendo class Animal
(overriding) métodos.
duerme()
 La subclase crea un método come()
funcionalmente diferente, pero se reproduce()
con el mismo:
 Nombre class Mamífero
 Tipo de retorno come()
 Lista de Argumentos
class Iguana
duerme() iguana
class Camaleón cambiaColor()

se reproduce ()
come()
duerme()
cambiaColor()
Métodos de Instancia Métodos de Clase

Un método de instancia es Si una subclase define


una subclase con la misma un método de clase con
firma (nombre, más el la misma firma que un
número y tipo de sus
parámetros) y tipo de método de clase en la
regreso que un método de superclase, el método
instancia en la superclase en la subclase esconde
sobreescribe el método de la el que está en la
superclase. superclase.
Sobreescritura de métodos de instancia

public class Empleado { public class Gerente extends Empleado{

protected String nombre ; protected String departamento;

protected double salario;


protected Date Fechanac;

public String getDetalles() {


public String getDetalles() {
return “Nombre: “ + nombre + “\n” + “Salario: “
return “Nombre: “ + nombre + “\n” + + salario + "\n" +
“Salario “ + salario; “Gerente de: “ + departamento;
} }
} }
Sobreescritura de métodos de clase
public class Cat extends Animal {
public static void ClassMethod() {
ystem.out.println("El método de
public class Animal { clase en Cat."); }
public static void ClassMethod() { public void InstanceMethod() {
System.out.println("El
System.out.println("El método
método de clase en Animal.");
de instancia en Cat."); }
}
public static void main(String[]args)
public void InstanceMethod() {
{ Cat myCat = new Cat();
System.out.println("El
método de instancia en Animal myAnimal = myCat;
Animal."); Animal. ClassMethod();
} myAnimal. InstanceMethod();
} }
La salida de este programa es }
como sigue: la versión del método escondido que se invoca es el
El método de clase en Animal. que está en la superclase, y la versión del método
sobreescrito que se invoca es la que está en la
El método de instancia en Cat. subclase.
.

Accediendo a un método
sobreescrito de una Superclase
public class Superclass {
public void printMethod() {
Si su método System.out.println("Impreso en
sobreescribe Superclass.");
uno de los }
métodos de una }

superclase, public class Subclass extends Superclass {


public void printMethod() {
Se puede invocar
al método super.printMethod();
System.out.println("Impreso en
sobreescrito a Subclass");
través del uso de }
la palabra clave public static void main(String[] args) {
super Subclass s = new Subclass();
s.printMethod();
}
}
Impreso en Superclass.
Impreso en Subclass
Ocultamiento de miembros o
atributos

Dentro de una clase, un atributo que tiene el


mismo nombre que el atributo en la
superclase esconde el atributo de la
superclase, incluso si sus tipos son diferentes.

Dentro de la subclase, el campo en la


superclase no se puede referenciar por su
nombre simple. En su lugar, el campo debe
accederse a través de super,
class A {
int i;
}

class UseSuper {
public static void main(String args[]) {
class B extends A {
B subOb = new B(1, 2);
int i; // esta i oculta la i de A

subOb.imprimir ();
B(int a, int b) {
}
super.i = a; // i in A
}
i = b; // i in B
}

void imprimir () {
System.out.println("i en la superclase: " +
super.i);
System.out.println("i en la subclase: " + i);
}
}
Reglas para la sobrescritura

Ambos métodos deben tener:


nombre, El método de la subclase no
puede ser menos accesible que
tipo de retorno* el de la superclase.
y lista de argumentos idénticos.

Definiendo un Método con la Misma Firma que un Método de la Superclase

Método de Instancia de la Método Estático de la


Superclase Superclase

Método de Instancia de la Genera un error en tiempo de


Sobreescribe
Subclase compilación

Método Estático de la Genera un error en tiempo de


Esconde
Subclase compilación
Accesibilidad en los métodos
sobreescritos
public class Electrodomestico{
Electrodoméstico
public boolean encender(){ Encender () : boolean
//hacer algo
Apagar() : boolean
}
public boolean apagar(){
//hacer algo
}
} Tostadora
Encender(int nivel ):
public class Tostadora extends Electrodomestico{ boolean

private boolean encender(int nivel){


//hacer algo
}
}
Accesibilidad en los métodos
sobreescritos

public class Padre { public class UsoAmbos {


public void hacerAlgo() { } public void hacerOtraCosa() {
} Padre p1 = new Padre();
public class Hijo extends Padre { Padre p2 = new Hijo();
private void hacerAlgo() { } p1. hacerAlgo();
// inválido, hacerAlgo() de Hijo es menos p2. hacerAlgo();
// accesible que HacerAlgo de Padre // inválido, hacerOtraCosa de Hijo no es visible

} }
}
Sobrecarga de métodos

En una subclase,
usted puede
sobrecargar el
Los métodos se método
diferencian por El tipo de valor heredado de la
el nombre del retornado no superclase.
Una clase método y forma parte de
puede tener --Tales métodos
cantidad, tipo, la firma del sobrecargados
más de un orden de sus método (no es
método con el no esconden ni
parámetros. utilizado para sobreescriben
mismo nombre distinguir entre
Esto constituye los métodos de
la firma del métodos) la superclase—
método solamente son
nuevos métodos,
únicos a la
subclase.
Ejemplo de sobrecarga
public class Electrodomestico{
Electrodoméstico
public boolean encender(){ Encender () : boolean
//hacer algo Apagar() : boolean
}
public boolean apagar(){
//hacer algo
}
} Tostadora
Encender(int nivel ):
public class Tostadora extends Electrodomestico{ boolean

public boolean encender(int nivel){


//hacer algo
}
}
Métodos con argumentos variables.

 Forma tradicional  Los métodos se invocan de la siguiente


public class Statistics { manera:
public float average(int x1, int x2) { } Statistics stats = new Statistics( );
float prom1 = stats.average(4, 5, 6);
public float average(int x1, int x2, int x3) { }
public float average(int x1, float x2, int x3,
float prom2 = stats.average (4, 5.0, 6, 7);
int x4) { }
}
Realizar la siguiente actividad…

Ejercicio 4 y 5 con sobrecarga y


sobreescritura
La palabra clave super.

 super se utiliza en una clase para hacer


referencia a miembros (atributos y métodos) de una
superclase
 No necesariamente la superclase inmediata
superior.
 También para constructores.
La palabra clave super.
 ;  return
public class Gerente extends Empleado{
public class Empleado {
protected String nombre ; protectedsuper.getDetails()
String departamento; +
protected double salario; "\nDepartment:
public String getDetalles() { "+
return super.getDetalles() + "\nDepartamento:
protected Date Fechanac; department
" + departamento;
public String getDetalles() { }
return “Nombre: “ + nombre + “\n” +
“Salario “ + salario;
}
}
Sobrecarga de constructores.

 Igual que los métodos, los constructores pueden ser


sobrecargados.

• Ejemplo:
public Empleado(String nombre, double salario, Date fechaNac)
public Empleado(String nombre, double salario)
public Empleado(String nombre, Date fechaNac)

 Se puede usar la referencia super en la primera línea de


un constructor para llamar a otro constructor
Invocación de constructores.

 Para invocar al constructor de la superclase, se debe colocar un postulado
super () en la primera línea del constructor de la subclase.

 Se puede invocar un constructor en particular utilizando


diferente lista de argumentos en super().
 Si no aparece super() como primera línea, el compilador
inserta una llamada al constructor sin argumentos de la
superclase.
 Si la superclase no tiene constructor sin argumentos,
marca error de compilación.
Uso de this

 Se usa cuando el método necesita hacer referencia al objeto que lo invocó.

 Para resolver redundancia en los nombres

 Cuando se declara un argumento para un método Java, se proporciona el nombre para ese
argumento.
 Este nombre es utilizado dentro del cuerpo del método para referirse al valor del argumento.

 Un argumento de un método puede tener el mismo nombre que una variable de la clase.
 En este caso, se dice que el argumento oculta a la variable miembro.
 Normalmente los argumentos que ocultan una variable miembro se utilizan en los constructores
para inicializar una clase.
Uso de this
 Los nombres de argumentos ocultan los nombres de las variables miembro.
 Por eso utilizar x, y o radius dentro del cuerpo de la función, se refiere a los argumentos, no a
las variables miembro.
 Para acceder a las variables miembro, se las debe referenciar a través de this--el objeto actual.

 classCircle{
 intx, y, radius;
 publicCircle(intx, inty, intradius) {
 this.x= x;
 this.y= y;
 this.radius= radius;
 }
 }

También podría gustarte