Herencia
APARTADOS
Herencia |
Control de acceso |
La herencia permite la creación de nuevas clases definidas en términos de clases ya existentes. Si disponemos de la clase cPunto, se podrá definir la clase cCírculo en base a la clase cPunto.
La palabra reservada "extends" se usa para definir una subclase (especialización). Se dice que la subclase hereda o deriva de la superclase sobre la cual se ha definido.
La subclase heredará propiedades y métodos de la superclase.
En Java una clase solamente podrá tener una superclase (por tanto no admite herencia múltiple)
A continuación se va a ver un ejemplo muy sencillo de herencia:
//*************************************cEmpleado.java*******************************************
//NOTA IMPORTANTE: Para resumir el código no se ha incluido el bloque de código de las clases "cPersona" y "cEntrada"
//Decripción: Implementación de la clase
cEmpleado, la cual realiza una herencia de la clase cPersona //AQUÍ VENDRÍA EL CÓDIGO DE cPersona Y cEntrada /La sintaxis para declarar una subclase
sería la siguiente: class cEmpleado extends cPersona |
||
private double saldo; |
||
//MUY IMPORTANTE-> ASÍ
SE LLAMARÁ AL CONSTRUCTOR DE LA SUPERCLASE: //LA LLAMADA AL CONSTRUCTOR DE LA SUPERCLASE
TENDRÁ QUE SER LA PRIMERA this.saldo = saldo; |
||
} //En Java no se pueden definir parámetros con valores por defecto, es decir, la sentencia "public cEmpleado(double saldo=0)" es incorrecta. // Para poder realizar un comportamiento
similar, habrá que definir el constructor con dos versiones: versión
en la que se ha pasado el parámetro y //versión en la que
se no ha enviado ningún parámetro. |
||
super(); this.saldo = 0; |
||
} public double getSaldo(){return saldo;} |
||
this.saldo = saldo; | ||
} public void visualiza() { |
||
//Se llama primero al visualiza de la superclase super.visualiza(); System.out.println("Saldo: " + saldo); |
||
} public static void main(String args[]) { |
||
cEmpleado empleado1; System.out.println("************************************"); System.out.print("Nombre: "); //Se instancia la clase(se crea el objeto).
Por tanto se llamará al constructor //Sentencias para probar el objeto creado |
||
} | ||
} |
EJERCICIO: Definir la clase cPunto. Ésta contendrá como mínimo las propiedades necesarias para almancenar las coordenas sobre las cuales está situado (en 2 dimensiones). Posteriormente implementar la clase cCirculo en base a la clase cPunto. La clase cCírculo contendrá el radio del mismo. y métodos para el cálculo de la superficie y la longitud. NOTA: Definir la constante PI.
EJERCICIO: Realizar un programa que implemente el siguiente diagrama:
Fórmula: atracción partículas:
(G*p1.masa* p2.masa )/ (( d i s t a n c i a (p1, p2 ))^2 );
Siendo p1 y p2 las dos partículas y G = 6.67e-11
Los métodos y las propiedades de una clase pueden ser definidos como public, protected, private o friendly. La sintaxis sería la siguiente:
[control_acceso] cabecera_suprograma. Ejemplo: public void accesoPublico()
El siguiente ejemplo refleja que mientras no se produzca herencia no afectan, en absoluto, los modificadores de control de acceso:
//Descripción: Pruebas de control de acceso. //Autor: Daniel Leyva Cortés //Contacto: transistor47@hotmail.com //Cuando se ejecute este programa no aparecerá ningún tipo de error class cControlAcceso |
||
private int propiedadPrivate; public int propiedadPublic; protected int propiedadProtected; //Recordad que si no se indica ningún especificador de acceso tomará //por defecto "friendly" int propiedadFriendly; public cControlAcceso() { |
||
propiedadPrivate = 0; propiedadPublic = 1; propiedadProtected = 2; propiedadFriendly = 3; |
||
}
public void setPropiedadPrivate(int valor) |
||
propiedadPrivate=valor; | ||
} public static void main(String args[]) { |
||
cControlAcceso control = new cControlAcceso();
control.setPropiedadPrivate(3); |
||
} | ||
} |
En el siguiente ejemplo sí se aplica el mecanismo de herencia. Se ilustra el comportamiento del control de acceso "private" y la aplicación por defecto "friendly":
/Descripción: Segunda prueba de control de acceso. //verificar el acceso //Autor: Daniel Leyva Cortés //Contacto: transistor47@hotmail.com //Cuando se ejecute este programa no aparecerá ningún tipo de error class cControlAcceso |
||
private int propiedadPrivate; public int propiedadPublic; protected int propiedadProtected; int propiedadFriendly; public cControlAcceso() { |
||
propiedadPrivate = 0; propiedadPublic = 1; propiedadProtected = 2; propiedadFriendly = 3; |
||
} public int getPropiedadPublic() { |
||
return(propiedadPublic); | ||
} private int getPropiedadPrivate() { |
||
return(propiedadPrivate); | ||
} protected int getPropiedadProtected() { |
||
return(propiedadProtected); | ||
} //método "friendly" int getPropiedadFriendly() { |
||
return(propiedadFriendly); | ||
} | ||
} class cControlAcceso2 extends cControlAcceso |
||
public static void main(String args[]) { |
||
cControlAcceso2 control = new cControlAcceso2();
//Si
estuviese la siguiente sentencia: System.out.println("Propiedad publica:" + control.getPropiedadPublic()); |
||
} | ||
} |
El siguiente ejemplo refleja la aplicación del control de acceso "protected":
//Descripción: Tercera prueba de control de acceso. //Autor: Daniel Leyva Cortés //Contacto: transistor47@hotmail.com class cControlAcceso |
||
protected int propiedadProtected; public cControlAcceso() { |
||
propiedadProtected=1; | ||
} | ||
} class cControlAcceso2 extends cControlAcceso |
||
public int devPropiedadProtected() { |
||
return(propiedadProtected); | ||
} | ||
} class cControlAcceso3 extends cControlAcceso2 |
||
public static void main(String args[]) { |
||
cControlAcceso3 control = new cControlAcceso3(); System.out.println("Propiedad protegida: " + control.propiedadProtected); |
||
} | ||
} //Resultado de ejecución: |