Sei sulla pagina 1di 50

Mdulo 3

Inicio a la
Programacin
Orientada a Objetos

Programacin Orientada a Objetos


De las Heras, Sebastin

3.1- Introduccin a la
Programacin Orientada a
Objetos
En el mdulo 1 hemos analizado los fundamentos del Paradigma
Orientado a Objetos desde una perspectiva conceptual y terica. En el
mdulo 2 abordamos el Lenguaje de Programacin Java para entender
su sintaxis y su estructura de programacin. Es momento ahora de llevar a
la prctica de la programacin, los conceptos del Paradigma Orientado a
Objetos utilizando el Lenguaje de Programacin Java.
Con Java podremos definir objetos que manipulan informacin y
hacerlos interactuar con otros objetos. Cada objeto que definimos,
representa una unidad independiente y tiene bajo su responsabilidad la
ejecucin de algunas operaciones. La estructura que un objeto tiene est
definida por la clase a la que pertenece y para ello debemos entender cmo
se definen las clases en Java con todas sus variantes. El concepto de clase es
fundamental para entender el Lenguaje de Programacin Orientado a
Objetos. En ella definimos los atributos y mtodos que soportarn las
instancias que son de su tipo.
En el momento que definimos una clase en Java, debemos definir qu
atributos y mtodos formarn parte de la misma. Este proceso de definir
los atributos ms significativos de una clase est relacionado al proceso de
Abstraccin que hemos analizado anteriormente.
Tambin debemos ocultar algunos miembros de la clase para que estos no
sean visibles por otros objetos. Para ello aplicaremos distintos
modificadores de acceso para los miembros de una clase y de esta forma
estaremos encapsulando los miembros de los objetos.
Cuando definimos una clase podemos utilizar la palabra clave extends
para indicar que dicha clase extiende de otra. En este caso estamos
aplicando el concepto de Herencia.
Por medio de la redefinicin de mtodos podremos ver cmo acta el
concepto de Polimorfismo en tiempo de ejecucin.
En conclusin, lo que queremos decir es que en el presente mdulo, muchos
de los conceptos del Paradigma Orientado a Objetos anteriormente vistos
sern aplicados y llevados a la prctica utilizando el Lenguaje de
Programacin Java.

Programacin Orientada a Objetos De las Heras, Sebastin | 2

3.2- Objetos Java


Un objeto es una unidad lgica compuesta por un conjunto de atributos
(o propiedades) y mtodos (o funciones) que se relacionan entre s.
Un objeto cuenta con un estado interno representado por los valores de
sus atributos y tambin presenta una interfaz (mtodos) con la que los
dems objetos podrn interactuar.
Cuando se declara una variable, la misma puede pertenecer a un tipo
primitivo o a un tipo por referencia. Si se trata de un tipo por
referencia, estamos trabajando con un objeto. El tipo de dato del objeto ser
el de una clase en particular:
Figura objeto;
En el caso anterior hemos declarado una variable de nombre objeto cuyo
tipo de dato se corresponde a la clase Figura.
Para acceder a los miembros de una clase (atributos y mtodos) se utiliza el
operador punto:
objeto.setAncho(10);
En la lnea anterior hemos invocado al mtodo setAncho() y como
parmetro hemos usado el nmero 10.
Tambin se pueden invocar mtodos que nos devuelven cierta informacin
en la que estamos interesados:
int ancho = objeto.getAncho();
En el ejemplo anterior hemos invocado al mtodo getAncho() para obtener
el ancho del objeto y guardamos el valor obtenido en la variable ancho.
Los objetos en Java son utilizados en la medida que se los necesitan. Una
vez que los mismos no son necesarios, son eliminados para liberar el
espacio en memoria que ocupan. Para eliminar un objeto en Java no es
necesario aplicar ninguna sentencia en particular, ya que Java implementa
un mecanismo constituido por un proceso de baja prioridad denominado
Garbage Collector (recolector de basura) que se encarga de monitorear
los objetos que han dejado de utilizarse y que no sern utilizados y los
elimina de la memoria.

Programacin Orientada a Objetos De las Heras, Sebastin | 3

3.3- Clases Java


3.3.1- Declaracin
En el mdulo 1 hemos definido a una clase como un modelo que define los
atributos y mtodos comunes a todos los objetos de ciertas caractersticas
similares. Una clase representa uno de los elementos ms bsicos a la hora
de programar una aplicacin Java.
Si deseramos crear una clase, simplemente es necesario un archivo
fuente que tenga como contenido la palabra clave class seguida del
identificador de la clase y un bloque de cdigo delimitado por dos
llaves.

class NombreDeClase
{
//. . . definicin de atributos y mtodos
}
El nombre del archivo fuente debe coincidir con el nombre de la clase.
A la declaracin de la clase se le pueden agregar controles o
modificadores de acceso. Para entender los controles de acceso de una
clase es bueno mencionar primero lo que se entiende por paquete. Un
paquete es un mecanismo con el que se vale Java para mantener agrupadas
las clases que tienen alguna relacin en comn. Para declarar la pertenencia
de una clase a un paquete se debe utilizar la sentencia package al
comienzo del archivo fuente. En la seccin 3.7 (Control de acceso a
miembros) del presente mdulo se describe en forma ms extensa el
concepto de paquete.
Una clase puede tener los siguientes niveles de acceso:

Pblico: la clase puede ser utilizada por cualquier otra clase en


cualquier paquete. Este tipo de control de acceso se marca
utilizando la palabra clave public.

Por defecto: si no indicamos el tipo de acceso en la declaracin de


la clase, entonces el tipo de acceso de la clase es por defecto. Este
tipo de control de acceso permite la utilizacin de la clase solamente
por otras clases del mismo paquete. Por ejemplo, si tenemos las
clases A y B definidas en paquetes distintos, y la clase A tiene
como tipo de acceso el nivel por defecto, entonces la clase B no
podr crear una instancia de la clase A, ni siquiera podr hacer uso
de ella en ninguna ocasin.

Teniendo en cuenta lo anteriormente mencionado, ya estamos en


condiciones de definir, por ejemplo, la clase Figura perteneciente al
paquete programacion:
package programacion;

Programacin Orientada a Objetos De las Heras, Sebastin | 4

public class Figura {


}
Mediante esta clase estamos en condiciones de representar a aquellas
entidades que representan figuras. El nivel de acceso que hemos
configurado para la clase es pblico, es decir que cualquier clase en
cualquier paquete puede hacer referencia a la clase Figura.

Programacin Orientada a Objetos De las Heras, Sebastin | 5

3.3.2- Atributos
Atributos de instancia
La estructura de una clase define los atributos y mtodos que contendrn
los objetos que son de su tipo. Si definisemos un objeto de tipo Figura, el
mismo no tendra ningn atributo o mtodo debido a que no los hemos
definido en la clase.
Los atributos en una clase se definen de la siguiente manera:
class NombreDeClase
{
tipo_de_dato identificadorAtributo1;
tipo_de_dato identificadorAtributo2;
// . . .
}
A continuacin definiremos los atributos nombre, alto y ancho en la
clase Figura:
package programacion;
public class Figura
{
String nombre;
int alto;
int ancho;
}
El atributo nombre es una variable de tipo String y los atributos alto y
ancho son variables de tipo int.
El estado de un objeto est representado por los valores de sus atributos.
Una instancia de la clase Figura tendra un estado representado por los
valores de los atributos nombre, alto y ancho.
Al definir los atributos en la clase Figura estamos definiendo las
propiedades ms representativas de las entidades de tipo Figura. Cuando
definimos el concepto de abstraccin habamos mencionado que
mediante la misma se trata de distinguir las caractersticas esenciales de un
objeto y se dejan de lado aquellas otras caractersticas que no son
relevantes. Para nosotros, las caractersticas ms importantes de un objeto
de tipo Figura son el nombre, el alto y el ancho, y por ello definimos
sus atributos correspondientes en la definicin de la clase Figura. Una
definicin ms detallada de una figura podra incluir una lista ms extensa
de atributos, pero para nuestro presente inters y para nuestro proceso de
abstraccin solamente nos interesa definir los atributos nombre, alto y
ancho. En el proceso de definicin de atributos de una clase lo que
estamos haciendo es aplicar el proceso de abstraccin del Paradigma
Orientado a Objetos.

Programacin Orientada a Objetos De las Heras, Sebastin | 6

Constante
Una constante es un atributo definido en una clase cuyo valor asignado
no puede ser redefinido. Para marcar un atributo como una constante
es necesario utilizar la palabra clave final en la declaracin de la
variable.
El compilador nos obliga a asignar un valor para la variable en el momento
de la declaracin de la variable (o en la implementacin de sus
constructores). Una vez asignado un valor, el mismo no podr ser
redefinido y cualquier intento de asignar un nuevo valor a la variable ser
un error de compilacin.
final int constante = 10;
La variable constante tiene el valor asignado 10 y ningn otro valor
podr ser reasignado en dicha variable.

Atributos de clase o estticos


Un atributo de clase o esttico es aquel que existe sin depender de
una instancia en particular y es comn a varios objetos. Este tipo de
atributo se marca utilizando la palabra clave static en la declaracin
del atributo.
Supongamos que deseamos almacenar en un atributo la cantidad de
instancias de la clase Figura que vamos creando. Podemos declarar un
atributo esttico en la clase Figura y por cada vez que se cree una
instancia, se debe aumentar el valor de este atributo en una unidad. La
declaracin del atributo esttico podra ser la siguiente:
static int cantidadDeFiguras;
Es este atributo dependiente de una instancia en particular? No.
Almacena este atributo informacin comn a todos los objetos de la clase
Figura? S.
Cuando un atributo es esttico, existe una nica copia del mismo
independientemente del nmero de instancias de la clase que lo contiene, y
esas instancias comparten el atributo. En nuestro ejemplo, cualquier objeto
de tipo Figura puede modificar el valor del atributo cantidadDeFiguras
y dicha modificacin es tenida en cuenta por el resto de los objetos de la
misma
clase
porque
todos
ellos
comparten
el
atributo
cantidadDeFiguras.
Para manipular un atributo esttico no es necesario crear un objeto para
tener acceso por medio del mismo. Debido a que un atributo esttico no
depende de la existencia de una instancia en particular, se lo puede
referenciar simplemente con el nombre de la clase que contiene al atributo
seguido del operador punto y el nombre de la variable:
Figura.cantidadDeFiguras = Figura.cantidadDeFiguras++;

Programacin Orientada a Objetos De las Heras, Sebastin | 7

Como ejemplos de atributos estticos podemos mencionar aquellos que


define Java en su cuerpo de clases:
-

System.out: cada vez que deseamos mostrar en consola un mensaje


en particular lo hacemos invocando al mtodo println() del objeto
out que se encuentra en la clase System del paquete java.lang.
El objeto out es un atributo esttico de la clase System y para
utilizarlo no es necesario crear una instancia de la clase System.
Simplemente lo invocamos haciendo referencia a la clase System
seguido del operador punto (.) y el nombre del atributo.

La clase Math del paquete java.lang ofrece una amplia variedad


de atributos estticos. Podemos pensar que el valor del nmero Pi
o del nmero de Euler no dependen de alguna instancia especfica.
La clase Math los define entonces como atributos estticos:
package programacion;
public class AtributosEstaticos
{
public static void main(String[] args)
{
System.out.println("Atributo esttico Math.PI:
" + Math.PI);
System.out.println("Atributo esttico Math.E:
" + Math.E);
}
}

Variable local
Una variable declarada dentro del cuerpo de un mtodo se denomina
variable local. Se denomina as porque solamente puede ser utilizada
dentro del mbito del mtodo en el que fue declarada:
void metodo()
{
int a = 0;
}
En el ejemplo anterior, la variable a es una variable local. Esta variable es
solamente conocida dentro del mtodo. El tiempo de vida de la variable
local comienza cuando es declarada dentro del mtodo y finaliza cuando la
ejecucin del mtodo ha terminado.
Las variables locales no tienen valores por defecto, por lo que antes de hacer
uso de ellas dentro del mtodo es necesario asignarles un valor. Si se
intenta hacer uso de una variable local antes de que se le asigne un valor
obtendremos un error de compilacin.
Los parmetros declarados en la definicin de un mtodo se consideran
variables locales. El nico modificador que se puede aplicar a una variable
local es la palabra clave final. Este modificador puede ser utilizado para
prevenir cualquier intento de asignacin de un nuevo valor sobre la variable
(constante).

Programacin Orientada a Objetos De las Heras, Sebastin | 8

3.3.3- Mtodos
Siguiendo los conceptos del Paradigma Orientado a Objetos, tambin
hemos mencionado que la manipulacin de un objeto debe realizarse por
medio de sus mtodos. Estos mtodos definen el comportamiento del
objeto. Los mtodos definidos en una clase representan las operaciones
que tendrn las instancias de la misma.
Cuando se invoca un mtodo de un objeto, el objeto que invoca la operacin
puede solicitar la ejecucin de una operacin, o puede conjuntamente
solicitar la ejecucin de una operacin y esperar un resultado al finalizar la
misma.

Objeto A

metodoB()

Objeto B

En este caso, la clase a la que pertenece el objeto B tiene definido un


mtodo que ejecuta una serie de acciones pero no devuelve ningn valor al
objeto que solicit la ejecucin del mtodo. La declaracin del mtodo debe
incluir la palabra clave void para indicar que el mtodo no devuelve
ningn valor.

Objeto A
metodoB()

Resultado

Objeto B

Programacin Orientada a Objetos De las Heras, Sebastin | 9

En este otro caso, la clase a la que pertenece el objeto B tiene definido un


mtodo que ejecuta una serie de acciones y devuelve un valor que puede ser
un resultado o algn valor significativo para quien solicit la ejecucin del
mtodo. En este caso, la declaracin del mtodo debe incluir el tipo de dato
del valor que se devuelve. Adems, en el cuerpo del mtodo, la ltima
sentencia se debe corresponder con la sentencia return y a continuacin
la variable o expresin que ser devuelta.
De esta forma, la declaracin de un mtodo en Java sigue la siguiente
estructura:
tipo_de_dato_devuelto identificadorMetodo(parametros)
{
cuerpo_del_mtodo;
}

Debemos tener en cuenta que el tipo de dato del valor o expresin que se
devuelve se debe corresponder con el tipo de dato que se define en la
declaracin del mtodo, de lo contrario obtendremos un error de
compilacin.
En muchas ocasiones, puede ser necesario que un mtodo solicite uno o
varios parmetros para cumplir con su objetivo. Para indicar que un
mtodo debe recibir parmetros, se los debe declarar en la definicin del
mtodo a continuacin del nombre y delimitados entre parntesis.
Siguiendo con el ejemplo de la clase Figura, vamos a definir una serie de
mtodos que nos permitan obtener los valores de los atributos definidos en
la clase:
int getAlto() {
return alto;
}
int getAncho() {
return ancho;
}
String getNombre() {
return nombre;
}
Estos tipos de mtodos que tienen por finalidad la obtencin de algn valor
de un atributo del objeto se denominan getters.
De la misma forma, vamos a definir un conjunto de mtodos que permitan
modificar los valores de los atributos de la clase:
void setAlto(int a) {
alto = a;
}
void setAncho(int a) {
ancho = a;
}

Programacin Orientada a Objetos De las Heras, Sebastin | 10

void setNombre(String n) {
nombre = n;
}
El objetivo de estos mtodos es poder modificar los valores de los atributos
de un objeto. Para ello, estos mtodos deben recibir como parmetro el
nuevo valor que ser asignado en el atributo que se desea modificar. Estos
tipos de mtodos se denominan setters.
Nuestra clase Figura queda de la siguiente forma:
package programacion;
public class Figura
{
String nombre;
int alto;
int ancho;
int getAlto() {
return alto;
}
void setAlto(int a) {
alto = a;
}
int getAncho() {
return ancho;
}
void setAncho(int a) {
ancho = a;
}
String getNombre() {
return nombre;
}
void setNombre(String n) {
nombre = n;
}
}

Programacin Orientada a Objetos De las Heras, Sebastin | 11

3.3.4- Herencia
Extensin
Uno de los conceptos ms importantes del Paradigma Orientado a Objetos
es el de Herencia. Es el mecanismo que permite que una clase defina sus
propios atributos y mtodos, y tambin pueda heredar atributos y mtodos
de otras clases.
La Herencia entre clases establece una relacin de padre-hijo en la cual la
clase hija resa los atributos y mtodos definidos en la clase padre, pero
tambin la clase hija puede definir sus propios atributos y mtodos.
Para indicar que una clase extiende de otra se debe utilizar la palabra clave
extends y esto se marca en la declaracin de la clase hija a continuacin
del nombre de la clase:
class NombreSubClase extends NombreSuperClase
Se dice que la subclase extiende o hereda los atributos y mtodos definidos
en la superclase.
Siguiendo con nuestro ejemplo, podemos crear dos subclases que extiendan
de la clase Figura. Para ello vamos a definir las clases Rectangulo y
Triangulo.
package programacion;
public class Rectangulo extends Figura
{
boolean cuadrado;
// variable booleana que
// indica si el tringulo
// es un cuadrado o no.
boolean isCuadrado() {
return cuadrado;
}
void setCuadrado(boolean b) {
cuadrado = b;
}
}
La clase Rectangulo extiende de la clase Figura, en consecuencia podemos
hacer las siguientes afirmaciones sobre un objeto de tipo Rectangulo:
Es una instancia de la clase Rectangulo (es un rectngulo).
Es una instancia de la clase Figura (es una figura).
Hereda los atributos y mtodos definidos en la clase Figura.
Cuenta con sus propios atributos y mtodos definidos en la clase
Rectangulo.

Programacin Orientada a Objetos De las Heras, Sebastin | 12

package programacion;
public class Triangulo extends Figura
{
/* Esta variable es utilizada para indicar
* si el tringulo es equiltero,
* issceles o escaleno.
*/
String tipoTriangulo;
String getTipoTriangulo() {
return tipoTriangulo;
}
void setTipoTriangulo(String tipo) {
tipoTriangulo = tipo;
}
}
La clase Triangulo extiende de la clase Figura, en consecuencia podemos
hacer las siguientes afirmaciones sobre un objeto de tipo Triangulo:
Es una instancia de la clase Triangulo (es un tringulo).
Es una instancia de la clase Figura (es una figura).
Hereda los atributos y mtodos definidos en la clase Figura.
Cuenta con sus propios atributos y mtodos definidos en la clase
Triangulo.

Programacin Orientada a Objetos De las Heras, Sebastin | 13

Figura
Atributos
nombre
alto
ancho
Mtodos
getAlto
setAlto
getAncho
setAncho
getNombre
setNombre

Rectangulo
Atributos
cuadrado
Mtodos
esCuadrado
setCuadrado

Triangulo
Atributos
tipoTriangulo
Mtodos
getTipoTriangulo
setTipoTriangulo

La figura anterior describe el esquema de nuestras clases.


Java permite desarrollar mltiples niveles de herencia (cuando una clase
extiende de otra clase y sta ltima de otra y as sucesivamente), pero
recordemos que una clase puede extender de solamente una clase en forma
directa (la herencia mltiple no est permitida).
Si deseamos tener un mayor control sobre los atributos y mtodos que una
clase hereda de otra, y en general, sobre el nivel de visibilidad de los
miembros de una clase, podemos definir distintos niveles de acceso para los
mismos y los veremos en la seccin 3.7 (Control de acceso a miembros).

La clase java.lang.Object
En el Lenguaje de Programacin Java, todas las clases, tanto las
creadas por el programador como las que pertenecen a la API de Java,
tienen una superclase en comn: la clase java.lang.Object.
Todas las clases en Java derivan directa o indirectamente de
java.lang.Object. Aun cuando no indiquemos explcitamente ninguna
relacin de extensin en la declaracin de una clase, el compilador de Java
automticamente considera que extiende de Object. Esta configuracin
convierte a esta clase en la raz de la jerarqua de todas las clases de Java.

Programacin Orientada a Objetos De las Heras, Sebastin | 14

De esta forma, todos los objetos que alguna vez usemos en Java cuentan
con los mtodos definidos en la clase Object:
clone(): mtodo utilizado para crear una copia del presente objeto.
equals(Object obj): mtodo utilizado para evaluar si dos objetos
son conceptualmente iguales.
finalize(): mtodo utilizado por el Garbage Collector cuando no
hay ms variables que referencian al objeto.
getClass(): mtodo utilizado para obtener la clase a la que
pertenece el objeto.
hashCode(): mtodo utilizado para obtener un cdigo hash del
objeto.
toString(): este mtodo devuelve un objeto String que contiene
una representacin en cadena de caracteres del objeto.
Los mtodos notify(),notifyAll() y wait(), son utilizados para la
manipulacin de hilos de ejecucin.
El mtodo toString() es muy utilizado en el desarrollo de aplicaciones ya
que es utilizado con el propsito de obtener una cadena de caracteres como
una representacin significativa del objeto.

Redefinicin de mtodos
Cuando una clase extiende de otra, hereda los mtodos definidos en la
superclase. Pero puede ser posible que la subclase tenga una forma distinta
de implementar el mtodo heredado. En este caso la subclase debe redefinir
o sobrescribir el mtodo heredado. En el mdulo 1 mencionamos:
La redefinicin de mtodos permite que una subclase o clase hija
sobrescriba un mtodo definido en la superclase o clase padre. La
implementacin definida en la clase hija sobrescribe la implementacin de
la clase padre.
La mejor forma de describir este concepto es a travs de un ejemplo.
Anteriormente habamos mencionado que la clase Object es la superclase de
todas las clases en Java, y en consecuencia todas las clases heredan los
mtodos definidos en la clase Object. Uno de los mtodos definidos en esta
clase, es el mtodo toString(). El propsito de este mtodo es el de
devolver una cadena de caracteres que sea una representacin significativa
del objeto.
Veamos el siguiente ejemplo en donde vamos a crear un objeto de tipo
Figura y vamos a mostrar en pantalla el resultado de la ejecucin del
mtodo toString():

Programacin Orientada a Objetos De las Heras, Sebastin | 15

package programacion;
public class Principal
{
public static void main(String[] args) {
Figura figura = new Figura();
figura.setNombre("Figura ejemplo");
figura.setAlto(2);
figura.setAncho(4);
System.out.println(figura.toString());
}
}
El resultado de la ejecucin es:
programacion.Figura@7919298d

Dicha salida se corresponde a la implementacin del mtodo toString() de


la clase Object: retorna un String formado por el nombre completo de la
clase, seguido del smbolo @ y una representacin en hexadecimal del
cdigo hash del objeto.
Luego de ver en consola el resultado del mtodo toString(), podemos
pensar que es deseable obtener una salida que sea ms representativa del
objeto en comparacin a la cadena de caracteres que obtuvimos. Para ello,
podemos redefinir el mtodo toString() en la clase Figura de la siguiente
manera:
public String toString() {
String s = "Nombre: " + nombre +
"\n" +
"Alto: " + alto +
"\n" +
"Ancho: " + ancho;
return s;
}
Si volvemos a ejecutar la aplicacin obtendremos el siguiente resultado:
Nombre: Figura ejemplo
Alto: 2
Ancho: 4
La salida obtenida es una representacin conceptual ms significativa del
objeto. Simplemente lo que hicimos fue definir una implementacin
distinta del mtodo toString() para los objetos de la clase Figura.
A travs del mecanismo de redefinicin o sobrescritura de mtodos,
podemos definir una implementacin distinta para un mtodo
heredado en comparacin a la implementacin del mtodo definida en
la superclase.

Programacin Orientada a Objetos De las Heras, Sebastin | 16

Para sobrescribir un mtodo en una subclase, el mtodo sobrescrito debe


tener la misma firma que el mtodo de la superclase (mismo nombre,
mismos parmetros y mismo tipo de dato a devolver). De lo contrario
estaremos definiendo un nuevo mtodo en la subclase.

Mtodo final
Si deseamos indicar que un mtodo no puede ser redefinido o
sobrescrito, podemos utilizar el modificador final.
Un ejemplo de mtodo final puede ser el mtodo getClass() de la clase
java.lang.Object:
public final Class getClass()

Cualquier intento de redefinir el mtodo getClass() producir un error de


compilacin.

Clase final
Una clase final es aquella que no puede ser derivada, no puede tener
subclases.
Cualquier intento de definir una clase hija como una extensin de una clase
final dar como resultado un error de compilacin.
Para marcar una clase como final se debe utilizar la palabra clave final
en la declaracin de la clase.
final class NombreDeLaClase
Un ejemplo de una clase final es la clase String del paquete java.lang. Su
declaracin figura de la siguiente forma:
public final class String
El modificador final impide que la clase String pueda ser derivada.

Programacin Orientada a Objetos De las Heras, Sebastin | 17

Clase abstracta
Una clase abstracta es aquella que no puede ser instanciada. Es
utilizada para derivar a partir de ella subclases.
Una clase abstracta se declara utilizando la palabra clave abstract en la
declaracin de la clase.
En nuestro ejemplo, podramos pensar que la clase Figura puede ser una
clase abstracta. Habiendo definido las subclases Rectangulo y Triangulo, es
ilgico pensar que pueda haber una instancia de la clase Figura que
represente solamente a una figura y no sea algo ms especfico que una
figura. En nuestro esquema de clases, una figura puede ser un rectngulo o
un tringulo, y no solamente una figura.
Vamos a definir la clase Figura como abstracta:
public abstract class Figura
{
.
.
.
}
Cualquier intento de crear una instancia de la clase Figura nos dar un
error de compilacin:
package programacion;
public class Principal
{
public static void main(String[] args) {
Figura figura = new Figura(); // error de
compilacin
figura.setNombre("Figura ejemplo");
figura.setAlto(2);
figura.setAncho(4);
System.out.println(figura.toString());
}
}
Si intentamos ejecutar el cdigo anterior obtendremos la siguiente salida:
Exception in thread "main" java.lang.RuntimeException:
Uncompilable source code - programacion.Figura is
abstract; cannot be instantiated
at programacion.Principal.main(Principal.java:6)
Java Result: 1
Si deseamos representar una figura, lo debemos hacer por medio de las
subclases Rectangulo o Triangulo.

Programacin Orientada a Objetos De las Heras, Sebastin | 18

Mtodo abstracto
Un mtodo abstracto es aquel en el cual se define su declaracin pero
no su implementacin.
Lo vamos a explicar con un ejemplo. Siguiendo con nuestro esquema de
clases, sera interesante que una vez creado un objeto rectngulo o tringulo
se le pueda consultar el clculo de su rea. Para ello, se puede definir para
ambos tipos de objetos el mtodo calcularArea(). Como este mtodo es
comn tanto para una instancia de la clase Rectangulo como para una
instancia de la clase Triangulo, podemos escribir la definicin de este
mtodo en la clase Figura. De esta forma, cualquier clase que derive de la
clase Figura contar con el mtodo calcularArea(). Cmo ser la
implementacin de este mtodo? La forma de calcular el rea de un
rectngulo es distinta a la de un tringulo. Pero por otro lado, el mtodo
calcularArea() es comn a todas las figuras, razn por la cual lo habamos
definido en la clase Figura.
En estos casos, se marca al mtodo calcularArea() de la clase Figura como
abstracto. Un mtodo abstracto es aquel que tiene definida su declaracin
pero no su implementacin.
abstract float calcularArea();
Podemos notar que el mtodo no contiene ningn bloque de cdigo
encerrado entre llaves.
Cuando un mtodo es abstracto, se obliga a que cada subclase defina su
propia implementacin del mtodo. La clase Rectangulo y la clase
Triangulo deben definir su propia implementacin del mtodo heredado
marcado como abstracto. Vamos a definir la implementacin del mtodo
calcularArea() para ambas clases.
Rectngulo:
float calcularArea() {
float area = alto * ancho;
return area;
}
Tringulo:
float calcularArea() {
float area = (float)(alto * ancho) / 2;
return area;
}
El compilador obliga que las clases Rectangulo y Triangulo definan una
implementacin para el mtodo calcularArea(). De lo contrario,
obtendremos un error de compilacin.

Programacin Orientada a Objetos De las Heras, Sebastin | 19

Otro punto a tener en cuenta, es que cuando el mtodo de una clase se


declara como abstracto, entonces la clase que contiene al mtodo debe ser
abstracta.

Interface
Supongamos que estamos manipulando una aplicacin en la cual se define
un listado que puede almacenar objetos de cualquier tipo. El objetivo es
realizar comparaciones entre los objetos que se encuentran contenidos en el
listado. Para definir el listado se podra utilizar un vector de referencias a
Object de la siguiente forma:
Object listadoDeObjetos[];
Nuestro problema radica en cmo podemos comparar los objetos del
listado. Podramos pensar que todo objeto contenido en el listado debera
contener un mtodo que permita la comparacin con otro objeto de su
mismo tipo. Ese mtodo podra llamarse compareTo(x) y sera invocado
de la siguiente manera:
objeto1.compareTo(objeto2);
El objeto objeto1 es comparado con objeto2 y los posibles resultados son
los siguientes:
= 0 : los objetos que se compararon son iguales.
> 1 : el objeto invocante (objeto1) es mayor al parmetro (objeto2).
< 1 : el objeto invocante (objeto1) es menor al parmetro (objeto2).
Ya tenemos una idea del mtodo que realizar la comparacin de los
objetos, pero en dnde definimos a este mtodo? Debido a que espera
realizar comparaciones entre cualquier objeto de cualquier tipo podramos
pensar en definir este mtodo en la clase Object. Pero esta clase no es una
clase que podemos editar ya que pertenece al cuerpo de clases de Java.
Otra opcin podra ser la definicin de una clase abstracta que contenga al
mtodo compareTo() como abstracto y que todas las clases que formen
parte del listado de comparacin hereden de esta clase abstracta para
forzarlas a implementar el mtodo compareTo(). El problema en este caso
es que algunas de las clases ya podran estar heredando alguna otra clase y
en Java la herencia mltiple no est permitida.
Para solucionar este problema vamos a aplicar el concepto de interface. Una
interface es bsicamente una clase abstracta que provee solamente
mtodos abstractos y constantes. Para definir una interface se utiliza la
palabra clave interface. Una interface que permita solucionar nuestro
problema podra ser la siguiente:
public interface Comparable {
int compareTo(Object x);
}

Programacin Orientada a Objetos De las Heras, Sebastin | 20

En general, se suele llamar a las interfaces con nombres que terminan en


able. De esta forma, el nombre sugiere que los objetos que implementan
los mtodos de la interface adquieren el comportamiento definido en la
interface. Los objetos que implementen el mtodo compareTo() sern
Comparables.
En el caso de la interface Comparable, no es necesario que la definamos.
Esta interface ya se encuentra definida en el cuerpo de clases de Java en el
paquete java.lang. Esta interface es utilizada si deseamos realizar
comparaciones conceptuales entre objetos.
Las clases no heredan interfaces, las implementan. Para indicar que una
clase implemente una interface, se utiliza la palabra clave implements:
public class A implements Comparable
Las clases que implementan una interface, tienen la obligacin de definir
una implementacin para los mtodos que se declaran en dicha interface.
En este caso, la clase A debe definir una implementacin para el mtodo
comparteTo(). Los objetos de la clase A tienen definido un
comportamiento Comparable.
public class A implements Comparable
{
public int compareTo(Object x)
{
// implementacin del mtodo
}
}
A diferencia de la extensin en donde una clase puede extender desde
solamente una nica clase, en la implementacin de interfaces una clase
puede implementar una o varias interfaces.
public class B extends A implements I1, I2
En el caso anterior, la clase B extiende desde la clase A e implementa las
interfaces I1 e I2.
Volviendo a nuestro problema, en lugar de declarar un vector de referencias
a Object, declararemos un vector de referencias polifrmicas a objetos
Comparables:
Comparable listadoDeObjetos[];
Para que un objeto tenga un comportamiento Comparable, la clase a la que
pertenece el objeto debe implementar la interface Comparable y definir el
mtodo c
ompareTo(). De esta forma, podremos agregar en el listado de objetos
cualquier objeto Comparable y para realizar futuras comparaciones entre
estos objetos se debe invocar el mtodo compareTo().
El vector estar compuesto por referencias polifrmicas de la interface
Comparable. Cuando invoquemos al mtodo compareTo() se ejecutar el
mtodo definido en la clase a la que apunta la referencia.

Programacin Orientada a Objetos De las Heras, Sebastin | 21

Para tener en cuenta:


Una interface solamente puede tener mtodos abstractos.
Si una clase abstracta implementa una interface, no es necesario que
la clase abstracta implemente los mtodos definidos en la interface,
pero la primera clase concreta que extienda de la clase abstracta
deber implementar los mtodos abstractos de la interface.
En una interface adems de mtodos se pueden definir constantes
(atributos estticos y finales).
Una interface puede extender de una o varias interfaces y solamente
interfaces (no clases).
Los mtodos definidos en una interface son implcitamente pblicos
y abstractos.
Los atributos definidos en una interface son siempre pblicos,
estticos y finales.

Programacin Orientada a Objetos De las Heras, Sebastin | 22

3.4- Constructores
Los constructores son mtodos especiales que se definen en una clase y
son utilizados para la creacin e inicializacin de un objeto.
Un mtodo constructor debe cumplir con las siguientes reglas:
Su nombre es el mismo al de la clase que lo implementa.
No retorna ningn valor.
Puede hacer uso de parmetros.
Se pueden definir varios mtodos constructores en una clase.
Una clase puede no tener definido en forma explcita un mtodo
constructor.
Siempre toda clase contiene al menos un constructor (definido
implcitamente o explcitamente).
Cuando mencionamos la palabra inicializacin estamos haciendo referencia
a la asignacin de valores para los atributos de un objeto. El objetivo de un
constructor es el de inicializar los atributos de un objeto, es decir iniciar
el estado interno de un objeto.
Vamos a definir un constructor para la clase Figura que permita inicializar
los atributos nombre, alto y ancho:
Figura(String nom, int alt, int anc) {
nombre = nom;
alto = alt;
ancho = anc;
}
Este constructor recibe 3 parmetros:
1) El primer parmetro (nom) es un objeto de tipo String y su valor
ser asignado al atributo nombre.
2) El segundo parmetro (alt) es un atributo numrico entero y su
valor ser asignado al atributo alto.
3) El tercer parmetro (anc) es un atributo numrico entero y su
valor ser asignado al atributo ancho.
Tambin vamos a definir el siguiente constructor:
Figura() {
}
Este tipo de constructor se denomina constructor por defecto. Se
caracteriza por no recibir ningn parmetro y su cuerpo est vaco. En este
caso el constructor inicializa los atributos del objeto con valores
predeterminados de acuerdo a los tipos de datos de los atributos.

Programacin Orientada a Objetos De las Heras, Sebastin | 23

Si no se define en forma explcita ningn constructor, el compilador


definir un constructor por defecto, es decir, si en nuestro ejemplo no
definisemos ningn constructor, el compilador generara un constructor
por defecto en la clase Figura.
Cuando se utiliza un constructor por defecto, aquellos atributos del objeto
que no tienen asignado un valor en su declaracin, son inicializados con
valores por defecto de acuerdo al tipo de dato. La siguiente lista muestra los
valores por defecto o predeterminados de acuerdo a los distintos tipos de
datos:
Tipo de dato

Valor por defecto

byte, short, int, long

float, double

0.0

boolean

false

char

'\u0000'

objeto

null

Vamos a definir los constructores por parmetros y por defecto de la clase


Rectangulo:
Rectangulo(String nom, int alt, int anc, boolean cuad) {
nombre = nom;
alto = alt;
ancho = anc;
cuadrado = cuad;
}
Rectangulo() {
}
Vamos a definir los constructores por parmetros y por defecto de la clase
Triangulo:
Triangulo(String nom, int alt, int anc, String tipo) {
nombre = nom;
alto = alt;
ancho = anc;
tipoTriangulo = tipo;
}
Triangulo() {
}

Programacin Orientada a Objetos De las Heras, Sebastin | 24

3.5- Declaracin y creacin


de objetos
Para hacer referencia a un objeto simplemente se debe declarar una
variable con un identificador vlido y se le debe asociar un tipo de dato por
referencia a la variable. Este tipo de dato no es nada ms y nada menos que
una clase.
De la misma forma que cuando definamos una variable cuyo tipo de dato
era un primitivo, para declarar un objeto se procede de la misma forma
pero su tipo de dato ser el de una clase (tipo de dato por referencia).
A continuacin vamos a definir un objeto o una instancia de la clase
Rectangulo:
Rectangulo rectangulo;
En el ejemplo anterior hemos definido una variable de tipo Rectangulo
cuyo nombre es rectangulo.
Por el momento solamente hemos definido una variable de tipo Rectangulo
pero no hemos creado ningn objeto. Para crear un objeto es necesario
invocar a un constructor de la clase. Esto se hace mediante el operador
new.
Rectangulo rectangulo =
new Rectangulo(Rectngulo, 5, 10, false);
De esta forma hemos creado e inicializado un objeto o una instancia de la
clase Rectangulo cuyos atributos tienen los siguientes valores:
nombre: Rectngulo
ancho: 5
alto: 10
cuadrado = false
Es en este momento en donde se hace uso de los constructores definidos en
la clase. En este caso hemos decidido crear una instancia de la clase
Rectangulo utilizando el constructor por parmetros anteriormente
definido en la clase:
Rectangulo(String nom, int alt, int anc, boolean cuad)
{
nombre = nom;
alto = alt;
ancho = anc;
cuadrado = cuad;
}

Programacin Orientada a Objetos De las Heras, Sebastin | 25

Cuando se invoca al operador new, el compilador busca un mtodo que


tenga el mismo nombre al de la clase que hace la llamada (constructor)
y dicho mtodo se debe corresponder con el nmero y tipos de
parmetros invocados durante la llamada.
Con los conceptos que hemos adquirido hasta el momento, estamos en
condiciones de crear una pequea aplicacin en la que se declaren y creen
objetos de tipo Rectangulo o Triangulo y se muestren sus valores en
pantalla.
package programacion;
public class Ejemplo {
public static void main(String[] args) {
/* Definimos un objeto de tipo Rectangulo cuya variable
* de referencia tendr el nombre "rectangulo".
* Para su inicializacin invocamos al constructor
* por parmetros de la clase Rectangulo.
*/
Rectangulo rectangulo = new Rectangulo("Rectngulo", 5,
10, false);
/* Mostramos en pantalla los valores
* de los atributos del objeto "rectangulo".
*/
System.out.println("Atributos del objeto rectangulo");
System.out.println("Nombre figura: " +
rectangulo.getNombre());
System.out.println("Alto: " + rectangulo.getAlto());
System.out.println("Ancho: " + rectangulo.getAncho());
System.out.println("Es cuadrado?: " +
rectangulo.isCuadrado());
System.out.println("\n");
/* Definimos un objeto de tipo Triangulo cuya variable
* de referencia tendr el nombre "triangulo".
* Para su inicializacin invocamos al constructor
* por defecto de la clase Triangulo.
*/
Triangulo triangulo = new Triangulo();
/* Mostramos en pantalla los valores
* por defecto de los atributos del
* objeto "triangulo".
*/
System.out.println("Valores por defecto del objeto
triangulo");
System.out.println("Nombre figura: " +
triangulo.getNombre());
System.out.println("Alto: " + triangulo.getAlto());
System.out.println("Ancho: " + triangulo.getAncho());
System.out.println("Tipo de tringulo: " +
triangulo.getTipoTriangulo());

Programacin Orientada a Objetos De las Heras, Sebastin | 26

/* Modificamos los valores de los


* atributos del objeto "triangulo".
*/
triangulo.setNombre("Tringulo");
triangulo.setAlto(4);
triangulo.setAncho(6);
triangulo.setTipoTriangulo("Issceles");
System.out.println("\n");
/* Mostramos en pantalla los valores
* de los atributos del objeto "triangulo".
*/
System.out.println("Valores posteriores del objeto
triangulo");
System.out.println("Nombre figura: " +
triangulo.getNombre());
System.out.println("Alto: " + triangulo.getAlto());
System.out.println("Ancho: " + triangulo.getAncho());
System.out.println("Tipo de tringulo: " +
triangulo.getTipoTriangulo());
}
}

Para que el cdigo anterior compile, tambin hay que crear las clases
Rectangulo y Triangulo. Las definiciones de las mismas se encuentran en
las secciones anteriores de la lectura.
El resultado de la ejecucin es el siguiente:
Atributos del objeto rectangulo
Nombre figura: Rectngulo
Alto: 5
Ancho: 10
Es cuadrado?: false
Valores por defecto del objeto triangulo
Nombre figura: null
Alto: 0
Ancho: 0
Tipo de tringulo: null
Valores posteriores del objeto triangulo
Nombre figura: Tringulo
Alto: 4
Ancho: 6
Tipo de tringulo: Issceles

Programacin Orientada a Objetos De las Heras, Sebastin | 27

3.6- Mtodos de clase


Un mtodo de clase es aquel que puede ser utilizado sin depender de
una instancia en particular y puede ser utilizado de manera global. Es
un mtodo que no depende del estado de un objeto.
Estos mtodos tambin se denominan estticos y para indicar que un
mtodo es esttico simplemente se agrega la palabra clave static en la
definicin del mtodo. Las operaciones comunes a todas las instancias de
una clase suelen marcarse como mtodos estticos.
A modo de ejemplo vamos a agregar el siguiente mtodo en la clase Figura:
static void metodoEstatico() {
System.out.println("Se ejecut un mtodo
esttico");
}
Una vez creado el mtodo esttico, podemos llamar a dicho mtodo sin
necesidad de tener una instancia de la clase Figura. Simplemente
escribimos el nombre de la clase que contiene el mtodo seguido del
operador punto y el nombre del mtodo esttico.
package programacion;
public class Ejemplo {
public static void main(String[] args) {
Figura.metodoEstatico();
}
}
El resultado de la ejecucin es:
Se ejecut un mtodo esttico
Una consideracin a tener en cuenta es que los mtodos estticos no
pueden hacer referencia a atributos o a otros mtodos que no sean
estticos. Esto se debe a que en el momento en el que se ejecuta un mtodo
esttico, no hay ninguna instancia en particular que sea duea de la
ejecucin del mtodo y cuando desde un mtodo esttico se hace referencia
a un atributo o a otro mtodo no esttico, la mquina virtual de java
simplemente no conoce a qu instancia en particular se hace referencia.
Java dispone de un amplio contenido de mtodos estticos en las clases de
su API. Por ejemplo, la clase Math del paquete java.lang ofrece una amplia
variedad de mtodos estticos. Si quisiramos obtener la raz cuadrada de
un nmero podemos hacerlo llamando al mtodo esttico sqrt() de la clase
Math:

Programacin Orientada a Objetos De las Heras, Sebastin | 28

package programacion;
public class EjecucionMetodoEstatico {
public static void main(String[] args) {
System.out.println(Math.sqrt(9));
}
}

Programacin Orientada a Objetos De las Heras, Sebastin | 29

3.7- Control de acceso a


miembros
3.7.1- Paquetes
Para entender el concepto de control de acceso a miembros es bueno
entender el concepto de paquete.
Un paquete es un mecanismo utilizado por Java para agrupar clases e
interfaces que tienen alguna relacin en comn. Es una forma de
mantener mejor organizado nuestro proyecto.
Por ejemplo, pensemos en un proyecto compuesto por una gran cantidad de
clases. Luego de analizar dichas clases llegamos a la conclusin que muchas
de ellas tienen alguna relacin en comn:
Un grupo de clases se encarga de la interfaz visual con el usuario.
Un grupo de clases se encarga de la implementacin de la lgica del
programa.
Un grupo de clases se encarga de representar las entidades del
dominio del programa.
Teniendo en cuenta las relaciones anteriormente mencionadas, se podran
crear los siguientes paquetes:

Interfaz

Lgica

Entidad

De esta forma, nuestro cdigo se encuentra organizado en grupos de clases


denominados paquetes. Si deseamos buscar alguna clase con alguna
funcionalidad en comn, podemos ubicarla con mayor facilidad mediante la
agrupacin en paquetes.
Para declarar la pertenencia de una clase en un paquete se utiliza la palabra
clave package y a continuacin el nombre del paquete:
package nombrepaquete;
Esta sentencia debe ser la primera en una clase. En el caso de que no se
declare la sentencia package, se dice que la clase no pertenece a ningn
paquete en particular o pertenece al paquete por defecto del proyecto.
En una clase Java, solamente puede haber una nica declaracin de la
sentencia package, es decir, la clase solamente puede pertenecer a un nico
paquete.

Programacin Orientada a Objetos De las Heras, Sebastin | 30

Para nuestro ejemplo anterior:


-

Las clases que se relacionan con la interfaz de la aplicacin tendrn


como primera sentencia la declaracin package interfaz.

Las clases que se relacionan con la lgica de la aplicacin tendrn


como primera sentencia la declaracin package logica.

Las clases que se relacionan con la manipulacin de modelos de


entidades, tendrn como primera sentencia la declaracin package
entidad.

Tambin se pueden definir subpaquetes para lograr una mayor


organizacin y divisin de nuestro cdigo fuente.
Supongamos que en nuestra estructura de ejemplo, de las clases que
pertenecen al paquete lgica, hay un subgrupo de clases que se encargan
de la manipulacin de informacin con una base de datos. Se puede definir
entonces un subpaquete del paquete logica que agrupe las clases
relacionadas con la manipulacin de la base de datos. Para definir un
subpaquete se utiliza tambin la sentencia package pero de la siguiente
manera:
package nombrepaquete.nombresubpaquete1.nombresubpaquete2;

Se debe definir el nombre del paquete que contiene al primer subpaquete


seguido del nombre del segundo subpaquete y as sucesivamente en el caso
que haya ms subpaquetes.
Para nuestro caso, definimos el subpaquete basededatos de la siguiente
manera:
package logica.basededatos;
Cada vez que definimos un paquete, estamos creando un directorio en
nuestro sistema de archivos que contiene los archivos fuentes relacionados
con dicho paquete.
Vista de paquetes:

Programacin Orientada a Objetos De las Heras, Sebastin | 31

Vista de archivos:

En varios de nuestros ejemplos anteriores, las clases que hemos definido


pertenecen al paquete programacion. Esta es la razn por la cual veamos
la sentencia package programacion en los cdigos de ejemplo.
Supongamos que desde una clase cualquiera deseamos referenciar a otra
clase definida en otro paquete. Para poner un ejemplo ms concreto,
supongamos que desde la clase ClaseInterfaz se desea crear una variable
de tipo ClaseEntidad. Para ello, en el momento que invocamos a la clase,
debemos hacerlo mediante su nombre completo, definido por el paquete al
que pertenece seguido del nombre de la clase:
package interfaz;
public class ClaseInterfaz {
entidad.ClaseEntidad nombreEntidad;
}
Otra forma de referenciar a la clase ClaseEntidad es utilizando la
sentencia import a continuacin de la declaracin package.
package interfaz;
import entidad.ClaseEntidad;
public class ClaseInterfaz {
ClaseEntidad nombreEntidad;
}
Lo que hacemos con la sentencia import, es importar la definicin de la
clase ClaseEntidad para su referencia en la presente clase. De esta forma
se evita tener que escribir el nombre completo de la clase (nombre del
paquete seguido del nombre de la clase) cada vez que se la referencie.

Programacin Orientada a Objetos De las Heras, Sebastin | 32

Si deseamos importar todas las clases definidas en un paquete utilizando


una nica sentencia import se puede utilizar el carcter *.
package interfaz;
import entidad.*;
public class ClaseInterfaz {
ClaseEntidad nombreEntidad;
}
De esta forma, si el paquete entidad tiene varias clases definidas, mediante
esta sentencia se importan todos sus elementos.
La API de Java define un conjunto de clases organizadas en paquetes. A
continuacin describimos algunos de los paquetes principales de la API de
Java:
-

java.applet: paquete relacionado con la manipulacin de applets.

java.awt: paquete relacionado con el manejo de interfaces grficas


de usuario.

java.io: paquete relacionado con la entrada / salida de flujo de


datos.

java.lang: este paquete contiene las clases bsicas y fundamentales


del lenguaje Java. Las clases pertenecientes a este paquete son
importadas sin la necesidad utilizar la sentencia import.

java.net: paquete relacionado con la manipulacin de datos que se


transmiten en la red.

java.util: paquete que provee un conjunto de clases utilitarias para


el programador.

java.swing: paquete de clases que mejora las interfaces grficas


definidas en el paquete java.awt.

Programacin Orientada a Objetos De las Heras, Sebastin | 33

3.7.2- Modificadores de acceso


Los modificadores de acceso son palabras claves utilizadas en la
declaracin de un atributo o mtodo para indicar su visibilidad con
respecto al resto de las clases.
Existen cuatro modificadores de acceso para los miembros de una clase:
Pblico
Protegido
Por defecto
Privado

Los atributos y mtodos de una clase son los miembros de dicha clase. Qu
quiere decir que una clase puede tener acceso a la utilizacin de un
miembro de otra clase? Esto quiere decir que si una clase A tiene acceso a
los miembros de una clase B, entonces los miembros de la clase B son
visibles para la clase A.

Pblico
Cuando los miembros de una clase son declarados pblicos, entonces
cualquier otra clase sin importar el paquete al que pertenezca tiene
visibilidad sobre los miembros de la clase. Para marcar un atributo o
mtodo de una clase como pblico, se debe utilizar la palabra clave
public.
package paqueteA;
import paqueteB.B;
public class A {
public void metodoA() {
B b = new B();
b.metodoB();
}
}
package paqueteB;
public class B {
public void metodoB() {
}
}

Programacin Orientada a Objetos De las Heras, Sebastin | 34

En el ejemplo anterior, la clase A y la clase B pertenecen a distintos


paquetes, sin embargo desde la clase A se hace uso del mtodo metodoB()
definido en la clase B debido a que el modificador de acceso de este ltimo
es public.
Para una subclase, los miembros pblicos definidos en su superclase son
heredados por la subclase sin importar si se encuentran en el mismo
paquete o no.
package paqueteA;
import paqueteB.C;
public class A extends C {
public void metodoA() {
a = 10;
}
}

package paqueteB;
public class C {
public int a;
}

Protegido
Si el miembro de una clase es declarado como protegido (se usa la
palabra clave protected), entonces dicho miembro es visible por todas
las clases que pertenecen al mismo paquete de la clase que contiene el
mtodo y tambin es visible por cualquier subclase sin importar en qu
paquete se encuentre por medio del mecanismo de herencia.
package paqueteB;
public class B {
protected void metodoB() {
}
}
package paqueteB;
public class C {

Programacin Orientada a Objetos De las Heras, Sebastin | 35

public void metodoC() {


B b = new B();
b.metodoB();
}
}

El mtodo protegido metodoB() de la clase B es visible por la clase C


debido que ambas clases pertenecen al mismo paquete.
package paqueteA;
import paqueteB.B;
public class A extends B {
public void metodoA() {
metodoB();
}
}
package paqueteB;
public class B {
protected void metodoB() {
}
}
El mtodo protegido metodoB() de la clase B es visible por la clase A
debido que esta ltima clase es una subclase de la clase B (sin importar en
qu paquete se encuentre la clase A). Hay que tener en cuenta que la
accesibilidad del mtodo metodoB() en la clase A se realiza por medio de
la herencia. Si quisiramos acceder al mtodo metodoB() en la clase A
utilizando una variable de referencia no podramos hacerlo.

Por defecto
Cuando un miembro tiene el modificador de acceso por defecto, dicho
miembro es visible por todas las clases que se encuentran en el mismo
paquete. Para indicar que un miembro tiene modificador de acceso por
defecto no es necesario utilizar ninguna palabra clave.
package paqueteB;
public class B {
void metodoB() {
}

Programacin Orientada a Objetos De las Heras, Sebastin | 36

}
package paqueteB;
public class C {
public void metodoC() {
B b = new B();
b.metodoB();
}
}
Si quisiramos referenciar a dicho mtodo desde una clase que pertenece a
otro paquete obtendramos un error de compilacin.
package paqueteA;
import paqueteB.B;
public class A {
public void metodoA() {
B b = new B();
b.metodoB(); // Error de compilacin!
}
}
Es importante mencionar tambin que una subclase hereda un miembro
con modificador de acceso por defecto definido en la superclase
solamente si la subclase se encuentra en el mismo paquete que la
superclase.
Los modificadores de acceso protegido y por defecto son muy parecidos
pero se diferencian en que el modificador de acceso por defecto es ms
restrictivo. El modificador de acceso por defecto no tiene en cuenta las
subclases que se encuentran en paquetes distintos al paquete de la
superclase, solamente tiene en cuenta si las clases se encuentran en el
mismo paquete.

Privado
Si el miembro de una clase es privado (private), dicho miembro no es
visible para ninguna otra clase distinta a la clase a la que pertenece el
mtodo.
package paqueteB;
public class B {
public void metodoB1() {

Programacin Orientada a Objetos De las Heras, Sebastin | 37

metodoB2();
}
private void metodoB2() {
}
}
El mtodo metodoB2() de la clase B es privado, en consecuencia ninguna
otra clase distinta a la clase B tiene visibilidad sobre metodoB2().
package paqueteB;
public class C {
public void metodoC() {
B b = new B();
b.metodoB2(); // Error de compilacin!
}
}

Programacin Orientada a Objetos De las Heras, Sebastin | 38

En nuestro ejemplo anterior, quisimos acceder al mtodo metodoB2()


desde otra clase y como resultado obtenemos un error de compilacin.
Con respecto a las subclases, cuando un miembro de una superclase es
declarado como privado, entonces las subclases no heredan dicho
miembro.
La siguiente tabla resume los distintos modificadores de acceso y sus
variantes en cuanto a la visibilidad de los miembros:
Modificador de
acceso

Pblico

Protegido

Por
defecto

Privado

Desde la misma clase

Desde cualquier
clase dentro del
mismo paquete

No

Desde una subclase


dentro del mismo
paquete

No

Desde una subclase


perteneciente a otro
paquete

S por
medio de
la herencia

No

No

Desde cualquier
clase no hija
perteneciente a otro
paquete

No

No

No

Programacin Orientada a Objetos De las Heras, Sebastin | 39

3.7.3- Encapsulamiento
En el mdulo 1 habamos mencionado que una de las caractersticas ms
importantes del Paradigma Orientado a Objetos es el Encapsulamiento.
El objetivo del encapsulamiento es separar los detalles internos de un
objeto de su interfaz.
Los modificadores de acceso nos dan la oportunidad de separar la
implementacin de un objeto de su interfaz.
Cuando definimos una clase, podramos marcar a todos sus atributos como
pblicos pero en la prctica esto es poco recomendable. Siempre se aconseja
marcar los atributos de una clase como privados para que solamente
puedan ser manipulados por sus mtodos.
Cuando se define una clase se debe tener en cuenta:
La parte pblica que ser accesible por otros objetos.
La parte privada que ser nicamente accesible por los mtodos
propios de la clase.
A los miembros que pertenecen a la parte pblica se los debe marcar como
public mientras que los miembros que pertenecen a la parte privada
deben ser marcados como private.
De esta forma, los objetos no tendrn acceso a los miembros privados de
otro objeto, ni siquiera saben que existen estos miembros.

Programacin Orientada a Objetos De las Heras, Sebastin | 40

3.8- Mtodo main


Toda aplicacin programada en Java debe contener un mtodo denominado
main con la siguiente estructura:
public static void main(String[] args)

La declaracin de este mtodo contiene los siguientes modificadores:


-

public: este modificador de acceso indica que el mtodo main()


puede ser invocado por cualquier objeto desde cualquier clase.

static: el mtodo main() es un mtodo esttico o de clase.

void: el mtodo main() no devuelve ningn valor.

Cuando una aplicacin Java es ejecutada, la Mquina Virtual de Java lo


hace invocando al mtodo main() de alguna clase en particular. Puede
haber ms de una clase que defina el mtodo main(). En ese caso
podramos decir que la aplicacin tiene varios puntos de ejecucin. Como
puede haber varias clases que definan al mtodo main(), en el momento
de ejecutar una aplicacin es necesario indicarle al intrprete de java la
clase en la que estamos interesados que contiene al mtodo main() que
deseamos ejecutar. Si intentramos ejecutar una aplicacin desde una clase
que no contiene un mtodo main(), el intrprete de Java nos dar el
siguiente error:
Exception in thread "main" java.lang.NoSuchMethodError: main

La declaracin del mtodo main() acepta como argumento un vector de


objetos de tipo String. De esta forma en el momento de ejecutar una
aplicacin por lnea de comando es posible enviar informacin al mtodo
main() en forma de parmetros. A continuacin vamos a ver un ejemplo
que describa este escenario:
public class MetodoMain {
public static void main(String[] args) {
if (args != null && args.length > 0) {
for (int i=0 ; i < args.length ; i++) {
System.out.println("args[" + i + "]: " + args[i]);
}
}
}
}

El cdigo anterior toma el parmetro args e imprime cada uno de los


valores que estn contenidos en el vector.

Programacin Orientada a Objetos De las Heras, Sebastin | 41

Si ejecutamos la aplicacin por lnea de comando y especificamos algunos


parmetros adicionales obtendremos el siguiente resultado:
C:\POO>"C:\Program Files\Java\jdk1.6.0_23\bin\java.exe"
MetodoMain POO Java
args[0]: POO
args[1]: Java

Programacin Orientada a Objetos De las Heras, Sebastin | 42

3.9- Aplicaciones en Java


Aplicacin: Clculo del rea de una figura
En esta seccin de la lectura disponemos del cdigo de una aplicacin que
tiene por objetivo realizar el clculo del rea de un rectngulo o cuadrado.
Para ello, el usuario deber ingresar las caractersticas de la figura. En el
cdigo provisto se pueden observar muchos de los conceptos analizados en
la lectura. Para un mejor entendimiento se recomienda codificar las clases
en una IDE y ejecutar la aplicacin.

// Clase Figura
package figuras;
public abstract class Figura {
protected String nombre;
protected int alto;
protected int ancho;
/* Atributo esttico que indica la cantidad
* de figuras creadas.
*/
public static int cantidadDeFigurasCreadas;
public int getAlto() {
return alto;
}
public void setAlto(int a) {
alto = a;
}
public int getAncho() {
return ancho;
}
public void setAncho(int a) {
ancho = a;
}
public String getNombre() {
return nombre;
}
public void setNombre(String n) {
nombre = n;
}
/**
* Mtodo abstracto responsable del clculo del
rea de una figura.

Programacin Orientada a Objetos De las Heras, Sebastin | 43

* Cada subclase es responsable de definir su


propia implementacin
* de acuerdo al tipo de figura.
*/
public abstract float calcularArea();
public String toString() {
String s = "Nombre: " + nombre +
"\n" +
"Alto: " + alto +
"\n" +
"Ancho: " + ancho;
return s;
}
}

// Clase Rectangulo
package figuras;
public class Rectangulo extends Figura {
private boolean cuadrado; // variable booleana que
indica si el tringulo es un cuadrado o no.
public Rectangulo() {
Figura.cantidadDeFigurasCreadas++;
}
public Rectangulo(String nom, int alt, int anc,
boolean cuad) {
nombre = nom;
alto = alt;
ancho = anc;
cuadrado = cuad;
Figura.cantidadDeFigurasCreadas++;
}
public boolean isCuadrado() {
return cuadrado;
}
public void setCuadrado(boolean b) {
cuadrado = b;
}
/*
* Implementacin del mtodo abstracto heredado de
la clase Figura
*/
public float calcularArea() {
float area = alto * ancho;
return area;
}

Programacin Orientada a Objetos De las Heras, Sebastin | 44

public String toString() {


String s = "Nombre: " + nombre +
"\n" +
"Alto: " + alto +
"\n" +
"Ancho: " + ancho +
"\n" +
"Es cuadrado?: " + cuadrado;
return s;
}
}

// Clase Triangulo
package figuras;
public class Triangulo extends Figura {
/* Esta variable es utilizada para indicar
* si el tringulo es equiltero,
* issceles o escaleno.
*/
private String tipoTriangulo;
// Constantes estticas utilizadas para indicar el
tipo de tringulo
public static final String
TIPO_TRIANGULO_EQUILATERO = "Equiltero";
public static final String TIPO_TRIANGULO_ISOSCELES
= "Issceles";
public static final String TIPO_TRIANGULO_ESCALENO
= "Escaleno";
public Triangulo() {
Figura.cantidadDeFigurasCreadas++;
}
public Triangulo(String nom, int alt, int anc,
String tipo) {
nombre = nom;
alto = alt;
ancho = anc;
tipoTriangulo = tipo;
Figura.cantidadDeFigurasCreadas++;
}
public String getTipoTriangulo() {
return tipoTriangulo;
}
public void setTipoTriangulo(String tipo) {
tipoTriangulo = tipo;
}

Programacin Orientada a Objetos De las Heras, Sebastin | 45

/*
* Implementacin del mtodo abstracto heredado de
la clase Figura
*/
public float calcularArea() {
float area = (float)(alto * ancho) / 2;
return area;
}
public String toString() {
String s = "Nombre: " + nombre +
"\n" +
"Alto: " + alto +
"\n" +
"Ancho: " + ancho +
"\n" +
"Tipo de tringulo: " +
tipoTriangulo;
return s;
}
}

// Clase CalculoArea que contiene el mtodo main()


package main;
import
import
import
import
import
import

figuras.Figura;
figuras.Rectangulo;
figuras.Triangulo;
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;

public class CalculoArea {


private static final String RECTANGULO =
"Rectngulo";
private static final String TRIANGULO =
"Tringulo";
public static void main(String[] args) throws
IOException {
System.out.println("Mdulo 3 - Clculo de
rea");
char opcionFigura;
do
{
System.out.println("\nSeleccione la figura
con la que desea trabajar");
System.out.println("A. Rectngulo");
System.out.println("B. Tringulo");

Programacin Orientada a Objetos De las Heras, Sebastin | 46

System.out.println("C. Salir");
System.out.println("Seleccione una opcin
(A, B, C): ");
opcionFigura = (char) System.in.read();
System.out.println("\nOpcin seleccionada:
" + opcionFigura);
System.in.read(); // Se elimina del buffer
de entrada el caracter <Enter>
String figuraSeleccionada = null;
switch (opcionFigura)
{
case 'A':
figuraSeleccionada = RECTANGULO;
break;
case 'B':
figuraSeleccionada = TRIANGULO;
break;
case 'C':
System.out.println("Saliendo de la
aplicacin");
break;
default:
System.out.println("Opcin
ingresada incorrecta.");
}
if (figuraSeleccionada != null) {
// Ingreso de datos sobre la figura
System.out.println("Usted decidi
calcular el rea de un: " + figuraSeleccionada);
float areaFigura = 0;
System.out.println("Ingrese los datos
solicitados");
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
System.out.println("Ingrese el nombre
de la figura: ");
String nombreFigura = br.readLine();
System.out.println("Ingrese el alto de
la figura: ");
int alto =
Integer.parseInt(br.readLine());
System.out.println("Ingrese el ancho de
la figura: ");
int ancho =
Integer.parseInt(br.readLine());
if
(figuraSeleccionada.equals(RECTANGULO)) {

Programacin Orientada a Objetos De las Heras, Sebastin | 47

// Datos especficos para un


rectngulo
boolean esCuadrado = false;
if (alto == ancho) {
esCuadrado = true;
}
// Se crea un objeto de tipo
Rectangulo
Rectangulo rectangulo = new
Rectangulo(nombreFigura, alto, ancho, esCuadrado);
areaFigura =
rectangulo.calcularArea();
System.out.println("\nLa figura
tiene las siguientes caractersticas:\n" +
rectangulo.toString());
} else if
(figuraSeleccionada.equals(TRIANGULO)) {
// Datos especficos para un
tringulo
System.out.println("Ingrese con un
nmero el tipo de tringulo (1.Equiltero, 2.Issceles,
3.Escaleno): ");
String opcionIngresadaTipoTriangulo
= br.readLine();
String tipoTriangulo = null;
if
(opcionIngresadaTipoTriangulo.equals("1")) {
tipoTriangulo =
Triangulo.TIPO_TRIANGULO_EQUILATERO;
} else if
(opcionIngresadaTipoTriangulo.equals("2")) {
tipoTriangulo =
Triangulo.TIPO_TRIANGULO_ISOSCELES;
} else if
(opcionIngresadaTipoTriangulo.equals("3")) {
tipoTriangulo =
Triangulo.TIPO_TRIANGULO_ESCALENO;
} else {
System.out.println("Tipo de
tringulo ingresado incorrecto.");
}
// Se crea un objeto de tipo
Triangulo
Triangulo triangulo = new
Triangulo(nombreFigura, alto, ancho, tipoTriangulo);
areaFigura =
triangulo.calcularArea();
System.out.println("\nLa figura
tiene las siguientes caractersticas:\n" +
triangulo.toString());
}

Programacin Orientada a Objetos De las Heras, Sebastin | 48

System.out.println("El rea de la
figura es: " + areaFigura);
System.out.println("La cantidad de
figuras creadas es: " +
Figura.cantidadDeFigurasCreadas);
}
}
while (opcionFigura != 'C');
}
}

Programacin Orientada a Objetos De las Heras, Sebastin | 49

Bibliografa Lectura 4
Sierra Kathy, Bates Bert, (2008), SCJP Sun Certified Programmer for Java 6
Study Guide (Exam 310-065), EE.UU, Editorial McGraw-Hill.
Gosling James, McGilton Henry, (1996), The Java Language Environment,
EE.UU.
Bruce Eckel, (2006), Thinking in Java (4a ed.), EE.UU, Editorial Prentice Hall.

Frittelli Valerio, (2007), Manual Programador Java (2a ed.),


Argentina.
The Java Tutorials (Oracle), (2011), Learning the Java Language,
Recuperado el 14/06/2011 de
http://download.oracle.com/javase/tutorial/java/TOC.html

Programacin Orientada a Objetos De las Heras, Sebastin | 50

Potrebbero piacerti anche