Вы находитесь на странице: 1из 20

UNIVERSIDAD DE EL SALVADOR

ESCUELA DE INGENIERIA DE SISTEMAS INFORMATICOS


PROGRAMACION II (Sistemas)

Gua de Laboratorio N 6

IMPLEMENTACION DE CLASES EN JAVA

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

I. Elementos de las clases.

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:

[acceso] class nombreDeClase {


[acceso] [static] tipo atributo1;
[acceso] [static] tipo atributo2;
[acceso] [static] tipo atributo3;
...
[access] [static] tipo mtodo1(listaDeArgumentos) {
// cdigo del mtodo
}
...
}

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).

Acceso a los miembros de la clase.

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.

Especificador de acceso: private.

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.

Especificador de acceso: protected.

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().

II. Mtodos sobrecargados.

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.

La palabra this es una referencia al propio objeto en el que estamos. Ejemplo:

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.

Los posibles usos de this son:

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.atributo: Para acceder a una propiedad del objeto actual.

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.

IV. Constructores y Destructores en Java.

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.

Los constructores no se heredan.

Tipos de constructores.

Constructor por defecto (Implcito).

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;

public void avanzar(int n) {


casilla += n;
}

public int getCasillaActual(){


return casilla;
}
}

package constructores;

public class PruebaFicha {


public static void main(String[] args) {
Ficha ficha1 = new Ficha();
ficha1.avanzar(3);
System.out.println(ficha1.getCasillaActual());
}
}
En la lnea Ficha ficha1 = new Ficha(); es cuando se llama al constructor implcito, es decir, que aunque no se
haya declarado el constructor de forma explcita, el sistema inicializa el objeto a travs del constructor
implcito.

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;
}

Ficha(int casilla) { //constructor


this.casilla = casilla;
}

public void avanzar(int n) {


casilla += n;
}

public int getCasillaActual(){


return casilla;
}
}

11
package constructores;

public class PruebaFicha {


public static void main(String[] args) {
Ficha ficha1 = new Ficha();
ficha1.avanzar(3);
System.out.println(ficha1.getCasillaActual());
Ficha ficha2 = new Ficha(5);
ficha2.avanzar(5);
System.out.println(ficha2.getCasillaActual());

}
}

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)

Nota: No es lo mismo equals que usar la comparacin de igualdad.

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).

VI. Miembros genricos (static).

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;

public class PruebaCalculadora {


public static void main(String[] args) {
System.out.println(Calculadora.factorial(5));
System.out.println("PI = " + Calculadora.constantePI);
}
}

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).

VII. Clases asociadas o compuestas.

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;

public class Fecha


{
private int mes; // 1-12
private int dia; // 1-31 con base en el mes
private int anio; // cualquier ao

private static final int[] diasPorMes = // das en cada mes


{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

// constructor: llama a comprobarMes para confirmar el valor apropiado


// para el mes;

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 mes


private int comprobarMes( int mesPrueba )
{
if ( mesPrueba > 0 && mesPrueba <= 12 ) // valida el mes
return mesPrueba;
else // mes es invlido
throw new IllegalArgumentException ( "el mes debe ser 1 a 12");
} // fin del mtodo comprobarMes

// 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;

throw new IllegalArgumentException(


"dia fuera de rango para el mes y anio especificados" );
} // fin del mtodo comprobarDia

// devuelve un objeto String de la forma mes/dia/anio


public String toString()
{
return String.format( "%d/%d/%d", mes, dia, anio );
} // fin del mtodo toString
} // fin de la clase Fecha

16
package empleado;

// Clase Empleado con referencias a otros objetos.

public class Empleado


{
private String primerNombre;
private String apellidoPaterno;
private Fecha fechaNacimiento;
private Fecha fechaContratacion;

// constructor para inicializar nombre, fecha de nacimiento y fecha


// de contratacin
public Empleado( String nombre, String apellido, Fecha fechaDeNacimiento,
Fecha fechaDeContratacion )
{
primerNombre = nombre;
apellidoPaterno = apellido;
fechaNacimiento = fechaDeNacimiento;
fechaContratacion = fechaDeContratacion;
} // fin del constructor de Empleado

// convierte Empleado a formato String


public String toString()
{
return String.format( "%s, %s Contratado: %s Cumpleanios: %s",
apellidoPaterno, primerNombre, fechaContratacion, fechaNacimiento );
} // fin del mtodo toString
} // fin de la clase Empleado

package empleado;

// Demostracin de la composicin.

public class PruebaEmpleado


{
public static void main( String[] args )
{
Fecha nacimiento = new Fecha( 7, 24, 1970 );
Fecha contratacion = new Fecha( 3, 12, 2011 );
Empleado empleado = new Empleado("Juan","Perez",nacimiento,contratacion);

System.out.println( empleado ); // invoca el mtodo toString


} // fin de main
} // fin de la clase PruebaEmpleado

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.

3) Modifique el ejemplo del empleado de tal manera que:


a. La clase PruebaEmpledo valide que las fechas de nacimiento y de contratacin sean diferentes.
b. La clase empleado incluya el atributo esttico cantidadEmpleados que contenga la cantidad de objetos de
empleado existentes.
c. La clase empleado incluya el mtodo getCantidadEmpleados que retorne la cantidad de objetos existenes de
tipo Empleado.
d. El constructor de la clase Fecha debe recibir parmetros con el mismo nombre de los atributos de la clase
Fecha, y utilice la referencia this para diferenciar los atributos de los parmetros.

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.

4) Programe las clases de acuerdo a las especificaciones que se describen a continuacin.

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.

5) Programa las clases de acuerdo a las especificaciones que se describen a continuacin.

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

Вам также может понравиться