Sei sulla pagina 1di 15

Objetos y

Paquetes

Taller de
Algoritmos y
Estructuras
de Datos I
1
Objetos: constructores, paquetes y
herencia
Recordemos el Paradigma Orientado a Objetos y su aplicación en la
Programación Orientada a Objetos, para luego poder resolver situaciones
reales que implican integrar todos los conceptos en la resolución codificada
en lenguaje Java. Estos temas están tratados en los capítulos 3 y 4 de la
bibliografía básica de la materia.

Como ya saben un Objeto es el corazón de la POO. Un objeto es un tipo de


dato con estructura y estado, es una unidad atómica, principio conocido
como ocultamiento de la información.

El objeto está compuesto por atributos que le dan el estado y los métodos
que representan su comportamiento.

El concepto de objeto con sus componentes son representados en una clase.

Una clase es una agrupación de datos (variables o campos) y de funciones


(métodos) que operan sobre esos datos. A estos datos y funciones
pertenecientes a una clase se les denomina variables y métodos o funciones
miembro. La programación orientada a objetos se basa en la programación
de clases. Un programa se construye a partir de un conjunto de clases.

Una vez definida e implementada una clase, es posible declarar elementos


de esta clase de modo similar a como se declaran las variables del lenguaje
(de los tipos primitivos int, double, String, entre otros). Los elementos
declarados de una clase se denominan objetos de la clase. De una única
clase se pueden declarar o crear numerosos objetos. La clase es lo genérico:
es el patrón o modelo para crear objetos. Cada objeto tiene sus propias
copias de las variables miembro, con sus propios valores, en general
distintos de los demás objetos de la clase.

Las clases pueden tener variables static, que son propias de la clase y no de
cada objeto.

Normalmente, las definiciones de clases incluyen:

 Modificador de acceso: especifica la disponibilidad de la clase a


partir de otras clases.
 Palabra clave de clase: class indica a Java que el bloque de código
siguiente define una clase.
 Campos de instancia: se denomina así a las variables y constantes
utilizadas por los objetos de la clase.
 Constructores: son los métodos que se invocan para instanciar la
clase, tienen el mismo nombre que la clase.
 Métodos de instancia: Definen las funciones que pueden actuar sobre
los datos de una clase.
 Campos de clase: Contienen variables y constantes que pertenecen a
la clase y que todos los objetos de la clase comparten (static).
 Métodos de clase: Son los métodos que se utilizan para controlar los
valores de los campos de la clase.

Veamos un ejemplo:

Modificador de acceso

public class Persona {


//variable de clase
Static int contadorPersonas;
//variable de instancia
private int dni; Inicio y fin de
private String apellido; la clase
……..
//método de instancia
Public int getDni(){
Inicio y fin del
………….
} método
}

Las clases de los niveles inferiores son por lo general las que poseen los
objetos que tendrán los atributos y métodos de su clase más los atributos y
métodos que hereden.

En la programación orientada a objetos, un objeto es una instancia de la


clase, donde todas las instancias tienen la misma estructura, la definida en
la clase a la que pertenece y de las que hereda, pero cada instancia tiene sus
propios valores en los campos de instancia.

¿Cómo se crean los objetos? Se crean con la instrucción new, pero necesita
un par de instrucciones, por ejemplo, si tenemos la clase Persona, el objeto
se crea:

Persona unoNuevo; //declara la referencia al objeto

unoNuevo = new Persona( ); //crea el espacio en memoria y


devuelve una instancia de la clase Persona.

La primera línea crea una referencia a un objeto que se llama unoNuevo de


la clase Persona. La segunda línea crea el objeto.
También se puede definir en una sola línea, quedando:
Persona unoNuevo = new Persona( );

El operador new convoca al método constructor de la clase (veremos en


detalles más adelante), quien construye un espacio en memoria para alojar
la estructura del objeto, o sea que la llamada al operador new devuelve una
referencia al objeto nuevo.

Recordemos los conceptos fundamentales de los Atributos

Los atributos son los datos específicos de una clase. Los que se definan en
las clases serán comunes a todos los objetos creados en ella, pero
independientes de sus valores.

Ya vimos dónde se definen y cómo, para asignarle un valor debemos


convocarlo con el objeto, en nuestro ejemplo sería:

unoNuevo.nom = “José”;

Si el atributo es declarado con el modificador private, (aplicando el


concepto de encapsulamiento) la asignación directa podrá realizarla dentro
de la misma clase. Fuera de la clase deberá utilizar el método de instancia
público setxx(). En nuestro caso sería:

unoNuevo.setNom(“José”);

Si el atributo es declarado público, la asignación la podrá realizar desde un


método ubicado en otra clase y en otro paquete dentro del mismo proyecto.

Los tipos de valores que se definen para un atributo pueden ser:

 Primitivos: los tipos de datos que viene con el lenguaje Java, como
int

 Objetos: los definidos por el lenguaje como es String o Integer, o


bien definido por el usuario, por ejemplo: dentro de la clase Auto, el
atributo volante puede ser tipo Volante, el cual es un objeto con
estado y comportamiento por lo que tiene una Clase Volante para
instanciarla.

Las variables de objeto almacenan la referencia a un objeto, por lo que


hacen referencia a todos sus atributos y métodos definidos en su clase.

Inicialmente la referencia de una variable objeto es null, hasta tanto se le


asigne la referencia del objeto creado.

En nuestro ejemplo, en una clase Test con un método main() podría tener el
siguiente código:
Persona unoNuevo; //referencia null

unoNuevo = new Persona( ); //referencia al espacio en memoria


unoNuevo.setNom(“José”); //asigna un valor

System.out.print(“Nombre: “ + unoNuevo.getNom()) //muestra el valor

unoNuevo = null //pierde la referencia anterior

System.out.print(“Nombre: “ + unoNuevo.getNom()) //error en tiempo de ejecución


porque no tiene ninguna referencia de memoria.

Si creamos otra instancia de Persona, se pueden asignar las referencias mutuamente, por
ejemplo:

Persona otroNuevo; //referencia null

otroNuevo = new Persona( ); //referencia al espacio en memoria


otroNuevo.setNom(“Ana”); //asigna un valor

System.out.print(“Nombre: “ + otroNuevo.getNom()) //muestra el valor Ana

unoNuevo = otroNuevo //pierde la referencia anterior

System.out.print(“Nombre: “ + unoNuevo.getNom()) //muestra Ana

Concepto de Package

Java como lenguaje está organizado en paquetes.

Un package es una agrupación de clases. Existen una serie de packages


incluidos en el lenguaje (ver jerarquía de clases que aparece en el API -
Application Programming Interface- de Java).

Además el usuario puede crear sus propios packages. Lo habitual es juntar


en packages las clases que estén relacionadas. Todas las clases que formen
parte de un package deben estar en el mismo directorio.

Veamos los paquetes principales de Java:

Paquete Contenido
java.applet Clases para implementar applets correspondientes a
aplicaciones que corren dentro de los
browsers.
java.awt Clases para gráficas, componentes (GUI –
Graphic User Interface) y administradores de
control de ventanas, además de clases más
especializadas como para procesamiento de
imágenes (AWT – Advanced Window Toolkit).
java.beans Clases e interfaces para construir
JavaBeans correspondientes a GUIs
independientes de plataformas.

java.io Clases para control de entradas y salidas, tales


como archivos y streams.
java.lang Clases que componen el núcleo del lenguaje.
java.math Clases para aritmética avanzada, incluyendo
manejo de precisión numérica arbitraria.
java.net Clases relacionadas con el manejo de redes, tales
como datagramas y sockets.
java.rmi Clases para el manejo de métodos remotos.
java.security Clases para aspectos de seguridad, tales como
criptografía.
java.sql Clases para acceso a base de datos con el lenguaje
SQL.
java.text Clases para internacionalización del idioma,
independiente del lenguaje particular.
java.util Clases adicionales, tales como estructuras de
datos avanzadas y compresión de datos.

La jerarquía de clases de Java (API)

Durante la generación de código en Java, es recomendable y casi


necesario tener siempre a la vista la documentación on-line del API de Java
de la versión que está utilizando. En dicha documentación es posible ver
tanto la jerarquía de clases, es decir la relación de herencia entre clases,
como la información de los distintos packages que componen las librerías
base de Java.

Es importante distinguir entre lo que significa herencia y package. Un


package es una agrupación arbitraria de clases, una forma de organizar las
clases. La herencia sin embargo consiste en crear nuevas clases en base a
otras ya existentes. Las clases incluidas en un package no derivan por lo
general de una única clase.

En la actualidad se cuenta con el API JavaTM 2 Platform


Standard Ed. de Java, mejor conocido como Java2, el cual incluye además
del paquete “java”, el paquete “javax” donde se encuentran componentes
más avanzados, como se muestra en la siguiente Tabla.

Paquete Contenido
javax.accessibility Clases que definen contratos entre componentes
de interfaces de usuario y
una tecnología asistente que provee acceso a
esos componentes.
javax.activation Clases que definen activación de los
componentes de JavaBeans.
javax.ejb Clases para el manejo de EJB(Enterprise
JavaBeans).
javax.jms Clases para el manejo de JMS(Java Message
Server).
javax.mail Clases para el manejo de correo.
javax.naming Clases para el acceso de los servicios de
nombres.
javax.rmi Clases para la invocación de métodos remotos
incluyendo CORBA.
javax.servlet Clases para el manejo de servletsy JSP(Java
Server Pages).
javax.sql Clases para el acceso a base de datos con SQL.
javax.swing Clases que proveen un conjunto de componentes
para GUIs que trabajan en
cualquier plataforma.
javax.transaction Clases para el manejo de transacciones entre
componentes.

¿Cómo organizamos nuestro proyecto en package?

Supongamos que necesitamos realizar una encuesta a 10 Personas, en


principio necesitamos una clase Persona y otra que tenga el main().

Como hay que ingresar datos será necesario validarlos. Estos métodos no es
conveniente que se ubiquen dentro del main() ni en la clase Persona, ya que
no son comportamiento de ella, por lo que necesitamos una o dos clases
para leer y validar. Estas clases se ubican en un Package independiente para
que sean librerías a ser utilizadas en otros proyectos.

Necesitamos un Menú que presente los datos a ingresar y los resultados de


la encuesta, esto es parte de la Vista, o sea de la interfaz con el usuario.
Nos quedaría:

La ventaja que tendrá este proyecto, aparte de la organización y el reuso, es


la posibilidad de encontrar errores más rápido y crecer en clases de cada
paquete.

Herencia

Como hemos visto anteriormente, la herencia permite que se pueden definir


nuevas clases basadas en clases existentes, lo cual facilita re-utilizar código
previamente desarrollado. Si una clase deriva de otra (extends) hereda
todas sus variables y métodos. La clase derivada puede añadir nuevas
variables y métodos y/o redefinir las variables y métodos heredados.

En Java, a diferencia de otros lenguajes orientados a objetos, una clase sólo


puede derivar de una única clase, con lo cual no es posible realizar herencia
múltiple en base a clases. Sin embargo es posible “simular” la herencia
múltiple en base a las interfaces.

¿Qué se hereda? Se heredan atributos y métodos de la superclase, de una


sola ya que tiene herencia simple. Para que esto se dé, usted debe crear una
nueva clase que sea una extensión de la superclase.
En nuestro ejemplo, las clases Persona y Empleado son abstractas, mientras
que las clases Administrativo, Vendedor y Cliente son hojas o concretas, las
que se instancian y cada objeto hereda los atributos y métodos de las
superclases que tiene en su jerarquía.

La definición de cada clase es:

public abstract class Persona {


……………………..
}

public abstract class Empleado extends Persona {


……………………
}

public class Cliente extends Persona {


……………….
}

public class Administrativo extends Persona {


………………
}

public class Vendedor extends Persona {


………………..
}
Métodos constructores

Conocemos el new para la creación de un objeto, el cual involucra la


invocación de un método constructor de la clase de la cual el objeto es
representante.

Pero, aún no hemos definido métodos constructores, sin embargo, podemos


definir constructores del mismo modo que cualquier otro tipo de métodos,
con las siguientes salvedades:

Debe omitirse la inicialización sobre el tipo de dato devuelto,


pues implícitamente se sabe que el resultado es un objeto
representante de la clase.

Por ejemplo: la clase java.lang.Double, tiene estos dos constructores.

public Double (double valor);

public Double (String s) throws NumberFormaException;

La utilización real sería:

Double unDoble = new Double (3.5);

Double unDoble = new Double (“3.534”);

Toda clase tiene un método constructor por defecto, no explícito, que se


convoca con el operador new, sus variables de instancia se inicializan con
sus valores por defectos.

No obstante, normalmente se necesita más de un constructor en una clase,


por lo que hay que hacer explícitos todos. Estos constructores tendrán
características en común y se diferenciarán en los atributos que reciba.

Por ejemplo:

Persona unoNuevo = new Persona() //invoca al constructor por defecto

Persona otroNuevo = new Persona(“José”) //invoca al constructor que


recibe un parámetro.

El constructor en la clase persona tiene el siguiente código:

public class Persona {


………………….
public Persona() { //constructor por defecto
}

public Persona(String nom) {//constructor con paso de parámetro


Nombre = nom;
}
}
El constructor this

Si aparece en un código la siguiente línea:

this.nombre = nombre;

Es posible pensar que this es un objeto, en realidad lo es, pero uno muy
especial: es una referencia al objeto que se acaba de crear con new y cuyo
constructor se está ejecutando.

“Este objeto” está disponible en cualquier método de cualquier clase (salvo


en los métodos estáticos, ya que no están asociados a ningún objeto
concreto, sino a la clase en su conjunto).

Por ejemplo:

//”Constructores

public EntradaAgenda ( String nombre) {

this.nombre = nombre;

public EntradaAgenda ( String nombre, String apellido) {

this.nombre = nombre;

this.apellido = apellido;

o bien,

public EntradaAgenda ( String nombre) {

this.nombre = nombre;

public EntradaAgenda ( String nombre, String apellido) {

this(nombre);

this.apellido = apellido;

}
Como vemos aparece en el segundo ejemplo this( ) como método, esto
permite invocar el primer constructor desde el segundo, asegurándonos la
sincronización entre los dos. El uso del this ( ) se permite cuando es la
primera instrucción de un constructor.

El constructor super ( )

El segundo constructor es Sobrecargado, esto sucede porque tiene


distinta firma pero la misma funcionalidad. En una clase puede haber
varios constructores.

Sirve para acceder desde un constructor al constructor de la superclase. Al


igual que this ( ), super ( ) debe ser la primera invocación que aparezca
en el constructor.

En nuestro ejemplo de Persona y Cliente, sus constructores se pueden


plantear de la siguiente forma:

public class Persona {

………………….

public Persona() { //constructor por defecto

public Persona(String nom) {//constructor con paso de parámetro

Nombre = nom;

public class Cliente extend Persona {

int idCli;

public Cliente (){

public Cliente (String nom, int id){

super (nom); //invoca al constructor con paso de un


parámetro
superString
(); de la//invoca
super clase
al constructor por defecto de la
superclase
this.idCli = id; //asigna a la instancia de clase el parámetro
}recibido utilizando la referencia this

}
Concepto de Interface

Java como lenguaje presenta en cada paquete, las Classes, Interfaces y


Exceptions, por lo que es muy importante acostumbrarse a utilizarlas.

Una interface debe ser considerado como un contrato entre un proveedor


de servicios y sus clientes.

En Java, la Interfaz es un tipo.

Es una clase abstracta que no puede ser instanciada que debe ser
implementada en otra clase.

Es un conjunto de declaraciones de métodos.

Si una clase implementa (implements) una interface, debe definir todos los
métodos especificadas por la interface, si alguno de los métodos no tiene
código aun se colocan las llaves de apertura y cierre definiéndolo vacío.

Una clase puede implementar más de una interface, representando una


forma alternativa de la herencia múltiple.

A su vez, una interface puede derivar de otra o incluso de varias interfaces,


en cuyo caso incorpora todos los métodos de las interfaces de las que
deriva.
Definición de la interfaz en forma general:

modificador interfaz nombreI {

modificador tipoDevuelve nombreDelMetodo(parametros);

Veamos un ejemplo con la clase Persona y la interfaz IActividad:

public interfaz IActividad{ //definición de la interfaz

public void caminar(); //definición del método abstracto

public String comenta(); //definición del método abstracto

public int calcula(int a, int b); //definición del método abstracto

}
public class Persona implement IActividad {

…….. //definiciones de atributos y métodos

public void caminar() { //definición del método concreto


…………………
}

public String comenta() { //definición del método abstracto


…………………
}

public int calcula(int a, int b) { //definición del método abstracto


………………….
}
}

Gráficamente:

La implementación de la interfaz por parte de la clase Persona se puede


establecer con una línea de puntos sin flecha, depende del modelador que
esté utilizando.

La Interfaz define los métodos abstractos, o sea da su firma pero no su


código. La clase que la implementa define el método con la misma
firma estableciendo cómo lo aplica.
Referencia Bibliográfica
Mark Allen Weiss, “Estructuras de Datos en Java”, ed. Addison Wesley.

Deitel y Deitel, “Java cómo programar ”, séptima edición, ed. Pearson, 2008.

Pressman Roger, (2006), “Ingeniería de Software. Un enfoque práctico” 6ta.


edición, Ed. McGraw Hill

ORACLE, Oracle 10g: Programación Java, Guía del Alumno, 2003

Potrebbero piacerti anche