Documentos de Académico
Documentos de Profesional
Documentos de Cultura
• Herencia
• La palabra clave extends
• Sobrescritura
• La palabra clave super
• Upcasting-Downcasting
• La clase Object
• Los métodos equals(Object) y toString()
• Clases abstractas
A
(superclase)
• La clase que hereda se llama subclase o clase
derivada. La clase B es subclase de la clase A.
• La clase A es la superclase o clase base de la B
clase B. (subclase)
Variables y métodos
de instancia comunes superclase
a todos los vehículos
subclases
double p= miAuto.getPrecio();
String c= miAuto.getTipoCombustible();
Un objeto Camion es
if (miAuto.esUsado()) {.. .} un Vehiculo
// getter y setter
}
Algoritmos y Estructuras de Datos 2021
Herencia
Sobrescritura de métodos – La palabra clave super
public class Vehiculo {
private String marca;
private double precio; ¿Es posible invocar al método
. . . detalles() de la clase Vehiculo desde
un método de la clase Camion?
public String detalles() {
return “Vehiculo marca: "+ getMarca()+
"\n” + "Precio: "+ getPrecio(); SI!!!!!
}
. . .
}
¿Cómo?
public class Camion extends Vehiculo { Usando la palabra clave super
private boolean tieneDobleCaja;
private int cargaMaxima;
downcasting
upcasting
El upcasting es seguro, la clase base tiene una interface que es igual o es un subconjunto de
la clase derivada. Pero, en el downcasting no ocurre lo mismo.
Algoritmos y Estructuras de Datos 2021
Herencia
Sobrescritura de métodos
upcasting
¿Qué imprime?
Vehiculo vc = new Camion();
vc.setMarca("Mercedes Benz");
vc.setPrecio(35120.4);
vc.setCargaMaxima(3000); No está visible para Vehiculo
System.out.println(vc.detalles());
NO Compila
clases
métodos
abstractos concretas
FiguraGeometrica es una clase abstracta y los métodos area() y dibujar() son abstractos.
Para que las subclases Rectangulo, Rombo y Circulo sean concretas, deben proveer una
implementación de cada uno de los método abstractos de la clase FiguraGeométrica.
elemento(3)
resultado:
• incluye(Integer elem): retorna true si elem está contenido en la lista, false en caso
contrario
incluye(13)
resultado: true
incluye(7)
resultado: false
agregarInicio(3)
resultado:
agregarFinal(3)
resultado:
agregarEn(5,4)
resultado:
eliminarEn(3)
resultado:
eliminar(13)
resultado:
null
inicio final
lista1
null
Referencias
clase abstracta (letra cursiva)
clase concreta
método público abstracto (+)
método público concreto (+)
atributo privado (-)
Trabajo Práctico 2
Encapsulamiento y abstracción
La clase abstracta ListaDeEnteros
package tp03.ejercicio2;
public abstract class ListaDeEnteros {
public abstract void comenzar();
public abstract Integer proximo();
public abstract boolean fin();
n
ul
Trabajo Práctico 2
Encapsulamiento y abstracción
Lista de enteros implementada con un arreglo
public class ListaDeEnterosConArreglos extends ListaDeEnteros {
private int tamanio;
private int[] datos = new int[200];
private int actual = 0;
@Override
public void comenzar() {
actual = 0;
}
@Override
public Integer proximo() {
return datos[actual++];
}
@Override
public boolean fin() { l.comenzar();
return actual==tamanio;
}
@Override
public Integer elemento(int pos) {
return datos[pos-1];
}
@Override
public boolean agregarEn(Integer elem, int pos) {
if (pos<1 || pos>tamanio+1 || pos>datos.length || tamanio==datos.length)
return false;
tamanio++;
for (int i = tamanio; i >= pos; i--)
datos[i] = datos[i - 1];
datos[pos-1] = elem; NOTA: @override indica que se está
return true; sobrescribiendo un método de la superclase y el
} compilador informa un error en caso de no exisitir el
. . .} método en la superclase
Algoritmos y Estructuras de Datos 2021
Trabajo Práctico 2
Encapsulamiento y abstracción
Lista de enteros implementada con nodos enlazados
public class ListaDeEnterosEnlazada extends ListaDeEnteros {
Por ejemplo podría
private NodoEntero inicio; referenciar a este nodo
private NodoEntero actual;
private NodoEntero fin;
private int tamanio;
@Override public class NodoEntero {
public void comenzar() { private Integer dato;
actual = inicio; private NodoEntero siguiente;
} public Integer getDato() {
@Override return dato;
public Integer proximo() { }
Integer elto = actual.getDato(); public void setDato(Integer dato) {
actual = actual.getSiguiente(); this.dato = dato;
return elto; }
} public NodoEntero getSiguiente() {
@Override return siguiente;
public boolean fin() { }
return (actual==null); public void setSiguiente(NodoEntero siguiente){
} this.siguiente = siguiente;
@Override }
public boolean incluye(Integer elem) { }
NodoEntero n = this.inicio;
while (!(n == null) && !(n.getDato().equals(elem))) El uso es igual a la de Lista con arreglos, solo se cambia la
n = n.getSiguiente(); instanciación. La clases concretas no agregan métodos nuevo, por ello
return !(n == null); los métodos que se pueden invocar son los definidos en la clase
} abstracta.
@Override
public boolean esVacia() {
return (inicio == null);
}
. . . }
Algoritmos y Estructuras de Datos 2021
Trabajo Práctico 2
Encapsulamiento y abstracción
Ejemplo de uso de una lista desde otra clase que está en otro paquete.
package tp03.ejercicio2;
import tp03.ejercicio1.ListaDeEnteros;
import tp03.ejercicio1.ListaDeEnterosEnlazada;
Usando Object:
Ventajas: Se logra una
public class ListaConArreglos { estructura genérica
private Object[] datos = new Object[200]; Desventajas: El com
pilador pierde la opor
private int actual; realizar chequeos y se de tunidad de
. . . be hacer uso de casting
}
Cuando se instancian las estructuras se debe definir el tipo de los objetos que en ella se almacenarán:
ListaEnlazadaGenerica<Integer> lista = new ListaEnlazadaGenerica<Integer>();
lista.agregarFinal(new Integer(50));
lista.agregarFinal(new String(“Hola”)); 🡺 error de compilación
lista.comenzar();
Integer x = lista.proximo(); 🡺 no necesitamos castear
lista.comenzar();
Alumno a = lista.proximo(); 🡺 no necesitamos castear
public T getDato() {
return dato;
}
. . .
}