Está en la página 1de 11

Programación

Material Conferencia:

CLASES EN JAVA.

En las conferencias anteriores se estudiaron los siguientes aspectos


- El Java como lenguaje de programación y la tecnología Java en sentido general.
- Elementos básicos del Java, entre ellos:
 Comentarios
 Identificadores
 Palabras claves y reservadas
 Tipos de datos primitivos
 Literales o constantes.

Como se vio en clases anteriores un programa OO era un programa donde existen objetos
que colaboran entre sí y estos objetos son instancia de alguna clase. Por lo tanto, para tener
instancias es necesario primeramente poder declarar o definir clases.
También se estudió que un objeto tiene:
- Atributos (donde se almacenan los datos, la información del mismo)
- Operaciones o métodos (que son aquellos que responden a los mensajes y que
manipulan los atributos).
Al definir (declarar) una clase se debe entonces definir atributos y operaciones.
Los atributos serán datos de los tipos que soporta el lenguaje.
Las operaciones o métodos son segmentos de código que permitirán realizar operaciones
con los atributos y con otros datos necesarios para realizar determinada tarea. Las
diferentes estructuras de programación se utilizan en los métodos, son los más complejos
de programar y se irán estudiantes desde métodos simples a métodos más complejos en la
medida que se estudien las diferentes operaciones que soporta el Java.
En UML (recordar los diagramas de actividad) las clases se representan con un rectángulo
dividido en tres partes: nombre de la clase, atributos y métodos

Nombre de la clase

Atributos de la clase

Métodos de la clase

1
Clases en Java
La definición más simple de una clase en Java es de la siguiente forma:

<modificadores> class <nombre> {


<declaración de atributos>*
<declaración de métodos>*
}
O sea, para definir una clase es necesario asignarle a un nombre y luego entre llaves
escribir atributos y métodos, estas declaraciones de atributos y métodos puede repetirse
como indica el *. Los modificadores de la clase por el momento no se estudiarán.
El nombre de una clase es un identificador y es una norma clásica entre los programadores
Java nombrar las clases comenzando con una letra mayúscula.
La declaración de los atributos se hace de la siguiente manera:

<modificador> <tipo> <nombre> [= <valor por defecto>];


donde:
<modificador>::= private | public | protected

El modificador dice el alcance del atributo: el modificador private hace que el atributo
solo puede ser utilizado por los métodos de la clase; por su parte el modificador public
hace que el atributo pueda ser utilizado por los métodos de la clase y desde otras clases
donde se utilicen objetos de la misma. NO se debe tener en las clases atributos con este
alcance. El modificador protected se estudiará más adelante.

<tipo> ::= byte | short | int | long | char


float | double | boolean | <class>

Como su nombre lo indica el tipo dice el tipo de valor que puede almacenar este atributo.
Observar que un atributo puede ser de cualquiera de los tipos primitivos estudiados en la
conferencia anterior, pero también puede ser de tipo clase, esto quiere decir que el atributo
de una clase puede ser un objeto de una clase dada. Esto da una tremenda expresividad al
lenguaje y se puede tener objetos que contengan otros objetos.
Todo atributo tiene un nombre que responde a las reglas de los identificadores estudiados
en la clase anterior. Los programadores Java por convención utilizan letras minúsculas para
comenzar el nombre de un atributo.
El valor por defecto es un valor que puede tomar el atributo cuando se cree un objeto de
esta clase. Observar que se ha escrito entre corchetes, lo que indica que no necesariamente
tiene que estar presente.
Es importante tener en cuenta que la declaración de un atributo termina con punto y coma.

2
Ejemplo:
Se quiere construir una clase Recipiente que permita representar paralelepípedos con
base cuadrada, que se utilizan para almacenar líquido, por lo que es importante
conocer el volumen de ellos y dado el costo por metro cuadrado del material con que
se fabrica el costo total de un recipiente.
Por lo tanto se puede pensar que los objetos de este tipo tienen como atributos: la
longitud del lado del cuadrado base y la altura del paralelepípedo y como método uno
que sea capaz de calcular el volumen del mismo y otro que tome el costo por metro
cuadrado el material y calcule el costo total del recipiente.
Representado en UML se tiene:

Recipiente
- lado
- altura
+ volumen
+ costo

Nota: el signo menos que aparece delante del nombre de los atributos, significa que
son privados.
En Java se tiene:
class Recipiente {
private double lado;
private double altura;
// cálculo del volumen
// cálculo del costo
}

Se ha destacado en negritas las palabras claves, cuando se escribe una clase Java
utilizando un editor este destaque no es necesario.
Se han declarado dos atributos: lado y altura, ambos se han declarado de ámbito local a
la clase (privados) y de tipo double de manera que puedan almacenar un número con
coma decimal lo más grande posible.
Cuando ambos atributos tienen los mismos modificadores y los mismos tipos se
pueden declarar en una sola línea:
class Recipiente {
private double lado, altura;
// cálculo del volumen
// cálculo de la atura
}

3
La declaración de los métodos es más compleja y sigue la siguiente sintaxis:

<modificador> <tipo_de_retorno> <nombre> (<parámetro>*) {


<instrucciones>*
}
Por el momento el modificador se tomará como public y private (pueden ser otros
que no se considerarán por ahora), con el mismo significado que se le atribuye a los
atributos. En el caso de los métodos, la mayoría tendrá como modificador public para
que pueda ser accedido desde cualquier lugar. En la representación en UML se escribe
delante del nombre del método un símbolo de +.
El conjunto de métodos dice el conjunto de mensajes a los cuales puede responder un
objeto, instancia de una clase dada.
Es necesario ver el método como una operación sobre el objeto, por lo tanto una operación
realiza alguna acción y por lo general tiene un resultado. El tipo del resultado es lo que
especifica la cláusula <tipo_de_retorno>. Este tipo de retorno puede ser cualquiera
de los que se vieron en los atributos más uno especial void, que se utiliza cuando se
quiere indicar que la operación no devuelve, no retorna ningún valor. Esto ocurre cuando la
operación (el método) lo que hace es modificar de alguna manera los atributos, porque la
finalidad del mismo nos es que retorne un resultado sino que cambie, altere, varíe el valor
de alguno(s) atributo(s).
El nombre del método es un identificador y debe reflejar la operación que el mismo realiza,
por convección se utilizará minúscula inicial para comenzarlo.
Los parámetros (observe que se utiliza el plural, pues el * indica que pueden ser varios) son
valores que no están en los atributos y que se necesitan obligatoriamente para llevar a cabo
la operación que se propone. Si son varios parámetros se separan unos de otros por coma y
en cada uno de ellos se indica su tipo y el nombre. Es importante insistir en que los
parámetros son necesarios cuando para llevar a cabo la operación que implementa el
método es necesario algún valor que no está en el objeto. Los atributos no se pueden pasar
como parámetros.
Recordar el ejemplo de la florista, para poder enviar flores junto al mensaje debía decirse: a
quién, cuándo, dirección, etc. Estos son los parámetros de un método.
NOTA: Cuando un método no tenga parámetros hay que poner los paréntesis de forma
obligatoria.
Las instrucciones constituyen el cuerpo del método y es donde se implementa el algoritmo
que resuelve la operación que se está construyendo. Cada instrucción se separa de la
siguiente por un punto y coma (;).
En la medida que el curso avance se estudiarán las diferentes instrucciones que
proporciona el Java.
En estas instrucciones se pueden declarar variables que serán de uso LOCAL en el método,
con la sintaxis:
<tipo> <nombre> [= <valor inicial>];

4
La sintaxis como se observa es similar a la de los atributos, excepto que aquí no se escriben
los modificadores.
Es importante diferenciar un atributo de una variable de un método. Los atributos son
“visibles” para todos los métodos, es decir todos los métodos de la clase pueden utilizar el
valor que tienen estos atributos. Sin embargo una variable que se declare en un método es
local al mismo, sólo puede ser utilizada en dicho método.
De las instrucciones posibles a utilizar se mencionarán hoy dos de ellas:
Instrucción de asignación:
Se utiliza el signo = y tiene la sintaxis:
<variable> = <expresión>;
indicando que la variable de la izquierda recibe el valor de la expresión de la derecha.
Esta expresión es similar a la estudiada en el tema de algoritmos (), aunque por el
momento solo se utilizarán los operadores aritméticos usuales: + , *, -, /, % con el
significado que ya se ha visto.
Un estudio más riguroso de las expresiones se hará en una conferencia posterior.
Instrucción de retorno
El valor que retorna, qué devuelve un método se especifica en una instrucción return,
que tiene la forma:
return [<expresión>];
Es importante que coincida el tipo de la expresión con el tipo que se especifica en el
encabezamiento del método.
En todos los métodos que devuelven un valor tiene que estar presente una o varias
instrucciones return, sólo en el caso que el tipo de retorno sea void es que se admiten
métodos sin esta instrucción. Esta instrucción también significa que el método termina.
Ejemplo:
Retomando el ejemplo visto anteriormente, era necesario completar la clase con un
método que fuera capaz de calcular el volumen del recipiente, esto pudiera hacerse
de la siguiente forma:
class Recipiente {
private double lado;
private double altura;
public double volumen(){
double vol;
vol=lado*lado*altura;
return vol;
}
// cálculo del costo
}

5
Se ha declarado un método que se llama volumen, que es público, por lo tanto
puede ser utilizado en cualquier otro lugar; no necesita parámetros, porque utiliza
para el cálculo solo los atributos de la clase. Calcula un double que es el tipo de
retorno. Se han programado tres instrucciones: la primera declara una variable
interna para el método (vol), la segunda calcula el valor de esta variable con la
fórmula conocida y la tercera devuelve este valor. ¿Es necesaria la variable? En este
caso no es necesaria y el método se pudiera reformular de la siguiente manera:
class Recipiente {
private double lado;
private double altura;
public double volumen(){
return lado*lado*altura;
}
// cálculo del costo
}

Es importante observar:
 En ambas implementaciones el uso de los punto y coma para finalizar las
instrucciones.
 Utilización de las llaves para determinar el alcance de la clase y el alcance
del método.
 No uso de parámetros en este caso pues la operación se lleva a cabo con los
atributos de la clase, pero la necesidad de escribir los paréntesis.
 Uso de mayúsculas y minúsculas, recordar que el Java las diferencia, por lo
tanto el escribir class, public, private, double, return con mayúscula sería un
error o el Java no lo interpretaría como se desea.
El otro método es el cálculo del costo del recipiente, conocido el costo unitario del
material con que se hace. Aquí se tiene una información adicional: el costo por
metro cuadrado del material con que se fabrica el recipiente. Este dato constituye un
parámetro del método.
class Recipiente {
private double lado;
private double altura;
public double volumen(){
return lado*lado*altura;
}

6
public double costo(double cm){
double area= lado*lado+4*lado*altura;
return area*cm;
}
}

El método costo, como se dijo anteriormente, tiene un parámetro (denominado cm


de tipo double) que constituye el costo del material por unidad de medida. Este dato
es imprescindible para que se pueda calcular el costo del recipiente, como este dato
no constituye un atributo, es necesario declararlo entre los parámetros.
Como se observa en la implementación del método se calcula el área de la
superficie del recipiente (se supone que es abierto por arriba) y luego esta área se
multiplica por el costo que se pasa como parámetro.
En este método hay tres tipos de variables: los atributos (lado, altura), el parámetro
del método (cm) y una variable local auxiliar (area). Tanto el parámetro como las
variables son locales al método. NO se pueden usar en otro lugar.
Es importante tener en cuenta que al programar la clase no se sabe de donde
procede el dato del costo del material. Esto no importa en este momento. Es
necesario solo conocer que para calcular el costo del Recipiente este dato es
necesario y por ello es necesario ponerlo cómo argumento.

Al analizar el ejemplo propuesto anteriormente se le puede señalar un problema


relativamente grave: los atributos (lado y altura) están siendo declarados como privados y
entonces, ¿cómo poder escribir en ellos valores?. Cuando se cree un objeto de este tipo
(aún no se sabe como, pero habrá que crearlo para poder trabajar con él), será necesario
“poner”, “llenar” los valores de lado y altura con los datos que se tiene para el recipiente
para poder calcular luego su volumen y costo. Pero, la creación de objeto se hará en otra
clase, que no podrá acceder a estos atributos por estar declarados privados. ¿QUÉ
HACER?.
Para resolver esta situación la única vía que se tiene es definir algunas operaciones
(métodos) más, que sean declarados públicos y que permitan acceder a los atributos.
Acceder a un atributo puede significar dos operaciones distintas:
a) Poner, escribir un valor en dicho atributo
b) Extraer, sacar el valor de dicho atributo.
Este acceso es responsabilidad del programador. Es necesario responder estas preguntas:
¿Se necesitan siempre?
¿Es necesario hacer siempre las dos operaciones con todos los atributos?
es el programador, a partir de lo que desee quien decide qué hacer.
A estos métodos se les llama métodos de acceso y los programadores que hacen POO
utilizan un convenio muy generalizado para distinguirlos:

7
a) A los métodos que “ponen” un valor en el atributo les llaman set y seguido el
nombre del atributo, tienen generalmente un parámetro del mismo tipo del atributo
que es el que se le asigna al mismo. Realizan, generalmente alguna operación de
chequeo sobre el o los parámetros para comprobar su corrección antes de colocarlo
en el atributo. Estos métodos por lo general no devuelven ningún valor por lo tanto
el tipo de retorno es void.
b) A los métodos que extraen, que devuelven el valor del atributo les llaman get
seguido del nombre del atributo. En atributos simples no utilizan, generalmente,
parámetros y el tipo de retorno coincide con el tipo del atributo.
Ejemplo
Se puede completar el ejemplo con los métodos vistos:
class Recipiente {
private double lado;
private double altura;
// método para calcular el volumen
public double volumen(){
return lado*lado*altura;
}
// método para calcular el costo
public double costo(double cm){
double area= lado*lado+4*lado*altura;
return area*cm;
}
// método para obtener el lado
public double getLado(){
return lado;
}
// método para poner el lado
public void setLado(double newLado){
lado=newLado;
}
// método para obtener la altura
public double getAltura(){
return altura;
}
// método para poner la altura
public void setAltura(double newAltura){
altura=newAltura;

8
}
}

Observar:
 Se han incluido los métodos getLado() y getAltura(), sin parámetros y el
tipo de retorno es el mismo que el del argumento que ellos están
“devolviendo”. El cuerpo de estos métodos es simplemente una instrucción
return que devuelve el valor del atributo correspondiente.
 Se ha incluido el método setLado(double newLado) cuya función es tomar
el valor que se pasa como parámetro y ponerlo en el atributo. El parámetro
del método se puede ver como un valor que viene de fuera de la clase, que
en este momento no es importante saber de donde procede: si se lee, si se
calcula, etc.; la clase no necesita conocer el origen del valor, es un valor que
está llegando y que se le va a asignar al atributo lado. El tipo de retorno es
void porque está método solo altera el atributo, no devuelve nada.
 El método setAltura es similar al método explicado anteriormente.
 Utilización de los comentarios.

En el ejemplo se han utilizado los dos métodos de acceso para cada atributo, esto no
siempre es necesario y es importante comprender que es una decisión del programador si
los escribe o no. Pueden estar presentes los dos, puede que esté uno y no el otro, o puede
que no estén presentes ninguno de los dos, todo depende de la política que se quiera seguir
para acceder a los atributos. También es necesario aclarar que el nombre set y get no es
obligatorio, es una práctica usual entre los programadores, pero pueden ser llamados de
cualquier modo.

Ejemplo 2
Se desea construir una clase que permita trabajar puntos del plano, de manera que
se puedan trasladar a nuevas coordenadas, conocidos los desplazamientos.
En UML la representaríamos de la siguiente forma:

Punto
- double x
- double y
+ setX
+ setY
+ getX
+ getY
+ desplaza

9
Esta clase tiene como atributos las coordenadas x e y del punto. Los métodos son
las operaciones de acceso a cada uno de los atributos y el método desplaza que
calcula, conocidos x e y, las nuevas coordenadas del punto.
En Java quedaría:

class Punto{

// atributos: coordenadas del punto


private double x,y;

// metodos de acceso a los atributos


public double getX(){
return x;
}

public void setX(double newX){


x=newX;
}

public double getY(){


return y;
}

public void setY(double newY){


y=newY;
}

/* método para el desplazamiento, se necesitan


como parámetros los desplazamiento en el eje
x y en el eje y
*/
public void desplaza (double dx, double dy){
x = x + dx;
y = y + dy;
}

10
CONCLUSIONES

Se ha estudiado:
 La forma de representar una clase en UML
 La sintaxis para escribir una clase en Java:
o Atributos
o Métodos
 Los modificadores private y public para atributos y métodos.
 Los métodos de acceso a los atributos (set y get)

Bibliografía

- Conferencia en el servidor.

11

También podría gustarte