Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Inicio a la
Programacin
Orientada a Objetos
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.
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:
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.
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.
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).
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
Objeto A
metodoB()
Resultado
Objeto B
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;
}
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;
}
}
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.
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.
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 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.
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():
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
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()
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.
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.
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.
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);
}
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.
float, double
0.0
boolean
false
char
'\u0000'
objeto
null
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
package programacion;
public class EjecucionMetodoEstatico {
public static void main(String[] args) {
System.out.println(Math.sqrt(9));
}
}
Interfaz
Lgica
Entidad
Vista de archivos:
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() {
}
}
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 {
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() {
}
}
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() {
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!
}
}
Pblico
Protegido
Por
defecto
Privado
Desde cualquier
clase dentro del
mismo paquete
No
No
S por
medio de
la herencia
No
No
Desde cualquier
clase no hija
perteneciente a otro
paquete
No
No
No
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.
// 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.
// 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;
}
// 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;
}
/*
* 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;
}
}
figuras.Figura;
figuras.Rectangulo;
figuras.Triangulo;
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;
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)) {
System.out.println("El rea de la
figura es: " + areaFigura);
System.out.println("La cantidad de
figuras creadas es: " +
Figura.cantidadDeFigurasCreadas);
}
}
while (opcionFigura != 'C');
}
}
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.