T 4.-P O O - C .: EMA Rogramación Rientada A Bjetos Lases Objetivos
T 4.-P O O - C .: EMA Rogramación Rientada A Bjetos Lases Objetivos
T 4.-P O O - C .: EMA Rogramación Rientada A Bjetos Lases Objetivos
Objetivos
Contenidos
Cuando nos referimos a una clase de un paquete, salvo que se haya importado, hay que
referirse a la misma especificando el paquete y subpaquete.
Clase Objeto.java
package Objetos;
public class Libro {
int isbn;
String titulo;
String autor;
String editorial;
double precio;
}
Clase Tema4.java
package tema4;
import Objetos.Libro;
public class Tema4 {
public static void main(String[] args) {
Libro milibro = new Libro();
}
Clase Tema4.java
package tema4;
public class Tema4 {
public static void main(String[] args)
{ Objetos.Libro milibro = new
Objetos.Libro();
}
}
Los paquetes permiten reducir los conflictos con los nombres puesto que dos clases que se
llaman igual, si pertenecen a paquetes distintos, no deberían de dar problemas.
Los paquetes permiten proteger ciertas clases no públicas al acceso desde fuera del mismo.
Podemos crear subpaquetes desde netbeans pulsando botón derecho sobre el paquete y
seleccionando Nuevo / Java Package. Por último damos nombre al paquete.
Desde la clase principal Biblioteca podemos importar las clases con las sentencias:
import objetos.ejemplares.*;
import objetos.empleados.*;
Cuando especificamos el nivel de acceso a un atributo o método de una clase, lo que estamos
especificando es el nivel de accesibilidad que va a tener ese atributo o método que puede ir
desde el acceso más restrictivo (private) al menos restrictivo (public).
Acceso público (public) indica que puede ser accedido desde cualquier otra clase o subclase
que necesite utilizarlo.
Acceso privado (private) indica que puede ser accedido solamente desde los métodos internos
de su propia clase.
Acceso protegido (protected) indica que puede ser accedido desde cualquier subclases o
clases del mismo paquete a la que pertenece la clase.
(*) Se podría acceder al atributo o método desde la subclase pero no desde la superclase.
Una clase definida como pública puede ser utilizada desde cualquier paquete y otros paquetes
mientras que una clase no definida solamente podrá ser utilizada por las clases de su propio
paquete.
Resumiendo private solo accesible desde la propia clase, protected accesible desde el mismo
paquete y public accesible desde otros paquetes.
Ejemplo:
Si en el paquete personal tenemos en la clase empleado un método llamado calculaLetraDni
que queremos solamente sea accesible desde la clase empleado será un método private.
Si en el paquete personal tenemos en una clase empleado un método llamado
calculaTotalSueldos y queremos también utilizarlo en otra clase llamada nominasEmpleados
que pertenece también al paquete personal, será un método protected.
Por último si en la clase empleado del paquete personal tenemos un método llamado
muestraListado y queremos utilizarlo en la clase externos del paquete recursosHumanos, el
método será public.
empleado.java
package personal;
public class empleado {
private static void calculaLetraDni(){
}
protected static void calculaTotalSueldos(){
}
public static void muestraListado(){
}
private static void componerDni(){
calculaLetraDni();
}
}
nominasEmpleados.java
package personal;
import static personal.empleado.*;
public class nominasEmpleados {
private static void calculaPagosPersonal(){
calculaTotalSueldos();
}
}
externos.java
package recursosHumanos;
import static personal.empleado.*;
public class externos {
private void datosPlantilla(){
muestraListado();
}
}
Método toString.
El método toString se hereda de Object, por lo que sobrescribiremos este método para
adaptarlo y mostrar la información completa de un objeto, es decir, el valor de sus atributos.
package empleadoapp;
public class EmpleadoApp {
public static void main(String[] args) {
//Creamos tres empleados
Empleado empleado1=new Empleado("Fernando", "Ureña", 23, 600);
Empleado empleado2=new Empleado("Antonio", "Lopez", 28, 900);
Empleado empleado3=new Empleado("Alvaro", "Perez", 19, 800);
//Mostramos la informacion del objeto
System.out.println(empleado1.toString());
System.out.println(empleado2.toString());
System.out.println(empleado3.toString());
}
}
class Empleado
{ String nombre;
String apellido;
int edad;
double salario;
@Override
public String toString(){
String mensaje = "El empleado se llama "+nombre+" "
+apellido+" con "+edad+" años y un salario de "
+salario+" €";
return mensaje;
}
}
run:
El empleado se llama Fernando Ureña con 23 años y un salario de 600.0
€
El empleado se llama Antonio Lopez con 28 años y un salario de 900.0 €
El empleado se llama Alvaro Perez con 19 años y un salario de 800.0 €
BUILD SUCCESSFUL (total time: 0 seconds)
Además, al mostrar el objeto sin llamar al método toString() se ejecutará por defecto este
método:
System.out.println(empleado1);
System.out.println(empleado2);
System.out.println(empleado3);
4.3.- Estructura y Miembros de una Clase
En Java no existen variables globales, por lo tanto, si queremos utilizar una variable única y que
puedan utilizar todos los objetos de una clase deberemos de declararla como estática (static).
A diferencia de los atributos de instancia, los atributos de clase tienen la cláusula static y todos
los objetos de la misma clase compartirán dichos atributos.
Los métodos de instancia (no static) pueden acceder a los atributos de instancia y también a
los atributos de clase.
Ejemplo:
package concesionario;
public class Concesionario {
public static void main(String[] args)
{ coche coche1 = new coche("4927DFB");
coche coche2 = new coche("9003HGD");
coche coche3 = new coche("1204JHF");
System.out.println(coche1.getMatricula());
System.out.println(coche2.getMatricula());
System.out.println(coche3.getMatricula());
System.out.println(coche.mostrarNumCoches());
}
}
class coche{
String matricula;
static int numCoches = 0;
run:
4927DFB
9003HGD
1204JHF
3
BUILD SUCCESSFUL (total time: 0 seconds)
Clase Math.
Librería java.lang.Math dispone de métodos que permiten realizar operaciones matemáticas y
pueden ser llamadas anteponiendo el nombre de la clase Math ya que se tratan de métodos
estáticos de clase.
Ejemplo:
package opermatematicas;
import java.text.DecimalFormat;
public class OperMatematicas {
public static void main(String[] args) {
double prestamo = -410.489;
double sueldo = 1452.389;
double retencion = 328.956;
int valor1 = 10;
int valor2 = 25;
int azar;
int numero = 2;
int exponente = 3;
Resultado de la ejecución:
Valor abosulto de -410.489: 410.489
Máximo 10 y 25: 25
Mínimo 10 y 25: 10
Potencia 2 elevado a 3: 8.0
Aleatorio entre 20 y 30: 26.728286796166923
Redondeo al entero del sueldo: 1452
Redondeo al entero de la retención: 329
Redondeo Sueldo al segundo decimal: 1452,39
Redondeo Retención al segundo decimal: 328,96
4.4.- Trabajo con Métodos.
Paso de Parámetros por Valor y por Referencia.
Cuando queremos pasar un parámetro a un método lo podemos hacer de dos formas: por
valor y por referencia.
En el paso de parámetros por Valor los parámetros se copian en las variables del método y las
variables pasadas como parámetro no se modifican.
En el paso de parámetros por Referencia las variables pasadas como parámetros se modifican
puesto que el método trabaja con las direcciones de memoria de los parámetros.
En Java el paso de parámetros siempre es por valor, excepto cuando pasamos un array como
parámetro de un método que es pasado como referencia y cualquier cambio en el array dentro
del método queda reflejado fuera del mismo.
Ejemplo: Paso de parámetro por Valor. El parámetro se copia en la variable del método y las
modificaciones no afectan.
package pasoparametros;
public class PasoParametros {
public static void main(String[] args) {
int a = 10;
int b = 5;
suma(a, b);
System.out.println("A: "+a);
System.out.println("B: "+b);
}
}
Resultado:
run:
La suma es 125
A: 10
B: 5
BUILD SUCCESSFUL (total time: 0 seconds)
package pasoparametros;
public class PasoParametros {
public static void main(String[] args) {
int contador;
String[] nombres = {"Mario", "Luis", "Pedro", "Ana"};
cambiaNombre(nombres);
for (contador=0; contador<=nombres.length; contador++)
{ System.out.println("El nombre es
"+nombres[contador]);
}
}
Métodos Recursivos.
Un método es recursivo cuando se llama a sí mismo.
Se utiliza la recursividad cuando la resolución del problema es más sencilla y cuando no es
infinita.
Por ejemplo para calcular la potencia de x elevado a y crearemos el método potencia al que le
pasaremos el número y el exponente: potencia(x,y). Para resolver el caso recursivo debemos
encontrar:
Una fórmula que nos vaya acercando a la solución.
Un caso base que hace que nuestra recursividad no sea infinita.
En nuestro ejemplo sabemos que xy = x * xy-1 y que debe para cuando x0 = 1 (caso base). EL
método quedaría como se muestra a continuación:
package recursivo1;
public class Recursivo1 {
public static void main(String[] args) {
double x = 2;
double y = 3;
System.out.println("EL resultado es: "+potencia(x,y));
}
Resultado:
run:
EL resultado es: 8.0
BUILD SUCCESSFUL (total time: 0 seconds)
Se definen múltiples constructores de una clase cuando puede ser inicializado de varias formas.
Al sobrecargar el constructor, se varía el número y tipo de parámetros que recibe. Cuando
creamos un objeto con new, Java elige el constructor dependiendo de los parámetros
utilizados.
Ejemplo:
public class libro
{ String isbn;
String titulo;
String autor;
String editorial;
double precio;
Asignación de objetos.
Cuando trabajamos con objetos trabajamos con referencias a la zona de memoria donde se
encuentra el objeto.
Ejemplo:
Para copiar el contenido de un objeto a otro utilizaremos el constructor de copia, que permite
asignar los valores de otro objeto de la misma clase. El constructor de copia tendrá un
parámetro que será un objeto de la misma clase.
Alto: 7
Ancho: 5
Inicializadores static
Los inicializadores static son un bloque de código que solamente se ejecuta la primera vez que
se utiliza la clase. Son métodos sin nombre, no devuelven ningún valor y son ideales para
inicializar objetos. Se puede crear más de un inicializador static y se ejecutarán según el orden
en el que se han definido.
Se utiliza la palabra static y entre { } la inicialización que queremos realizar.
Ejemplo:
static {
importeCatLab1 = 25;
importeCatLab2 = 20;
importeCatLab3 = 15;
importeCatLab4 = 10;
}
package interfacefigura;
public interface interFigura {
double PI = 3.1416f; // Por defecto public static final.
double area(); // Por defecto public
}
Ejemplo:
package interfacefigura;
public class InterfaceFigura {
public static void main(String[] args)
{ Cuadrado miCuadrado = new Cuadrado
(3.5); Circulo miCirculo = new Circulo
(2.75);
Rectangulo miRectangulo = new Rectangulo (2.25, 3);
System.out.println ("Área del Cuadrado: " + miCuadrado.area());
System.out.println ("Área del Círculo: " + miCirculo.area());
System.out.println ("Área del Rectángulo: "+ miRectangulo.area());
}
}
VEHICULO
La clase coche, moto y camión heredan de la clase vehículo sus atributos y métodos.
Para indicar que una clase hereda de otra se utiliza la sentencia extends detrás del nombre de
la clase.
Ejemplo:
Todas las clases heredan de una clase padre. Si no heredan de clase concreta heredan de la
clase Object.
Ejemplo:
package EjercicioFiguras;
class ejercicioFiguras {
public static void main(String[] args) {
// Figura Cuadrado
cuadrado miCuadrado = new cuadrado(5);
miCuadrado.setColor("Verde");
System.out.println("Color Cuadrado: "+miCuadrado.getColor());
System.out.println("Área Cuadrado: "+miCuadrado.getArea());
System.out.println("****************************************");
// Figura Círculo
circulo miCirculo = new circulo(2.5);
miCirculo.setColor("Azul");
System.out.println("Color Círculo: "+miCirculo.getColor());
System.out.println("Área Círculo: "+miCirculo.getArea());
}
}
class figura
{ String
color;
public void setColor(String s){
color=s;
}
public String getColor(){
return color;
}
}