GuiaLab6 ClasesEnJava
GuiaLab6 ClasesEnJava
GuiaLab6 ClasesEnJava
Gua de Laboratorio N 6
CLASES EN JAVA
Objetivo: Que el estudiante conozca como implementar las clases en Java, visibilidad de atributos, mtodos y
de clases en diferentes paquetes. Qu aprende a sobrecargar mtodos, que utilice la referencia this y que
defina atributos y mtodos estticos
Las clases son las plantillas para hacer objetos. Es decir antes de poder utilizar un objeto se debe definir la clase
a la que pertenece, esa definicin incluye:
Sus atributos: Es decir, los datos miembros de esa clase. Los datos pueden ser pblicos (accesibles
desde otra clase) o privados (slo accesibles por cdigo de su propia clase.
Sus mtodos: Las funciones miembro de la clase. Son las acciones (u operaciones) que puede realizar
la clase.
Cdigo de inicializacin: Para crear una clase normalmente hace falta realizar operaciones previas (es
lo que se conoce como el constructor de la clase).
Otras clases: Dentro de una clase se pueden definir otras clases (clases internas, son el resultado de
asociaciones en el diagrama de clases de UML).
1
El formato general para crear una clase en java es el siguiente:
La palabra opcional static sirve para hacer que el mtodo o la propiedad a la que precede se pueda utilizar de
manera genrica (clases genricas).
Uno de los beneficios de las clases es que pueden proteger sus variables (o atributos) y mtodos miembros
frente al acceso de otros objetos.
En Java se puede utilizar los especificadores de acceso para proteger tanto las variables como los mtodos de la
clase cuando se declaran. El lenguaje Java soporta tres niveles de acceso para las variables y mtodos
miembros: private, protected y public.
El nivel de acceso ms restringido es private. Un miembro privado es accesible slo para la clase en la que est
definido. Se utiliza este acceso para declarar miembros que slo deben ser utilizados por la clase.
La clase Alpha del siguiente diagrama contiene una variable miembro y un mtodo privados.
2
Para este diagrama, definir dos clases (dos archivos con los nombres de las clases) en el paquete
visibilidadprivada. La clase Beta es dependiente de la clase Alpha, porque se define y crea un objeto Alpha en
la clase Beta.
package visibilidadprivada;
class Alpha {
private int soyPrivado;
private void metodoPrivado() {
System.out.println("metodoPrivado");
}
public void metodoPublico() {
System.out.println("metodoPublico");
System.out.println("Atributo privado: "+ soyPrivado);
System.out.println("metodoPrivado: ");
metodoPrivado();
}
}
Los objetos del tipo Alpha pueden inspeccionar y modificar la variable soyPrivado y pueden invocar el mtodo
metodoPrivado(), pero los objetos de otros tipos no pueden acceder. Por ejemplo:
package visibilidadprivada;
class Beta {
public static void main(String[ ] args){
probarAlpha();
}
static void probarAlpha() {
Alpha a = new Alpha();
//a.soyPrivado = 10; // ilegal
//a.metodoPrivado(); // ilegal
a.metodoPublico(); // legal
}
}
La clase Beta definida aqu no puede acceder a la variable soyPrivado ni al mtodo metodoPrivado() de un
objeto del tipo Alpha porque Beta no es del tipo Alpha.
Permite a la propia clase y a todas las clases dentro del mismo paquete que accedan a sus miembros.
3
Consideremos esta versin de la clase Alpha que ahora se declara para estar incluida en el paquete griego y
que tiene una variable y un mtodo que son miembros protegidos.
La clase Gamma, tambin est declarada como miembro del paquete griego (y no es una subclase de Alpha). La
clase Gamma puede acceder legalmente al miembro estoyProtegido del objeto Alpha y puede llamar
legalmente a su mtodo metodoProtegido().
package griego;
class Alpha {
protected int estoyProtegido;
protected void metodoProtegido() {
System.out.println("metodoProtegido");
}
}
package griego;
class Gamma {
public static void main(String[ ] args){
probarAlpha();
}
static void probarAlpha() {
Alpha a = new Alpha();
a.estoyProtegido = 10; // legal
a.metodoProtegido(); // legal
}
}
4
Especificador de acceso: public.
Todas las clases, en todos los paquetes tienen acceso a los miembros pblicos de la clase. Los miembros
pblicos se declaran slo si su acceso no produce resultados indeseados si un extrao los utiliza. Por ejemplo:
package griego;
class Alpha {
public int soyPublico;
public void metodoPublico() {
System.out.println("metodoPublico");
}
}
Reescribiendo la clase Beta y poniendola en un paquete diferente que la clase Alpha, y aseguramos que no
estn relacionadas (no es una subclase de Alpha)
package romano;
import griego.*;
class Beta {
public static void main(String[ ] args){
probarAlpha();
}
static void probarAlpha() {
Alpha a = new Alpha();
a.soyPublico = 10; // legal
a.metodoPublico(); // legal
}
}
5
Como se puede ver en el ejemplo anterior, Beta puede inspeccionar y modificar legalmente la variable
soyPublico en la clase Alpha y puede llamar legalmente al mtodo metodoPublico().
Una tcnica de la POO es el polimorfismo. Java posee esa propiedad ya que admite sobrecargar los mtodos.
Esto significa crear distintas variantes del mismo mtodo.
La sobrecarga de mtodos es la creacin de varios mtodos con el mismo nombre pero con diferentes firmas y
definiciones. Java utiliza el nmero y tipo de argumentos para seleccionar cul definicin de mtodo ejecutar.
Java diferencia los mtodos sobrecargados con base en el nmero y tipo de argumentos que tiene el mtodo y
no por el tipo que devuelve.
Ejemplo:
La clase Matemticas posee tres versiones del mtodo suma. Una versin que suma dos nmeros de tipo
double, otra que suma tres y la ltima que suma todos los miembros de un array de doubles. Desde el cdigo se
puede utilizar cualquiera de las tres versiones segn convenga.
6
package matematicas;
class Matematicas {
public double sumar(double x, double y) {
return x+y;
}
public double sumar(double x, double y, double z) {
return x+y+z;
}
public double sumar(double[] array) {
double total =0;
for(int i=0; i<array.length;i++) {
total+=array[i];
}
return total;
}
}
package matematicas;
class PruebaMatematicas {
public static void main(String[ ] args){
Matematicas x = new Matematicas();
double[] y = {4.5, 2.5, 1.3, 1.7};
double z = x.sumar(3.25, 2.75);
System.out.println(z);
z = x.sumar(1, 2, 3);
System.out.println(z);
System.out.println(x.sumar(y));
}
}
7
III. La referencia This.
package referenciathis;
class Punto {
int posX, posY;//posicin del punto
Punto(int posX, int posY) {
this.posX=posX;
this.posY=posY;
}
public void imprimir() {
System.out.println("x = " + posX + ", y = " + posY);
}
}
package referenciathis;
class PruebaPunto {
public static void main(String[ ] args){
Punto a = new Punto(0 , 0);
Punto b = new Punto(1 , 2);
a.imprimir();
b.imprimir();
}
}
En el ejemplo se usa la referencia this para clarificar cuando se usan los atributos posX y posY, y cuando los
parmetros con el mismo nombre.
8
this: Referencia al objeto actual. Se usa por ejemplo para pasarle como parmetro a un mtodo cuando es
llamado desde la propia clase.
this.mtodo(parmetros): Permite llamar a un mtodo del objeto actual con los parmetros indicados.
this(parmetros): Permite llamar a un constructor del objeto actual. Esta llamada slo puede ser empleada en
la primera lnea de un constructor.
Constructores.
El constructor de una clase es un mtodo estndar para inicializar los objetos de esa clase, es decir que sirve
para dar los valores inciales a los campos de un objeto en el momento en que se crea.
El constructor se ejecuta siempre al crear un objeto. Los constructores de una clase tienen siempre el nombre
de la clase y no tiene ningn valor devuelto (ni siquiera void).
Si el usuario no declara un constructor el sistema siempre crea un constructor por defecto sin argumentos.
Tipos de constructores.
Un constructor por defecto es un constructor sin parmetros que no hace nada. Sin embargo ser invocado
cada vez que se construya un objeto sin especificar ningn argumento, en cuyo caso el objeto ser iniciado con
los valores predeterminados por el sistema (los atributos numricos a ceros, los alfanumricos a nulos, y las
referencias a objetos null).
Ejemplo:
9
package constructores;
class Ficha {
private int casilla;
package constructores;
Constructor explicito.
Si se define un constructor con parmetros, (definido explcitamente) el constructor por default se reemplaza
por ste.
Los constructores pueden estar sobrecargados, esto significa que podemos definir distintos constructores
cambiando el orden, la cantidad y el tipo de parmetros que reciben.
Ejemplo:
10
package constructores;
class Ficha {
private int casilla;
Ficha() { //constructor
casilla = 1;
}
11
package constructores;
}
}
En la lnea Ficha ficha1 = new Ficha(); es cuando se llama al constructor explcito, que es el que coloca
inicialmente la casilla a 1.
En la lnea Ficha ficha2 = new Ficha(5); es cuando se llama al constructor explcito sobrecargado y con
parmetros, que es el que coloca inicialmente la casilla al valor recibido como parmetro.
Destructores.
En Java no es necesaria la definicin de destructores (no existen), pues es un lenguaje que se encarga de la
eliminacin de la memoria ocupada por un objeto a travs de la recoleccin de basura.
Para este fin se crea un mtodo denominado finalize. Este mtodo es llamado antes de eliminar
definitivamente al objeto para hacer limpieza final. Un uso puede ser eliminar los objetos creados en la clase
para eliminar referencias circulares. Ejemplo:
class uno {
dos d;
uno() {
d = new dos();
}
protected void finalize() {
d = null; //se elimina d por lo que pudiera pasar
}
}
12
V. Comparacin entre objetos: mtodo equals y comparador ==
La clase Object proporciona un mtodo para comprobar si dos objetos son iguales. Este mtodo es equals. Este
mtodo recibe como parmetro un objeto con quien comparar y devuelve true si los dos objetos son iguales.
Objeto1.equals(Objeto2)
Ejemplos:
...
Auto uno=new Auto(Renault,Megane,P-432432);
Auto dos=uno;
boolean resultado=(uno.equals(dos)); //Resultado valdr true
resultado=(uno==dos); //Resultado tambin valdr true
dos=new Auto(Renault,Megane,P-432432);
resultado=(uno.equals(dos)); //Resultado valdr true
resultado=(uno==dos); //Resultado ahora valdr false
...
En el ejemplo anterior, equals devuelve true si los dos autos tienen el mismo modelo, marca y matrcula. El
operador == devuelve true si los dos objetos se refieren a la misma cosa (las dos referencias apuntan al
mismo objeto).
Hemos visto que hay que crear objetos para poder utilizar los mtodos y propiedades de una determinada
clase. Sin embargo esto no es necesario si la propiedad o el mtodo se definen precedidos de la palabra clave
static. De esta forma se podr utilizar el mtodo sin definir objeto alguno, utilizando el nombre de la clase
como si fuera un objeto. As funciona la clase Math.
Ejemplo:
13
package calculo;
class Calculadora {
public static double constantePI = 3.1416;
public static int factorial(int n) {
int fact=1;
while (n>0) {
fact *=n--;
}
return fact;
}
}
package calculo;
En este ejemplo no ha hecho falta crear objeto alguno para poder calcular el factorial o mostrar el valor de PI.
Una clase puede tener mtodos y propiedades genricos (static) y mtodos y propiedades dinmicas
(normales).
Cada vez que se crea un objeto con new, se almacena ste en memoria. Los mtodos y propiedades normales,
gastan memoria por cada objeto que se cree, sin embargo los mtodos estticos no gastan memoria por cada
objeto creado, gastan memoria al definir la clase. Es decir, los mtodos y atributos static son los mismos para
todos los objetos creados, gastan memoria por definir la clase, pero no por crear cada objeto.
Hay que crear mtodos y propiedades genricos cuando ese mtodo o propiedad da el mismo resultado en
todos los objetos. Pero hay que utilizar mtodos normales (dinmicos) cuando el mtodo da resultados
distintos segn el objeto. Por ejemplo en un clase que represente aviones, la altura sera un atributo dinmico
(distinto en cada objeto), mientras que el nmero total de aviones, sera un mtodo static (es el mismo para
todos los aviones).
Las clases que se encuentran asociadas o compuestas, implican que una clase contendr uno o muchos
atributos de la otra clase con la cual est asociada. Por ejemplo:
14
package empleado;
15
// llama a comprobarDia para confirmar el valor apropiado para el da
public Fecha( int elMes, int elDia, int elAnio )
{
mes = comprobarMes( elMes ); // valida el mes
anio = elAnio; // pudo validar el ao
dia = comprobarDia( elDia ); // valida el da
System.out.printf(
"Constructor de objeto Fecha para la fecha %s\n", this );
} // fin del constructor de Fecha
// mtodo utilitario para confirmar el valor apropiado del da, con base
// en el mes y el ao
private int comprobarDia( int diaPrueba )
{
// comprueba si el da est dentro del rango para el mes
if ( diaPrueba > 0 && diaPrueba <= diasPorMes[ mes ] )
return diaPrueba;
// comprueba si es ao bisiesto
if ( mes == 2 && diaPrueba == 29 && ( anio % 400 == 0 ||
( anio % 4 == 0 && anio % 100 != 0 ) ) )
return diaPrueba;
16
package empleado;
package empleado;
// Demostracin de la composicin.
17
EJERCICIOS PROPUESTOS
1) En un paquete rectangulo, cree una clase llamada Rectangulo con los atributos longitud y anchura, cada uno
con valor predeterminado de 1. Debe tener mtodos para calcular el permetro y el rea del rectngulo. Debe
tener mtodos para establecer (set) y obtener (get) la longitud y la anchura. Los mtodos establecer deben
verificar que longitud y anchura sean nmeros de punto flotante mayores que 0.0 y menores que 20.0.
Agregue la clase PruebaRectangulo para probar la clase Rectangulo.
2) En un paquete cuentas, cree una clase llamada CuentaDeAhorros. Use una variable static llamada
tasaInteresAnual para almacenar la tasa de inters anual para todas las cuentas. Use otra variable static
llamada cantidadCuentas que almacene la cantidad de cuentas existentes, establezca su valor a 0; esta variable
debe incrementar cada vez que se invoque el constructor de la clase. Incluya un mtodo llamado
getCantidadCuentas para obtener el nmero de cuentas existentes. Cada objeto de la clase debe contener una
variable de instancia private llamada saldo, que indique la cantidad que el ahorrador tiene actualmente en
depsito. Proporcione el mtodo calcularInteresMensual para calcular el inters mensual, multiplicando el
saldo por la tasa de inters anual y dividindolo entre 12; este inters debe sumarse al saldo. Proporcione un
mtodo esttico llamado modificarTasaInteres para establecer la tasaInteresAnual en un nuevo valor. Agregue
la clase PruebaCuenta para probar la clase CuentaDeAhorros. En la prueba, cree dos cuentas de ahorros,
ahorro1 y ahorro2, con saldos de $2,000.00 y $3,000.00. Establezca la tasa de inters anual a 1.5%, despus
calcule el inters mensual para cada uno de los 12 meses e imprima los nuevos saldos de las cuentas. Luego
establezca la tasa de inters anual a 2.5%, calcule el inters del siguiente mes e imprima los nuevos saldos.
Finalmente, imprima la cantidad de cuentas existentes.
18
e. En la clase fecha proporcione el mtodo siguienteDia para adelantar el da en uno (Nota: Podra adelantar
del 28 de febrero al 29 de febrero o al 1 de marzo).
f. Agregue a la clase PruebaEmpleado un ciclo que pruebe el mtodo anterior e imprima cada fecha calculada.
g. Agregue el mtodo siguientemes a la clase Fecha, y prubelo en la clase PruebaEmpleado.
h. Agregue el mtodo siguienteAnio a la clase Fecha y prubelo en la clase PruebaEmpleado.
i. Cree un nuevo proyecto que agregue las clases Empresa y PruebaEmpresa (en lugar de PruebaEmpleado). La
clase Empresa debe tener como atributo un arreglo de objetos de tipo Empleado llamado empleados y un
mtodo llamado agregarEmpleado que reciba los mismos parmetros del constructor de la clase Empleado,
invoque al constructor mencionado y agregue el objeto al arreglo. Adems, incluir en la clase Empresa un
mtodo llamado getCantidadEmpleados que devuelva la cantidad de empleados de la empresa. La clase
PruebaEmpresa debe crear el objeto empresa y agregarle al menos 5 empleados, y cada vez se debe imprimir
la cantidad de empleados.
Clase crculo
El mtodo calcularArea usar el atributo radio para calcular el rea del crculo.
El mtodo calcularPerimetro usar el atributo radio para calcular el permetro del crculo.
Clase Triangulo
El mtodo calcularArea usar los atributos base y altura para calcular el rea del tringulo.
19
Clase Rectangulo
El mtodo calcularArea usar los atributos base y altura para calcular el rea del rectngulo.
El mtodo calcularPerimetro usar los atributos base y altura para calcular el permetro.
Clase TestGeometricos
El mtodo main deber tener crear dos objetos de la clase Triangulo, solicitar la base y la altura de cada uno, y
a partir del rea de cada uno, imprimir los valores del tringulo ms grande.
Adicionalmente, el mtodo main deber crear un objeto crculo, solicitar el radio e imprimir el rea y el
permetro del crculo.
Clase UtilidadesCadenas
El mtodo palabrasInversa debe recibir una cadena de caracteres de varias palabras, y devolver una cadena con
las palabras ordenadas de forma inversa.
Nota: Utilice el mtodo split para separar las palabras de la oracin.
El mtodo inicioMayuscula debe recibir una cadena de caracteres y devolver una cadena en la que la primera
letra de la primera palabra se haya convertido a mayscula.
El mtodo inicioTodasMayuscula debe recibir una cadena de caracteres y devolver una cadena en la que la
primera letra de todas las palabras haya sido convertida a mayscula.
Clase TestUtilidades
El mtodo main deber de leer una serie (cualquier cantidad) de cadenas de caracteres de varias palabras, y
aplicar cada uno de los mtodos de la clase UtilidadesCadena e imprimir los resultados en pantalla.
20