Está en la página 1de 17

CLASE ABSTRACTA EN JAVA

PROGRAMACIÓN AVANZADA
ANGELA CARRILLO RAMOS
CLASE ABSTRACTA
Clase sin instancias
• Atributos: puede o no tener atributos
• Métodos:
• No tiene métodos o algunos de ellos no tienen implementación
• Pueden tener constructor pero no se puede instanciar un objeto
• Se definen como:
public abstract class NomClase{…}
• Los métodos que NO tienen implementación, tienen abstract:
public abstract void nomMetodo(…..);
Como todas las SubClases de Bachiller
redefinen el método estudiar, la clase
Bachiller puede pasar a ser Abstracta

CLASE ABSTRACTA

X
Bachiller
estudiar () Estudian como lo
cumplirActividades() hacían en el colegio

Ingeniero Médico Científico de Datos Diseñador Industrial


estudiar () estudiar () estudiar ()
calcular() prescribirMed() analizarDatos() estudiar ()
diseñar()

Estudian basados en Estudian basados en Estudian basados en Estudian con Creatividad


procesos y técnicas teorías de Medicina teorías de Estadística
con ingenio
CLASE ABSTRACTA
public abstract class Bachiller{
… Método Abstracto

public abstract void estudiar();

public void cumplirActividades(){ Método Concreto


….
}
}
CLASE ABSTRACTA
public class Medico{ Implementación del
… método Abstracto
de Bachiller
public void estudiar(){

} Método Concreto
de Médico
public void prescribirMed(){
….
}
}
Falta implementación del
método estudiar() que es
abstracto de Bachiller
CLASE ABSTRACTA
public abstract class Ingeniero{
… Método Concreto
public void calcular(){ de Ingeniero

….
}
Una clase es abstracta si:
} • Tiene específicamente un método
abstracto
• Hereda un método abstracto y NO lo
implementa
CONTENEDOR POLIMÓRFICO Sin problema pues a una instancia de la
SuperClase(Bachiller) le están asignando
una instancia de una de sus SubClases, así
Bachiller sea abstracta
List<Bachiller> estudiantes=new ArrayList<Bachiller>();
estudiantes.add (new Cientifico());
estudiantes.add (new Ingeniero());
estudiantes.add (new Ingeniero()); estudiantes
estudiantes.add (new Medico());
C I I M D
estudiantes.add (new Diseñador());
CONTENEDOR POLIMÓRFICO
¿Para recuperar?
• instanceof
• casting

estudiantes

C I I M D
CONTENEDOR POLIMÓRFICO – INVOCACIÓN DE
MÉTODOS
¿Cuántos ingenieros hay?
int cuantos=0;
for (Bachiller b:estudiantes){
if (b instanceof Ingeniero)
cuantos++; estudiantes
}
C I I M D
CONTENEDOR POLIMÓRFICO – INVOCACIÓN DE
MÉTODOS Sólo cuando se tiene en d al Diseñador, es
que se le pueden solicitar sus propios
Se le pide a los Diseñadores que diseñen servicios.
Se debe hacer un casting a Diseñador
for (Bachiller b:estudiantes){ Bachiller no conoce a Diseñador y menos sus
if (b instanceof Diseñador){ servicios.

Diseñador d=(Diseñador) b;
d.diseñar();
estudiantes
}
}
C I I M D
Aunque b se refiere a un Bachiller, en cada
casilla se tiene una instancia de una de sus
INVOCACIÓN DE MÉTODOS subclases y cuando le piden que “estudien”,
se invoca cómo estudia cada una de sus
subclases y más que no tiene
implementación de estudiar() en Bachiller

for (Bachiller b:estudiantes){


b.estudiar();
}

estudiantes

C I I M D
Los únicos que saben calcular son los
Ingenieros y b al ser Bachiller, no hace
INVOCACIÓN DE MÉTODOS esta tarea, así en la posición 1 y 2 haya
Ingenieros.

for (Bachiller b:estudiantes){

}
b.calcular();
X
estudiantes

C I I M D
CONTENEDOR POLIMÓRFICO – INVOCACIÓN DE
MÉTODOS
Sólo cuando se tiene en i al Ingeniero, es
que se le pueden solicitar sus propios
Sólo se le puede pedir a los Ingenieros que calculen servicios.
Se debe hacer un casting a Ingeniero
for (Bachiller b:estudiantes){
Bachiller no conoce a Ingeniero y menos
if (b instanceof Ingeniero){ sus servicios.

Ingeniero i=(Ingeniero) b;
i.calcular();
estudiantes
}
}
C I I M D
CLASE ABSTRACTA
FigGeo
- numLados: int Deja que sus subclases
calculen a su manera
darNumLados()
su área y perímetro
calcularArea ()
calcularPerimetro()

Cuadrado Triangulo Rectángulo TrianguloRectangulo


- lado: int - base: int - base: int - cateto1: int
- altura: int - altura: int - cateto2: int
calcularArea () calcularArea () calcularArea () calcularArea ()
calcularPerimetro() calcularPerimetro() calcularPerimetro() calcularPerimetro()
Área: (base*altura/2) Área: base*altura calcularHipotenusa()
Área: lado*lado
Perímetro: 4*lado Perímetro: sumar los Perímetro: 2* (base+altura) Área: (cateto1*cateto2/2)
tres lados Perímetro: c1+c2+h
CLASE ABSTRACTA
public abstract class FigGeo{
private int numLados; ¡Constructor!

public FigGeo(int nl){


numLados=nl;
}
public abstract float calcularArea(); Métodos Abstractos
public abstract float calcularPerimetro();
public int darNumLados(){
return numLados; Método Concreto
}
}
CLASE CONCRETA
public class Cuadrado extends FigGeo{
private int lado; Constructor

public Cuadrado(int lado){


super(4);
this.lado=lado; }
Implementación de
public float calcularArea() {return lado*lado; } métodos abstractos
public float calcularPerimetro(){ return lado*4} de FigGeo

public int darLado(){


return lado; Método Concreto
}
}
AHORA…

Revisar el material código complementario y el


taller de Figura Geométrica

También podría gustarte