Documente Academic
Documente Profesional
Documente Cultură
CLASE DERIVADA
La clase derivada heredar los miembros dato de la clase base y las
funciones miembro, y tendr un miembro dato ms, el ttulo de la ventana.
public class VentanaTitulo extends Ventana{
protected String titulo;
public VentanaTitulo(int x, int y, int w, int h, String nombre) {
super(x, y, w, h);
titulo=nombre;
}
extends es la palabra reservada que indica que la
clase VentanaTitulo deriva, o es una subclase, de la clase Ventana.
La primera sentencia del constructor de la clase derivada es una llamada al
constructor de la clase base mediante la palabra reservada super. La
llamada
super(x, y, w, h);
inicializa los cuatro miembros dato de la clase
base Ventana: x, y, ancho, alto. A continuacin, se inicializa los miembros
dato de la clase derivada, y se realizan las tareas de inicializacin que sean
necesarias. Si no se llama explcitamente al constructor de la clase base
Java lo realiza por nosotros, llamando al constructor por defecto si existe.
La funcin miembro denominada desplazar cambia la posicin de la
ventana, aadindoles el desplazamiento.
public void desplazar(int dx, int dy){
x+=dx;
y+=dy;
}
Redefine la funcin miembro mostrar para mostrar una ventana con un
ttulo.
public void mostrar(){
super.mostrar();
System.out.println("titulo
: "+titulo);
}
En la clase derivada se define una funcin que tiene el mismo nombre y los
mismos parmetros que la de la clase base. Se dice que redefinimos la
funcin mostrar en la clase derivada. La funcin miembromostrar de la clase
derivada VentanaTitulo hace una llamada a la funcin mostrar de la clase
base Ventana, mediante
super.mostrar();
De este modo aprovechamos el cdigo ya escrito, y le aadimos el cdigo
que describe la nueva funcionalidad de la ventana por ejemplo, que muestre
el ttulo.
Si nos olvidamos de poner la palabra reservada super llamando a la
funcin mostrar, tendramos una funcin recursiva. La
funcin mostrar llamara a mostrar indefinidamente.
public void mostrar(){ //ojo!, funcin recursiva
System.out.println("titulo
: "+titulo);
mostrar();
}
La definicin de la clase derivada VentanaTitulo, ser la siguiente.
package ventana;
public class VentanaTitulo extends Ventana{
protected String titulo;
public VentanaTitulo(int x, int y, int w, int h, String nombre) {
super(x, y, w, h);
titulo=nombre;
}
1 package com.clubprogramador;
2 class ClasePorDefecto{}
1 package com.clubprogramador;
2
3 public final class ClaseFinal {
4
5}
1 package com.clubprogramador;
2
3 public abstract class ClaseAbstracta {
4
5 public abstract void getAbstracta();
6}
HERENCIA
La idea de la herencia es permitir la creacin de nuevas clases basadas en
clases existentes.
Cuando heredamos de una clase existente, reusamos (o heredamos)
mtodos y campos, y agregamos nuevos campos y mtodos para cumplir
con la situacin nueva.
Cada vez que encontremos la relacin "es-un" entre dos clases, estamos
ante la presencia de herencia.
La clase ya existente es llamada superclass, o clase base, o clase padre.
La clase nueva es llamada subclase, clase derivada, o clase hija.
A travs de la herencia podemos agregar nuevos campos, y podemos
agregar o sobre montar mtodos (override). Sobre montar un mtodo es
redefinirlo en la case heredada.
Estudio de ejemplos: ManagerTest.java
Destacar uso de super para invocar al constructor de la clase base y para
invocar a mtodos sobremontados.
Jerarqua de Herencia
HERENCIA MULTIPLE
Herencia mltiple
La herencia mltiple, consiste en la utilizacin de las propiedades de una
clase a varias clases ms, lo que significa que en esta propiedad una sola
clase padre puede heredarle atributos, u objetos de esta a varias clases hijo
sin ninguna limitacin entre ellas.
El nico problema de la herencia mltiple, es que es manejable en varias
plataformas para programar, pero en Java no existe el concepto de la
herencia mltiple, ose ase que Java no es capas de manejar algn mtodo
para poder heredar a ms de una clase hija.
HERENCIA SIMPLE
La herencia simple consiste en cuando una clase, hereda a una clase hijo, y
a solo una le hereda sus atributos, es igual al concepto general de herencia,
con la limitante de solo poder heredar de una clase padre a una clase hijo, y
solo a una clase hijo
Un ejemplo de herencia simple en Java es la siguiente:
Public class animal{
Public String ojos;
Public String color;
Public int patas;
Public void patas(){
...
}
}
REDEFINICION
La clase base Object de todas las clases en el lenguaje Java, tiene una
funcin miembro denominada clone, que se redefine en la clase derivada
para realizar una duplicacin de un objeto de dicha clase.
Sea la clase Punto ya estudiada en pginas anteriores. Para hacer una copia
de un objeto de esta clase, se ha de agregar a la misma el siguiente cdigo:
se ha de implementar el interface Cloneable
se ha de redefinir la funcin miembro clone de la clase base Object
public class Punto implements Cloneable{
private int x;
private int y;
//constructores ...
RELACION IS-A
La herencia se encuentra en cualquier lugar en Java. Es seguro decir que es
prcticamente imposible escribir el programa ms pequeo en Java sin usar
la herencia. Veamos el siguiente cdigo:
1
class Test {
2
public static void main(String[] args){
3
Test t1 = new Test();
4
Test t2 = new Test();
5
if (!t1.equals(t2))
6
System.out.println("No son iguales");
7
if (t1 instanceof Object)
8
System.out.println("T1 es un objeto");
9
}
10
}
11
Produce lo siguiente:
1
No son iguales
2
T1 es un objeto
3
Nos preguntamos algo, De dnde viene el mtodo equals?. La variable de
referencia t1 es del tipo Test, y no hay ningn mtodo equals en la clase
Test. El segundo test realizado con if pregunta si t1 es una instancia de la
clase Object, y como esto es as, el test es completado.
Esto pasa porque todas las clases en Java son subclases de la clase Object.
En otras palabras, todas las clases que usemos o escribamos heredarn de
la clase Object. Siempre tendremos un mtodo equals, un
mtodo clone, notify, wait, y otros, disponibles para su uso. All donde
creemos una clase, automticamente hereda todos los mtodos de la clase
Object.
SUPER
Si se necesita llamar al mtodo padre dentro de una clase que ha
reemplazado ese mtodo, se puede hacer referencia al mtodo padre con la
palabra clave super:
import MiClase;
public class MiNuevaClase extends MiClase {
public void Suma_a_i( int j ) {
i = i + ( j/2 );
super.Suma_a_i( j );
}
}
En el siguiente cdigo, el constructor establecer el valor de i a 10, despus
lo cambiar a 15 y finalmente el mtodo Suma_a_i() de la clase
padre MiClase lo dejar en 25:
MiNuevaClase mnc;
mnc = new MiNuevaClase();
mnc.Suma_a_i( 10 );
super es un concepto que no existe en C++, al menos no con una
implementacin similar a Java. Si un mtodo sobreescribe un mtodo de su
superclase, se puede utilizar la palabra clave super para eludir la versin
sobreescrita de la clase e invocar a la versin original del mtodo en la
supreclase. Del mismo modo, se puede utilizar super para acceder a
variables miembro de la superclase.
Bibliografa
http://www.unalmed.edu.co/~jaguzman/docencia_archivos/objetos/diapositiv
as/8-Clases%20abstractas.pdf
http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/herencia/herencia
.htm#La clase base
http://www.mundojava.net/definicion-de-constructores-de-una-clase.html?
Pg=java_inicial_4_4_5.html
http://www.elclubdelprogramador.com/2011/08/28/java-declaracion-declases-y-modificadores-de-acceso/
http://chilejava.blogspot.com/2013/05/especificadores-de-acceso.html
Ejercicios y Problemas
Ejercicios
13.1 Implementar una clase Automvil dentro de una jerarqua de
herencia; considerar que adems de ser un vehculo, un automvil
es tambin una comodidad, un smbolo de estado social, un modo
de transporte, etctera.
package ejercicio1.3.;
import java.util.Scanner;
public class TestPrincipal {
numPas1=Integer.parseInt(numPas);
j=true;
} catch (Exception e) {
System.out.println("Ingrese el nmero de pasajerps que su
vejiculo puede llevar");
numPas=sc.next();
j=false;
}
}
car=new Automovil(placa, marca, prop, paisOrig, numPas1);
System.out.println(car);
}
}
// CLASES BASE
class ANIMAL {
}
// PRIMERA DERIVADA
class AEREO extends ANIMAL {
}
class TERRESTRE extends ANIMAL {
}
class MARINO extends ANIMAL {
}
//SEGUNDA DERIVADA
class VIVIPARO extends TERRESTRE {
}
class OVIPARO extends AEREO {
}
//TERCERA DERIVADA
class AVES extends OVIPARO {
}
class MAMIFEROS extends VIVIPARO {
}
// CUARTA DERIVADA
class PLUMA extends AVES {
}
class PELO extends MAMIFEROS {
}
//QUINTA DERIVADA
class PERROS extends PELO {
}
class GOLONDRINA extends PLUMA {
}
// SEXTA DERIVADA
class PATAS extends PERROS {
}
class ALAS extends GOLONDRINA {
}
}
13.3 Deducir las clases necesarias para disear un programa con diferentes tipos de juegos de cartas.
Esta referencia tambin se usa para invocar cualquier mtodo del padre.
Se sabe que java soporta herencia, con lo cual una clase puede ser la hija
de otra, o dicho de otro modo, extenderla.
por ejemplo
class Padre {
public String getName() {
return "Jose";
}
}
class Hijo extends Padre {
public String getName() {
return "Pablo";
}
}
Utilizas super si desde la clase Hijo quieres hacer referencia a la clase Padre,
por ejemplo, si desde la clase hijo quisieras invocar el metodo "getName()"
de la clase padre para que te devuelva "Jose" deberias llamar anteponiendo
super (super.getName()), de otra forma siempre obtendrias "Pablo"
this es ms sencillo, pues, hace referencia a la instancia actual de la clase,
se utiliza en ciertos casos puntuales.
Problemas
13.1 Definir una clase base Persona que contenga informacin de
propsito general comn a toda la gente (nombre, direccin, fecha de
nacimiento, sexo, etc.); disear una jerarqua de clases que contemple
las siguientes: Estudiante, Empleado y EstudianteEmpleado; escribir
un programa que lea del dispositivo estndar de entrada los datos
para crear una lista de personas: a) general; b) estudiantes; c)
empleados; d) estudiantes empleados. El programa deber permitir
ordenar alfabticamente por el primer apellido.
package ejercicio13.pkg1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
/**
*
* @author Lili
*/
public class Main {
Scanner dato=new Scanner(System.in);
Persona persona=ingresarDatos1();
System.out.println("Ingrese el nmero de carnet: ");
String carnet=dato.next();
return new
Estudiante( carnet,persona.getNombre(),persona.getDireccion(),
persona.getSexo());
}
String eleccion=dato.next();
boolean mayorDeEdad;
if (eleccion.equals("1")) {
mayorDeEdad=true;
}else{
mayorDeEdad=false;
}
return new
Empleado(mayorDeEdad,persona.getNombre(),persona.getDireccion(),perso
na.getSexo());
}
public EstudianteEmpleado ingresarDatos4(){
Empleado empleado=ingresarDatos3();
System.out.println("Ingrese el carnet");
String carnet=dato.next();
return new EstudianteEmpleado(carnet, empleado.isMayorDeEdad(),
empleado.getNombre(), empleado.getDireccion(), empleado.getSexo());
}
public static void main(String[] args) {
ArrayList<Persona> listA = new ArrayList();
Main menu=new Main();
System.out.println("\tPERSONA");
listA.add(menu.ingresarDatos1());
System.out.println("\tESTUDIANTE");
listA.add(menu.ingresarDatos2());
System.out.println("\tEMPLEADO");
listA.add(menu.ingresarDatos3());
System.out.println("\tESTUDIANTE-EMPLEADO");
listA.add(menu.ingresarDatos4());
System.out.println("Lista sin ordenar");
for (Persona persona : listA) {
int i=1;
System.out.println(i+".- "+persona.toString());
}
Collections.sort(listA);
System.out.println("Lista ordenada");
for (Persona persona : listA) {
int i=1;
System.out.println(i+".- "+persona.toString());
}
}
class
}
class
}
class
}
class
}
class Socrates extends bibliograficos {
}
class Descartes extends bibliograficos {
}
class Pitagoras extends bibliograficos {
}
class ElonLagesLima extends bibliograficos {
}
}
public class Derivada2 extends Derivada1 {
public void f() {
System.out.println("f() :clase Derivada2 !");
}
public void g() {
System.out.println("g() :clase Derivada2 !" );
}
}
public class Anula {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Base b = new Base();
Derivada1 d1 = new Derivada1();
Derivada2 d2 = new Derivada2();
Base p = b;
p.f();
p.g();
p = d1;
p.f();
p.g();
p = d2;
p.f();
p.g();
}
}
Cul es el resultado de ejecutar este programa? Por qu?