WAC DW
pase! Aa
Programacion en
Clases - Construcci6n de objetos
Encapsulamiento - HerenciaCURSO DE
avec vA V@ [0]
SAN
Programacion en
Aprende a programar aplicaciones
robustas y confiables. Escribe tus
codigos una vez y ejecutalos en
cualquier dispositivo.
DinaProgramacion en
Java @
Clases - Construccién de objetos
Encapsulamiento - Herencia
Gaze
Titulo: Programacién en Java Il / Autor: Carlos Arroyo Diaz
Coordinador editorial: Miguel Lederkremer / Edicién: Claudio Peiia
‘Maquetado: Marina Mozzetti / Coleccién: USERS ebooks - LPCU289
Copyright © MMXIX. Es una publicacién de Six
Ediciones. Hecho el depésito que marca la ley
11723. Todos los derechos reservados. Esta
publicacién no puede ser reproducida ni en todo
niien parte, por ningtin medio actual o futuro, sin
el permiso previo y por escrito de Six Ediciones.
Su infraccién esta penada por las leyes 11723
y 25446. La editorial no asume responsabilidad
alguna por cualquier consecuencia derivada de
la fabricacién, funcionamiento y/o utiizacién
de los servicios y productos que se describen
y/o analizan. Todas las marcas mencionadas
en este libro son propiedad exclusiva de sus
respectivos duefos. Libro de edicién argentina.
[Link] 1PROLOGO
Java es un lenguaje maduro y robusto que, desde su nacimiento en
el alo 1995, ha demostrado que vino para quedarse y ha logrado
evolucionar hasta convertirse en el lenguaje mas utilizado en el
mundo tecnolégico.
Durante nuestro aprendizaje de cualquier lenguaje de programacion
podemos encontrarnos con variados libros, pero solo a través de la
experimentaci6n y escudrifiando las entrafias de la Web (foros, blogs,
under sites), podremos obtener los conocimientos necesarios para
enfrentar el aprendizaje de mejor forma.
Mientras recorremos este camino, contar con un curso como este
es fundamental pues se presenta como un compendio de todo
lo que necesitamos para enfrentar un lenguaje de programacién,
permitiéndonos lograr, a través de ejemplos concretos, un mejor
aprendizaje de los distintos temas necesarios para programar en Java.
Desde el primer momento somos optimistas en que este curso sera
para ustedes un desafio muy significativo y, por otro lado, lograra
convertirse en una excelente guia del lenguaje Java.
Carlos Arroyo Diaz
Acerca del autor
Carlos Arroyo Diaz es programador de profesién, escritor especializado en
tecnologias y docente por vocacién. Se desempefia desde hace mas de 20
afios como docente en Informatica General y en los titimos 10 afios ensefia
programacién en Java y Desarrollo Web. También se ha desempefiado como
mentor docente en el area de Programacién en varios proyectos del Ministerio
de Educacién de la Ciudad Auténoma de Buenos Aires, ensefiando a programar
a grupos de jévenes.
2 [Link]ACERCA DE ESTE CURSO
Java es un lenguaje de programacion que sigue afianzandose como un
estandar de la web y, por eso, afio tras afto, aparece en el tope de las
buisquedas laborales de programadores.
Es por esto que hemos creado este curso de Programacién en Java,
donde encontraran todo lo necesario para iniciarse o profundizar sus
conocimientos en este lenguaje de programacion.
El curso esta organizado en cuatro voltimenes, orientados tanto a quien
recién se inicia en este lenguaje, como a quien ya esta involucrado y
enamorado de Java.
En el primer volumen se realiza una revi
de este lenguaje, también se entregan las indicaciones para instalar
el entorno de desarrollo y, posteriormente, se analizan los elementos
basicos de la sintaxis y el uso basico de las estructuras de control.
En el segundo volumen se presentan las clases en Java, se realiza una
introduccién a los conceptos asociados a la Programacién Orientada a
Objetos y también se profundiza en el uso de la herencia, colaboracién
entre clases y polimorfismo.
El tercer volumen contiene informacién sobre el uso de las clases
abstractas ¢ interfaces, el manejo de excepciones y la recursividad.
Finalmente, en el cuarto volumen se ensefia el uso de las estructuras
de datos dinamicas, el acceso a bases de datos y la programacion Java
para Android.
Sabemos que aprender todo lo necesario para programar en Java en tan
solo cuatro voliimenes es un tremendo desafio, pero conforme vamos
avanzando, el camino se va allanando y las ideas se tornan mas claras.
iSuerte en el aprendizaje!
[Link]SUMARIO DEL VOLUMEN II
01 INTRODUCCION A LAS CLASES / 6
Creacién de las campos
Arriputos / 12
Mopiricapores be Acceso / 13
Modificador de atributos
QUE SON Los oBsETOS? / 16
Creacign de objetos
Constructores / 17
Declaracion de métodos
Uso ve THIS / 25
Declaracin de métodos
Gareace coutector y Et métopo Finauize() / 27
Paaueres / 29
Creacién de paquetes
02 InTRODUCCION A LA POO / 34
[Link] y opsetos / 35
Objetos / Creacién de una clase
Mobutaribad Y ENCAPSULAMIENTO / 41
Encapsulamiento / Getter y setter / Pasar parametros
CONSTRUCCION DE OBJETOS / 54
Ciase SWING / 57
03 CoLasoraciOn DE CLASES / 62
Constructor be oBseTos / 66
Gregorian calendar
Uso be constantes / 73.
Uso be Static / 76
Meropos Static / 81
Métodos estaticos de la API / El métado main
SOBRECARGA DE CONsTRUCTORES / 84
Herencia / 87
Regla de diseno
EL poumorrismo / 94
4 [Link]J
CV | ay
Clases y objetos
Llegamos a un punto clave en nuestro aprendizaje de Java. Y,
antes de comenzar a trabajar en la programaci6n orientada
a objetos, realizaremos una incursi6n en las clases y los
objetos, pues se trata de elementos importantes en muchos
lenguajes de programacion modernos. En este capitulo,
trabajaremos con clases y objetos de una manera individual,
sin hacer uso de la colaboraci6n entre las clases.
& 1
=
SS So
ae. hey, EZ
WE
age” A
|r V71, CLASES Y OBJETOS ees
INTRODUCCION A LAS CLASES
Una clase puede definirse como una especie de plantilla 0 molde.
Aunque en el sentido estricto es una definicion adecuada, intentaremos
profundizar un poco mas, para ello diremos que se trata de una
abstraccién de lo real (objetos), una forma de generalizar una idea
para que podamos utilizarla en un programa.
En Java todo es clase y, también es objeto, gentonces?
Para ejemplificar esta idea, pensemos en un libro (abstraccién),
algunos pensaremos en un clasico; otros, en un libro de ficcién, y
otros, en un best-seller. Sin embargo, si solicitamos pensar en un libro
de Borges, la situacién cambia y vamos mas alla; si pedimos pensar
en El Aleph, ya tenemos algo concreto; de esta sencilla forma hemos
creado un objeto de algo que se inicié como una idea.
En Java todo es una clase y, al mismo tiempo, todo es un objeto. Por
esta razon, cuando creamos un programa, Java nos invita a crear una
clase publica que llevar el mismo nombre del archivo. La sintaxis de
una clase es la siguiente:
public class Ejemplo {
instrucciones..
Debemos utilizar el modificador para indicar que es publica, la
palabra clave class y, luego, el nombre de la clase.
Las clases se heredan de una clase jerarquicamente superior llamada
Object; sin embargo, cuando sea necesario heredar de otra clase,
debemos utilizar la palabra clave extends. De esta forma, la sintaxi
para una clase heredada sera la siguiente:
public class ClaseHija extends ClasePadre{
Anstrucciones..
Como vemos, una clase es una plantilla que define atributos
(variables) y métodos (funciones). La clase se encarga de definir los
6 [Link]atributos y los métodos que son comunes a los objetos de ese tipo;
pero luego, cada objeto adoptara sus propios valores, aunque todos
compartiran las mismas funciones.
Al crear un objeto de una clase, podemos inferir que se crea una
instancia de la clase 0 un objeto propiamente dicho.
ce
Teter)
a Figura 1. En este
diagrama apreciamos
Se ET tos MEE Te la representacién de
una clase, una clase
ren Interfaz hijay una interfaz.
‘Veamos la sintaxis de la creacién de una clase y los elementos que
pertenecen a ella:
class [nombre de 1a clase] (
[atributos o variables de 1a clase]
[métodos o funciones de 1a clase]
[main]
Para entender de mejor forma la creacién e implementacién de una
clase, aplicaremos estos conceptos en la solucién de un problema.
Debemos crear una clase que permita realizar el ingreso de los datos,
el codigo de un empleado y las horas trabajadas. Una vez ingresada
esta informacién, deberan mostrarse los datos ingresados y, si el
empleado trabajé mas de 8 horas, mencionar que realizé horas extras.
El cédigo que necesitamos es el siguiente:
[Link] 71. CLASES Y OBJETOS, ast
import [Link]. Scanner;
public class Empleado {
private Scanner teclado;
private String nombre;
private String apellido;
private String codigo;
private int hstrab;
public void inicializar() (
teclado=new Scanner (System. in) ;
[Link] print ("Ingrese el nombre del empleado:
nombr
[Link] ();
System. out .print ("Ingrese el apellido del
ie
apellido=teclado. next (;
System. out .print ("Ingres
codigo=[Link] ();
[Link] .print ("Ingrese la cantidad de horas
empleado:
el cédigo: “);
[Link] Int ();
public void imprimir() {
System. out .print1n("Nombre: “+ nombre) ;
System. out .print1n("Apellido: “+ apellido);
System. out .print1n("Cédigo: “+ codigo) ;
[Link] .print1n("Horas trabajadas: “+ hsTrab);
y
public void horasExtras() {
if (hstrab>s) (
[Link] print (nombre+” “tapellidot * trabajé
horas extras.” );
} else {
system. out _print (nombre+” “tapellidot * trabajé
horas normales.” );
8 [Link]JAVA Vol. It
public static void main(String[] ar) (
Empleado empleadol;
empleadol=new Empleado();
[Link]();
empleadol. imprimir ();
empleadol .horasExtras();
Analizaremos ahora el codigo bloque a bloque, para verificar la
participacién de cada uno de los miembros de una clase.
En primer lugar, encontramos la clase que, en este ejemplo, se
denomina Empleado:
public class
)
Empleado {
Dentro de la misma clase definimos los atributos adecuados:
private
private
private
private
private
Scanner teclado;
String nombre;
String apellido
String codigo;
int heTrab;
Crear una clase e instanciar un objeto
‘Ambas acciones van de la mano puesto que una depende de la otra. Instanciar es
crear algo especifico de algo general, otorgéndole caracteristicas propias.
La clase es genérica, el objeto es espectfico.
[Link]1, CLASES Y OBJETOS ees
Hemos definido todos los atributos con la clausula del nombre clave
private, por lo tanto, no nos permitira el acceso desde otras clases 0
desde el main.
Para continuar, declaramos los métodos; la sintaxis es similar al
main, aunque sin la palabra clave static:
public void inicializar() {
teclado=new Scanner (System. in) ;
[Link] .print (“Ingrese el nonbre del empleado: *);
nombre=[Link] () ;
System. out .print ("Ingrese el apellido del empleado:
CY:
apellido=[Link] ();
systes
codigo=[Link] ();
-out print (“Ingrese el cédigo:
[Link] .print (“Ingrese la cantidad de horas
trabajadas: “);
heTrab=[Link] Int () ;
En el método izar(), que luego llamaremos desde el mi
creamos el objeto de la clase Scanner y cargamos por teclado los
atributos nombre, apellido, cédigo y hsTrab; el método i
acceder a los atributos de la clase Empleado.
Ahora pasemos al segundo método, que se encargara de imprimir
el contenido de los atributos nombre, apellido y hsTrab, que fueron
cargados previamente:
alizar() puede
public void imprimir() {
System. out .print1n("Nombre: "+ nombre) ;
System. out .printin(*Apellido: “+ apellido) ;
System. out .print1n("Cédigo: “+ codigo) ;
‘System. out .printin("Horas trabajadas: “+ hsTrab);
?
El tercer método tiene como objetivo mostrar en un mensaje si el
empleado trabajé 0 no horas extras:
10 [Link]os JAVA Vol. I
public void horasExtras() {
if (hstrab>s) {
System. out .print (nombre+” “tapellidot * trabajé horas
extras.” );
} else {
[Link] print (nombre+” “+apellidot * trabajé horas
Por tiltimo, en el método main declaramos un objeto de la clase Empleado
y, luego, llamamos a los métodos creados antes en un orden adecuado:
public static void main(String{] az) {
Empleado empleadol; //Declaracién del objeto
empleadol=new Empleado(); //Creacién del objeto
[Link]();//Llamada a un método
empleadot. imprimir ();
empleado1 .horasExtras();
a
SESE see TB DBO
ra ee To
“(Sal BE-EASSST Fes Been eS
Figura 2. En el cédigo mostrado en el IDE, observamos el listado de los miembros
agrupados y en orden alfabético, no en orden de aparicién,
[Link] n1, CLASES Y OBJETOS ees
Creacion de los campos
Para ver el contenido de nuestra clase, debemos crear los diferentes
campos de la clase; para lograrlo, nos basta con declarar variables en
el interior del bloque de cédigo de la clase e indicar la visibilidad de
la variable, asi como su tipo y su nombre. La sintaxis adecuada para la
creacién de los campos es la siguiente:
[private | protected | public] tipovariable
nombreVariable;
Para indicar la visibilidad de las variables podemos utilizar private,
protected y public, o no especificar informacién.
ATRIBUTOS
Los métodos y los atributos que habitualmente utilizamos en una
clase estan asociados a las instancias de las clases o los objetos. Para
simplificar esto podemos entender una instancia de clase como la
concretizacion de una clase; de esta forma, los atributos vienen a ser
las caracteristicas de aquellos objetos instanciados.
Los atributos de una clase se definen segtin la siguiente sintaxis:
[modificadorVisibilidad] [modificadorAtributo] tipo
nombreVariable [=valorinicial];
La clase Object
Se trata de la clase ralz de todo el Arbol jerérquico de clases de Java. Esta clase
nos provee de una gran cantidad de métodos que sern utiizados por los objetos.
En la documentacién de la API de Java, encontraremos la lista completa de estos
objetos; para acceder a ella hacemos uso de la siguiente direccion web:
[Link]
2 [Link]Es JAVA Vol. It
En este cédigo encontramos los siguientes elementos
Deir Se trata del nombre de la variable.
Eee oa CS CG) Indica desde qué parte del cddigo se puede acceder
ala variable, a esto lo llamaremos modificador
de acceso a la variable.
aoe
GUT Lery Se trata de las caracteristicas especificas del atributo.
MODIFICADORES DE ACCESO
Los modificadores de acceso figuran en el encapsulamiento (tema que
examinaremos en la introducci6n a Ja POO); sirven para controlar el
acceso a los miembros de una clase ademas de vincular datos con el
c6digo que lo va a manipular, detalle muy importante en la seguridad
de nuestros datos sensibles.
Por ahora presentaremos los tres modificadores: public, private y
protected,
public
Indica que se trata de un atributo accesible a través de una instancia del objeto,
veamos un ejemplo:
public class Ejemplo(
public String cadena = “Esto
public int numero = 10;
un String”;
public void saludo() {
System. out .printin("Este es un saludo de método”);
y
[Link] B1. CLASES Y OBJETOS,
private
Indica que el atributo no es accesible. Al ser heredado, el atributo se convierte en
inaccesible:
public class Ejemplo{
private String cadena = “Esto es un String”;
private int numero = 10;
private void saludo(){
System. out .printin (“Este
d
udo de método”) ;
protected
Indica que el atributo no es accesible, pero, al heredar, si se puede usar desde la
clase derivada. Veamos un cédigo de ejemplo:
public class Ejemplo{
protected String cadena = "Esto
protected int numero = 10;
un String”;
protected void saludo(){
[Link] .printin ("Este es un saludo de método”);
)
Sin especificar
También se conoce como friendly, sirve para indicar visibilidad de
paquete, es decir, se puede acceder a través de una instancia, pero solo
desde clases que se encuentren en el mismo paquete:
public class Ejemplo{
String cadena = “Esto es un String”;
int numero = 10;
14
[Link]as JAVA Vol. It
void saludo () {
System. out .print1n("Este es un saludo de método”) ;
y
Modificador de atributos
Dependiendo de la pertenencia de algunos atributos, estos tendran
caracteristicas propias en el objeto, en la vida del atributo o en la forma
de acceso. Por esta raz6n, debemos tener en cuenta los siguientes
modificadores:
static
Indica que el atributo pertenece a la clase, no a los objetos creados a partir de ella:
private String nombre;
private int edad;
static int contadorPersonas;
final
Indica que el atributo es una constante, en este caso debe presentar un valor inicial
en forma obligatoria:
private static final float PI = 3.1416£;
transient
El atributo figuraré como transitorio, por lo tanto, no podra ser serializado:
private transient String password;
volatile
La forma de acceder a este atributo es mediante hilos 0 threads de forma
asincrona:
volatile int valor = 10;
[Link] 151, CLASES Y OBJETOS aes
2 QUE SON LOS OBJETOS?
Un elemento fundamental a la hora de programar en Java son los
objetos. Aunque en el capitulo 6 de esta obra realizaremos un
analisis exhaustivo de estos elementos y profundizaremos en la forma
en que trabajan dentro de las clases, en esta ocasién presentaremos los
fundamentos de los objetos dentro de un programa.
Partamos de la siguiente premisa que ya hemos mencionado:
en Java todo es clase y todo es objeto. Teniendo esto en cuenta,
podemos pensar en que, en el mundo real, los objetos se crean a
partir de otros objetos (por ejemplo, un lapiz antes fue madera
y, antes, fue un arbol). Cada objeto tiene sus propios estados
0 atributos, y comportamientos 0 métodos. Por ejemplo, una
persona tiene sus propios atributos, como altura, peso, color
de cabello, y también comportamientos: piensa, corre, estudia,
duerme; es decir, se trata de acciones que van a determinar a esa
persona u objeto.
Por esta raz6n, podemos deducir que los objetos se crean a partir de
un modelo o clase, tienen caracteristicas propias (atributos) y realizan
determinadas acciones (métodos); pero también debemos considerar
que un objeto se crea, vive y muere.
Creacion de objetos
Para tener en cuenta lo que es una clase de objetos, pensemos en un
molde para hacer objetos determinados (un juguete, una galletita); ese
molde es nuestra clase y lo usamos para crear el objeto. El molde debe
agrupar las propiedades comunes de todos los objetos, pero no todos
los objetos tienen que ser necesariamente iguales.
Declaraciones import
Si se utiliza el nombre de clase completamente calificado cada vez que se usa el
nombre de una clase en el cédigo fuente, el compilador no requiere declaraciones
import en el archivo fuente de Java. Sin embargo, la mayoria de los programadores
prefiere utilizar declaraciones import.
16 [Link]aes JAVA Vol. I
Un objeto se crea en el momento en que se define una variable de
dicha clase, veamos un ejemplo:
Objeto = new Ejemplo() ;
Con esto hemos creado un objeto de una clase Ejemplo. A la creacion
de un objeto se la llama instancia, por lo tanto, si decimos “instancia
de la clase Ejemplo", nos estamos refiriendo a un objeto creado de la
clase Ejemplo.
CONSTRUCTORES
Un constructor de clase debe poner cada objeto a disposicion
para ser usado, es lo que llamaremos inicializacién. El constructor
inicializa el objeto en un estado razonable.
Algunas caracteristicas de los constructores son las siguientes:
> Debe llevar el mismo nombre de la clase.
> No siempre retorna valor.
> Toda clase tiene al menos un constructor; aun cuando no se haya
definido ninguno, va crear uno de forma predeterminada.
> Podemos crear tantos constructores como deseemos.
Existen tres tipos de constructores: constructor por defecto,
constructor de copia y constructor comim, analicémoslos en detalle
Constructor por defecto
Es un constructor que no fue definido antes; es muy comin
encontrarlos en los programas. Veamos un ejemplo:
public class Empleado {
private String nombre;
private String apellido;
[Link] Ww1, CLASES Y OBJETOS ees
private int codigoEmpleado;
Empleado empleado=new Empleado () ;
En el ejemplo anterior no fue creado un constructor, por lo tanto,
Java crea uno de forma predeterminada.
El operador new indica que va a crear un objeto con ese constructor.
Otra forma de definir un método constructor es la siguiente:
public class Empleado {
private String nombr
private String apellido;
private int codigoEmpleado;
public Empleado() {
Empleado empleado=new Empleado() ;
Constructor de copia
Cuando necesitamos inicializar un objeto con otro objeto de la misma
clase, usamos este tipo de constructores. Analicemos el siguiente
ejemplo:
public class Empleado {
private String nombre;
private String apellido;
Private int codigoEmpleado;
/[Constructor por defecto
public Empleado() {
)
//constructor copia
public Empleado(Empleado empleado) (
18 [Link]aes JAVA Vol. I
this nombre=[Link];
this apellido=[Link];
this .codigoempleado=empleado.. CodigoEmpl
»
En el codigo anterior, podemos notar el cambio de nombres (entre
maytisculas y mintisculas) en los objetos, lo realizamos para evitar
inconvenientes entre nombres que se refieren al mismo objeto.
Entonces, el método de implementacién seria el siguiente:
Empleado empleado=new Empleado ();
Empleado empleadoCopia=new Empleado (empleado) ;
Constructor comin (con argumentos)
Este tipo de constructor recibir los parémetros y, luego, los pasara al
objeto creado. Veamos el ejemplo para conocer como se implementa:
public class Empleado {
private String nombre;
private String apellido;
private int codigoEmpleado;
/[Constructer comin
public Empleado(String nom, String ape, int codigo) {
[Link]=nom;
this. apellido=;
this. codigompleado=codigo;
Empleado empleadoCopia=new Empleado
("ovan", "Pérez", 2334);
Podemos observar que inicializamos los valores del empleado con
los datos que hemos pasado por parametro.
[Link] 191, CLASES Y OBJETOS ees
Declaraci6n de métodos
Cuando se plantea una clase en lugar de especificar todo el algoritmo
en un unico método, se dividen todas las responsabilidades de las
clases en un conjunto de métodos. Un método presenta la siguiente
public void nombre del método() (
instrucciones
ado, es
En la sintaxis ofrecida, se muestra el método predetern
decir, sin parametros.
Métodos con parametros
Cuando un método tiene parametros dentro de los paréntesis, se
instancian las variables u otros argumentos
public void nombre del método(pardmetros) {
Anstrucciones...
A estos parametros, podemos mencionarlos como variables locales
al método, su valor se inicializa con datos que llegan cuando los
Namamos.
Constructor vacio
Un constructor se denomina vacio cuando no lleva parametros. Si no se
define ningiin constructor, el compilador crearé uno por defecto; esto permite
crear objetos con New NombreClase() sin argumentos, aunque no se haya
definido ningun constructor. Muchos frameworks e IDE precisan la definicién
de objetos con constructores vacios. Por esta razén, es comin agregar un
segundo constructor sin saber que el compilador crear un constructor vacio,
y esto acarreara problemas y errores.
20 [Link]aes JAVA Vol. I
Veamos un ejemplo para clarificar el uso de los métodos dentro de
las clases.
int horas(int seg) {
int h = seg/3600;
return h;
int minutos (int seg) {
int m= (seg$3600) /60;
return m;
int segundos (int seg) {
(seg%3600) 860;
return 8;
int s
Como podemos apreciar, dentro de los métodos horas, minutos y
segundos figuran los parametros que seran utilizados con posterioridad
Métodos que retornan un dato
Cuando un método retorna un dato, en vez de indicar la palabra clave
void previo al nombre del método, sefialamos el tipo de dato que
retorna, Luego, dentro del algoritmo, en el momento que queremos que
este finalice y retorne el dato, empleamos la palabra clave return con el
valor respectivo. Esta es la sintaxis adecuada:
public tipo de dato nombre del método(parémetros) {
instrucciones...
return tipo de dato
Veamos un ejemplo para analizar la forma en que se implementan
métodos que retornan datos. Pensemos en un programa que pide
ingresar tres valores por teclado. Luego de esto, debera mostrar el
valor mayor y el menor.
[Link] a.1, CLASES Y OBJETOS ees
Veamos el codigo que puede ayudarnos a calcular el mayor de tres
valores
public int calcularMayor(int numl,int num2,int num3)
int mayor;
A€(numl> num2 && numl> num3) {
mayor= num1;
} else {
4€(num2> num3) {
mayor= num2;
) else {
mayor= num3;
d
return mayor;
Podemos observar que el método retorna un entero y recibe tres
parametros
public int calcularMayor(int numl,int num2,int num3)
Dentro del método verificamos cual de los tres parametros almacena
un valor mayor, guardamos este valor en una variable local llamada
mayor, este valor lo retornamos con un return.
La llamada al método ealeularMayor() la hacemos desde adentro de
otro método, al que lamamos cargarValores():
mayor = calcularMayor (valor1,valor2,valor3) ;
Es necesario asignar a una variable el valor devuelto por el método
calcularMayor(). Luego mostramos el contenido de la variable mayor:
System. out .printin("El valor mayor de los tres
es: * 4mayor);
2 [Link]os JAVA Vol. It
Nea em ect td SEA
Pecueiest etc)
Figura 3. En la imagen pademos ver la forma en que se retorna un resultado ante la llamada
al método.
El tipo de retorno puede ser cualquier tipo de dato, tipo basico
del lenguaje 0 tipo objeto. Si el método no tiene informacion para
devolver, usaremos la palabra clave void en lugar del tipo de retorno.
Creaci6n de métodos
Los métodos son funciones definidas en el interior de una clase,
que sirven para manejar los campos de dicha clase. La sintaxis de
declaracién de un método es la siguiente
modificadores tipoDeRetorno nombreDelMétodo
(listaParémetros)
throws listaExcepeién{
instrucciont
—
B ed Nombre_Método ——_—_—
TOC cL lo)
as
Figura 4. Aqui podemos ver gréficamente la carga de varios parametros y la llamada
a un valor del método.
[Link] 231, CLASES Y OBJETOS ees
Entre los modificadores de métodos con que Java cuenta encontramos’
Pc el método solo puede ser usado en la clase donde fue definido.
feuClac mms el método solo se puede usar en la clase donde fue definido, en las
subclases de esta clase y en las otras clases que pertenecen a un
mismo paquete.
se puede utilizar el método desde cualquier otra clase.
Sino se utiliza ninguna de estas palabras reservadas, entonces la
visibilidad se limitaré al paquete donde esta definida la clase.
Es necesario tener en cuenta que existen otros modificadores que
son utilizados para tareas especificas, por lo que no se encuentran en el
‘mbito del presente libro:
Indica que el método es un metodo de clase.
Elie tag El método es abstracto y no contiene cédigo. La clase donde esta
definido también debe ser abstracta.
El método no puede sobrescribirse en una subclase.
Usado cuando el método se encuentra en un archivo externo escrito
en otro lenguaje.
ules) El método solo puede ser ejecutado por un unico hilo a la vez.
Me
Destructores en Java
En Java no existen los destructores, sino que la manera de limpiar la memoria es a través
de su recolector de basura: garbage collector. Este se encarga de recolectar todas las
variables u objetos que no se estén utiizando, al igual que aquellos para los que no haya
referencias por una clase en ejecucién. El programador puede decidir en qué momento
pasard el recolector de basura. Para lograrlo, hay que escribir [Link]().
24 www. [Link]aes JAVA Vol. I
USO DE THIS
Como sabemos, un constructor es un método especial que se ejecuta
cuando creamos un objeto. A diferencia de un método comin, no lleva
un tipo de retorno, y su nombre es el mismo que el de la clase. Veamos
la sintaxis de la implementacion:
class Empleado{
public Empleado() {
Ainstrucciones..
y
public Empleado(String nombre) (
instrucciones...
d
Un método miembro es un método asociado al objeto, es decir, no
se trata de un método estatico y, cuando se esta ejecutando, lo hace
asociado a un objeto.
Ahora bien, {como podemos hacer una referencia al objeto que
se esté ejecutando? En realidad, no existe una variable que refiera
a dicho objeto, por esta razon entra en accion thi
, que actiia como
una variable que referencia al objeto. En los ejemplos de la clase
Empleado, podemos usar [Link] para acceder al nombre del
objeto asociado.
La palabra clave this funciona de la misma manera dentro de un
constructor como dentro de un método miembro. En el siguiente
ejemplo (propuesto antes), haremos un recorrido a modo de resumen de
todo lo que hemos visto hasta este momento, incluyendo el uso de tk
package empleado;
public class Empleado {
String nombre, apellido;
int codigoEmpleado;
public Empleado(){ //método sin parémetros
[Link] = "No informado”;
[Link] 31. CLASES Y OBJETOS, st
[Link] = “No informado”;
[Link] = 0;
?
public Empleado(String nombre){ //con un parémetro
this();
this nombre = nombre;
public Empleados (String nonbre, String apellido, int
codigoimpleado) { //método con varios pardmetros
[Link] = nombre;
[Link] = apellido;
‘[Link] = codigoEmpleado;
public String toString(){ //método del objeto string
return “Empleado = “+ [Link] +“ “ + apellido + ~
Cédigo: * + codigoEmpleado;
d
public static void main(string{] args) {
Empleado empleadol = new Empleado();
Empleado empleado2 = new Empleado(*Maria”) ;
Empleado empleado3 = new Empleado("Juan”, "Pérez",
2335);
System. out .print1n (empleadol .tostring());
System. out .print1n ([Link]());
System. out .print1n ([Link]());
Cuando ejecutamos este programa, arrojara la siguiente informacié
Empleado = No informado No informado C6
Empleado = Maria No informado Cédigo: 0
Empleado = Juan Pérez Cédigo: 2335,
26 [Link]ea JAVA Vol. I
Al crear el método sin parametros, no arrojara informacién;
cuando colocamos un solo parémetro (en este caso el nombre), solo
arrojara el nombre del empleado que hemos llamado. Finalmente, si
referenciamos a todos los objetos, observaremos que nos mostrar los
datos del empleado en forma completa.
GARBAGE COLLECTOR
Y EL METODO FINALIZE()
Cuando creamos programas en Java, estos se almacenaran en la
memoria principal, por esta raz6n, cuando creamos variables €
instanciamos objetos, se ralentizara el programa ya que existiran
elementos que no se estan utilizando.
En este punto es importante el denominado garbage collector, se
trata de una especie de limpiador que escanea dinamicamente en la
memoria buscando objetos que ya no estén referenciados.
Para familiarizarnos con el uso y las caracteristicas de este
recolector de basura, podemos visitar la pagina oficial de Oracle, en
la siguiente direccion: [Link]
api/java/lang/[Link]#gc().
Para profundizar en este recolector, debemos entender como
funciona la memoria. Esta contiene dos elementos fundamentales:
stack y heap, en el primero se guardan los valores primitivos (int,
float, double, boolean, char, etcétera). En el segundo, se alojan todos
los objetos creados en un programa.
fenemos una clase Empleado, esta crear una instancia de ella, 0
un objeto de clase en el heap, mientras que creara una referencia a
ese objeto en el stack.
Garbage collector apunta a un espacio de memoria. Como cada
espacio de esa memoria esta reservado para alguna aplicacién, rutina,
etcétera, cuando creamos un objeto, estamos creando un puntero,
que sefialara ese espacio de la memoria. Por ejemplo cuando hacemos
la instruccion new Objeto(), se reserva un espacio de la memoria para
alojar el objeto que acabamos de instanciar.
[Link] 271. CLASES Y OBJETOS, cea!
Cer y
10
\
Pes eee scr
Figura 5. Este esquema muestra el funcionamiento de la memoria y el espacio asignado a cada
uno de los objetos y tipos primitivos.
Veamos un ejemplo
Empleado empleadol = new Empleado() ;
Empleado empleado2 = new Empleado();
Hemos reservado dos espacios de memoria para los dos objetos
referenciados: empleadol y empleado2. Si asignamos valores a los objetos
antes creados, veremos lo que sucede:
do ("Juan") ;
A simple vista, estamos asignando los atributos del empleadol al
empleado2, sin embargo, esto no es asi y resulta muy importante reconocer
este tipo de asignaciones, pues lo que realmente hacemos es que
‘empleado2 apunte al empleadol, es decir, a la misma ubicacién de memoria
ala que apunta empleadol. Esta es una de las situaciones que causan varios
dolores de cabeza a los iniciados en este lenguaje, sin embargo, mas
adelante veremos cémo solucionarlo gracias a los getters y setters.
28 [Link]oes JAVA Vol. It
eT ty
CUE
Cramer
MOL)
STACK 10 @ ofa
a
Datos primitivos Cee ERS
Figura 6. En este esquema se muestra cuando dos objetos instanciados referencian al mismo
espacio de memoria,
PAQUETES
Java provee una utilidad que nos permite almacenar codigos
relacionados entre si para poder utilizarlos en un nuevo programa, de
tal manera que no sea necesario copiarlo o rehacerlo, al contrario, solo
se precisa importarlo directamente y acceder a él.
Los denominados paquetes nos ayudan a organizar y administrar
de una mejor manera nuestros proyectos. Otra de las ventajas de la
utilizacién de los paquetes o packages es reducir los conflictos entre
los nombres de las clases que se Ilaman de la misma manera, pero que
se encuentran en paquetes diferentes, y también proteger el acceso a las
clases. Un ejemplo que ya hemos visto es el uso de la clase Scanner, que se
encuentra dentro del paquete [Link]. Para tener acceso a cada uno de sus
métodos y utilizarlos debemos escribir lo siguiente:
import [Link];
[Link] 291, CLASES Y OBJETOS ees
Para referirnos a una clase de un paquete, es necesario anteponer
el nombre de la clase al nombre del paquete, exceptuando aquellas
ocasiones en que el paquete haya sido importando explicitamente.
Veamos un ejemplo:
[Link]
En esta ocasién, el paquete se llama patMatriz y contiene una
clase denominada MatrizCuadrada. Entonces, para importarla en un
proyecto, debemos usar la palabra reservada import, de esta manera
accederemos a su contenido:
import pqtMatriz;
Ahora podemos referirnos a la clase MatrizCuadrada
simplemente escribiendo su nombre sin necesidad de escribir
qué paquete la contiene.
De la misma forma, es posible acceder a todos los paquetes que
Java nos ofrece; si queremos conocer todos los que existen hasta
la tiltima version, debemos visitar el sitio oficial de Oracle, en la
siguiente direccién: [Link]
[Link].
Creacion de paquetes
Para crear un paquete en Java, necesitamos crear una carpeta
(no importa por ahora el lugar), a la que Ilamaremos misPaquetes.
Dentro de ella crearemos otra, a la que Ilamaremos programas, y otra
carpeta a la que denominaremos primeros. Ahora escribiremos un
sencillo programa de Java:
package misPaquet«
programas .primeros,
Le estamos indicando que nuestro programa va a quedar dentro de
este paquete. Ahora definiremos nuestra clase:
public class Programita(
public void imprimir() (
30 [Link]ee JAVA Vol. I
[Link] .print1n("\nEsto es un programa desde el
paquete primeros’
y
El modificador de acceso debe ser pitblico tanto en la clase como
en el método, de esta forma sera posible acceder a la clase desde
cualquier otro paquete. Cuando importemos la clase del paquete
creado antes, debemos hacerlo de la siguiente manera:
import [Link].*;
Con esto traeremos a las clases que hay dentro de él.
RESUMEN CAPITULO 01
En este capitulo analizamos las clases, el control de accesos a los
miembros, la creacién de constructores y los atributos. Hicimos una
incursion a los métodos, y analizamos de una manera practica su uso
dentro de las clases y la importancia de estos en el funcionamiento de
los programas. Luego hicimos una referencia a objetos mediante el uso
de this, y vimos como hace Java para recolectar la basura y liberar la
memoria. Finalmente analizamos la creaci6n y el acceso a los packages.
[Link] 311. CLASES Y OBJETOS, ast
Actividades 01
Test de Autoevaluaci6n
{Qué es una clase?
ie
2.
: -O-
[Easoioe
[aa] or (BEB ASSET Fe siaalenloe
Figura 5. Observemos que se han ubicado las dos clases de manera paralela, de tal forma que
podemos trabajar en conjunto y ver lo que hace una o la otra, Esto se puede realizar en forma
vertical u horizontal
[Link] 412. PROGRAMACION ORIENTADA A OBJETOS ees
En el ejemplo del auto, podemos ver que sus elementos se fusionan,
ya que por separado serian inertes 0, si no existieran, el programa
comenzaria a fallar. Ahora bien, cuando en un programa tenemos
varias clases, siempre una de ellas sera la clase principal, es decir,
la que provocars la ejecucién del programa. Esta clase principal es
aquella que contiene al método main, entonces, siempre existiré en un
programa hecho en Java una clase que contenga a este método.
Encapsulamiento
Encapsular consiste en esconder los atributos de una manera que, tan
solo con algunos métodos especiales, podamos verlos desde el lugar
que los invoquemos. El uso de este concepto en el paradigma a objetos
es sinénimo de seguridad. La encapsulaci6n es muy conveniente y nos
permite colocar en funcionamiento nuestro objeto en cualquier tipo de
sistema, de una manera modular y escalable.
Existen ciertos modelos o reglas para poder encapsular:
aC Hace que el miembro de la clase pueda ser accedido desde el
exterior de una clase y desde cualquier parte del programa.
CSL) Solo es accesible desde la clase y desde las clases que
heredan (a cualquier nivel).
be ee Cl Solo es accesible desde las clases.
Si tenemos un programa que esta compuesto por més de dos clases,
necesitamos imperiosamente usar el encapsulamiento. Este concepto
aparece cuando trabajamos con una cantidad de clases, y cada una de
ellas posee dedicaci6n a ciertas funcionalidades dentro del programa.
Deberia ser posible invocar las funcionalidades de una clase principal,
pero no siempre esto sucede, ya sea por cuestiones de seguridad o por
preferencias del programador, que puede requerir que determinadas
acciones solo se puedan manejar desde su propio médulo, a esto se le
llama encapsulamiento.
{Como hacemos para implementarlo? Usemos el mismo ejercicio de
la clase Uso_Coche:
42 [Link]ee JAVA Vol. I
[Link] =3;
Si ejecutamos el cédigo anterior, veremos que dara como
resultado que el auto posee 3 ruedas. Entonces, para qué
definimos en la clase Auto los atributos si podemos cambiarlos
desde cualquier seccién?
En este momento, podemos decir que existe informacién a la que
llamaremos sensible, que debera ser encapsulada. En el ejemplo que
hemos desarrollado, las ruedas solo se pueden modificar en la clase a la
que pertenecen o donde fueron construidas, para ello necesitamos usar
los modificadores de acceso, en nuestro caso colocaremos antes de
la variable el término private. Veamos ahora qué sucede si modificamos
nuestro codigo y, a todos los atributos, les agregamos private:
public class Auto (
private int ruedas;
private int ancho;
private int largo;
private int motor;
private int peso;
)
Cuando vayamos a la clase Uso_Coche, veremos que el codigo nos
mostrard un error, es decir, no sera posible acceder al objeto que
lamamos. Esto se debe a que hemos encapsulado el dato en la clase
Auto y, por Io tanto, no sera visible desde otra clase.
Reutilizaci6n de codigo
Una de las formas mas utiles para generar cédigo que sea reutilizable es que cada
método se limite a realizar una tarea bien definida, y su nombre exprese esa tarea
con efectividad, por ejemplo, sumarCuadrados(). Un método que lleva una tarea
especifica es mas facil de probar y depurar que uno mas grande y con multiples
tareas. Una manera de darse cuenta de que no estamos modularizando correctamente
es verificar que no podemos escribir un nombre conciso para un médulo o método.
[Link] 432. PROGRAMACION ORIENTADA A OBJETOS: ES
La pregunta ahora es: ¢cémo podemos hacer para acceder a estas
propiedades si permanecen invisibles? Necesitamos algunos elementos
adicionales, en este caso, los métodos getter y setter.
Ate? i a
ae
RES OC eee TWD B-O-
} [asaiemia| Em codeine «|
H eae) ory | OBB \ASVPei Pre sigue daa
2/20
Hal
: aS
E 1 joid main(Stringt} azgs) {
[|
[ Ll 4
!
Fe
Figura 6. En el cddigo de la imagen podemos observar que se presentan errores de acceso a los
atributos de un objeto (ruedas).
Para ver los datos que han sido encapsulados, debemos utilizar los
métodos de acceso, esto es una forma de conectar los elementos que
tenemos en las distintas clases.
Programacion funcional en Java
Aligual que Scala o Haskell, con la incorporacién de las expresiones Lambda, Java
8 hizo por fin el ingreso a la programacién funcional. Por ejemplo, se trata de una
manera bastante eficiente de agrupar una coleccién segiin el valor de un campo de
una clase en particular.
44 [Link]aes JAVA Vol. I
Los métodos getter y setter son estructuras que sirven para
obtener o almacenar algiin valor de un atributo de una clase. Un
getter (de get: ‘obtener’) indica que vamos a tomar un valor de un
atributo, también se lo llama método [Link] sintaxis de un
método de este tipo es la siguiente:
public [TipoDato] getNombreatributo() {
return nombreatributo;
Podemos notar que dentro de su instruccién hemos ubicado un
return; esto es adecuado para que retorne un valor, en este caso el que
corresponde a la variable.
En cuanto al método setter (de _: ‘poner’), esta indicado para
guardar lo obtenido anteriormente, también se lo denomina definidor.
La sintaxis de un setter es la siguiente:
Public void setNombreAtributo([TipoDato] nombreatributo) {
[Link] = nombreatributo;
Podemos notar que, en la sintaxis del setter, se encuentra un void, lo
que implica que no devolvera un valor.
La importancia de estos métodos radica en que podemos utilizar los
valores de algiin atributo sin la necesidad de hacerlo en la clase desde
donde se origind,
Paradigmas de programaci6n
En la programacién existen varios paradigmas, por ejemplo, hay lenguajes mas
antiguos que estaban orientados a procedimientos (Fortran, Cobol, Basic) y también
lenguajes mas modernos que estan orientados a objetos (C++, Java, [Link]). La
diferencia se encuentra en la forma de interpretar la manera de programar. En los
primeros, era bastante dificil corregir errores y reutlizar el codigo, mientras que en los
segundos es mas sencillo y pragmatico, pues utilizamos el mismo comportamiento
‘que tienen los objetos en la vida real
[Link] 452. PROGRAMACION ORIENTADA A OBJETOS ees
Veamos ahora un ejemplo para entender la forma en que se
implementan estos métodos siguiendo el trabajo que hemos realizado con
la clase Auto:
public class Auto {
private int ruedas;
private int ancho;
public Auto() {//Constructor de la clase
ruedas = 4;
ancho = 300;
I
public String cantidad_cuedas() {//Getter
return “la cantidad de ruedas
,
” + ruedas;
En el c6digo anterior creamos el método cantidad_ruedas(), del tipo
String, pues queremos que aparezca una cadena de caracteres en el
resultado. Luego utilizamos la palabra clave return para que retorne lo que
le encomendamos y, finalmente, concatenamos con la variable ruedas.
Ahora veamos cémo funcionara para que retorne un atributo en la
clase donde ejecutaremos el programa, es decir, Uso_Coche:
[Link] .printin("Ruedas: “ + mercury.cantidad_ruedas()) ;
En este codigo hacemos una salida y, dentro de ella, concatenamos
una cadena con el nombre del objeto previamente instanciado; podemos
notar que, al poner el punto, aparecerin los métodos. En nuestro caso,
solo debemos hacer clic en cantidad_ruedas(), que habiamos creado en el
ejemplo anterior. Cuando ejecutamos el programa, veremos el siguiente
resultado: Ruedas: a cantidad de ruedas es:4
Ahora bien, agregaremos mas atributos a nuestro programa, esta vez
no usaremos el modificador de acceso private:
String color;
int peso_Total;
boolean asientosCuero, aireAcond;
4% [Link]ees JAVA Vol. I
Ahora crearemos un método setter para establecer una caracteristi
ca especial para un auto especifico:
public void establececolor(){ //Método
color = “gris”;
En este caso hemos puesto el color gris. Para continuar, crearemos
un método getter para obtener este valor en la clase principal:
public String unColor(){//Método getter
return “el color del coche es: “ + color;
+
Ahora tendremos que instanciar un nuevo objeto en la clase
principal y lo hacemos de la siguiente forma:
public static void main(String[] args) {
Auto miAuto = new Auto();
[Link] ();
System. out .printin([Link] ()) ;
En el cédigo anterior hemos instanciado a la clase en un objeto
llamado miAuto.
Luego traemos el método que creamos en la clase Auto, escribimos
miuto y aparece la cantidad de métodos establecidos, entre ellos
elegimos estableceColor().
Luego, si queremos ver el resultado en pantalla, solo tenemos que
poner el nombre del objeto y elegimos el método getter unColor(), con
lo que obtendremos lo siguiente: el color del coche es: gris
Ahora bien, gqué pasari
sino escribiéramos la siguiente linea?
[Link] ();
Probemos ejecutando el programa sin la linea anterior, veremos que
nos arroja lo siguiente: el color del coche es: null
[Link] 472. PROGRAMACION ORIENTADA A OBJETOS ees
Esto sucede porque no estamos utilizando el método estableceColor(),
por lo tanto, aparecera vacio, esto es porque no estamos invocando a
un método existente
Pasar parametros
Una de las ieee que mejorara la implementacién de los métodos
ya mencionados es el uso de parametros. En el ejemplo de los getter
y setter, vimos como haciamos para pasar un aspecto del objeto, pero
esto presentaba una complicacién cuando necesitabamos pasar alguna
otra propiedad, y nos dejaba limitados.
Ante esto, una de las soluciones es que, a la vez que llamamos alguna
propiedad por un método, le pasamos junto con la llamada un parametro 0
valor, de esta forma el método tomara ese valor y operar con él. Volvamos
a los cédigos para ver como implementar el paso de parametros.
En la clase Auto:
public void estableceColor (Stringcolor_auto) {
color = color_auto;
Agregamos al setter un argumento (color_auto) de tipo String, luego
dentro del atributo color se iguala a la variable del pardmetro.
Debemos acotar que se puede pasar mas de un argumento en los
pardmetros de los métodos.
Constructor vacio
Las variables de instancia pueden declararse como public 0 como private y
pueden pertenecer a cualquiera de los tipos de datos primitivos de Java. Los
programadores suelen declarar variables de instancias private para probar,
depurar y modificar sistemas. Entonces, si una subclase puede acceder a una
instancia de variable private de su superclase, las que heredan de esa subclase
también lo pueden hacer. Esto provocaria la privacidad de informacién, cosa
que no esta bien.
48 [Link]aes JAVA Vol. I
Ahora la clase Uso_Coche:
public static void main(string[] args) (
Auto miauto
new Auto();
[Link] (“Rojo”) ;
System. out . print in ([Link] ()) ;
Una vez instanciada la clase lo que hacemos es escribir miAuto,
observamos que inmediatamente aparecera la serie de elementos
antes construidos, Elegiremos el método estableceColor(), dentro de él
escribimos un String del color que deseemos.
Si ejecutamos el cédigo deberiamos ver lo siguiente: el color del
coche es: Rojo
Inicialmente habiamos establecido los atributos de las tiltimas tres
variables sin una prohibicion de acceso, esto atenta contra la regla
principal de la encapsulacién, veamos qué pasaria si escribimos la
siguiente linea en la clase Uso_Coche:
[Link]= “verde”;
Ahora veamos qué aparece cuando ejecutamos el cédigo el color del
coche es: vertle
Esto no resulta una buena practica, pues no nos serviria de nada
todo lo creado antes. Nos encontramos ante un error conceptual, pues
nunca debemos manipular directamente la propiedad de un objeto
utilizando su propia instancia.
Referencias a objetos de la misma clase
Si un objeto de una clase hace referencia a otro objeto de la misma clase,
el primer objeto puede acceder a todos los datos y métodos del segundo, no
importa que alguno de estos sean private.
[Link] 492. PROGRAMACION ORIENTADA A OBJETOS: Ss
Wi Prestacones [ElArchives il Proyectos - Matodos
Editar Ver Navegar Fuente Reestructurar Ejecutar Depurar Profile Team Herrami
RRBs OC auom 3) TB D-B-G-
“Pagina de nico _ ||| Auto.java_ |} Uso_Coche java
[Ree] tor |B AEP BRP esiaule ala
1) package pot
3 *
3 * gauthor Ch
A .
5 public class Uso_Coche {
6
7 public static void main(String(] args) {
8 Auto miauto = new auf
&
10) System. [Link] ([Link] ())+
1
12 >
13 >
Fa
Figura 7. En a figura vemos que el IDE sugiere, dentro del elemento invocado, que el valor es de
tipo String, esto se debe a que habiamos pasado el pardmetro en el setter.
Ahora ponemos el modificador de acceso private en la siguiente variable:
private String color;
Esto provocara que la clase Uso_Coche nos marque un error de
privacidad, por lo tanto, no podemos usar el atributo color:
[Link]= “verde”;
Aqui vemos las consecuencias directas de lo que sucede si no
encapsulamos nuestras variables.
Ahora crearemos un método setter para los asientos, para que
podamos elegir si seran o no de cuero; cuando tengamos este tipo de
disyuntivas, usaremos el tipo boolean:
[Link]aes JAVA Vol. I
public void estableceAsientos (String:
//setter
if (asientosCuero:
this
entosCuero
yelse{
ientosCuero=fals
this
En este caso crearemos una estructura de decision para resolver si el
coche tendra o no asientos de cuero. Para ello, utilizaremos la palabra
reservada this:
public String tipoAsientos(){ //Getter
itt
return “El coche lleva asientos de cue:
jelset
turn “el coche lleva asientos normales”;
y
entosCuero. equalsIgnoreCase("si”)) {
Antes de continuar, debemos establecer que dentro de un if nunca
se debe comparar el String con el signo ==, en vez de ello, debemos
hacerlo con el método equals.
Ahora iremos a la clase uso_Coche para ver si funciona lo que
acabamos de construir, debemos establecer el método setter
estableceAsientos y, dentro de él, ponemos un valor que determinara si
lleva o no asientos de cuero:
miAuto
stableceAsientos ("si") ;
System. out .print1n([Link]()) ;
d
Al ejecutar el cédigo anterior, vemos que funciona a la perfeccién,
entregando el siguiente resultado: El coche lleva asientos de cuero.
[Link] 512. PROGRAMACION ORIENTADA A OBJETOS Eas
Al utilizar el IDE, existe una forma automatica de construir
los getter y setter de todos los elementos creados; para lograrlo
hacemos clic derecho en la linea donde vamos a incrustar los
métodos y elegimos la opcién Insertar, luego hacemos clic sobre
getter y setter.
Una vez elegida la opcin, veremos todas las variables
disponibles, solo debemos marcar aquellas para las que
construiremos el getter o el setter.
Una vez creados los métodos que necesitemos, el IDE nos ubicara
dentro los elementos adecuados para seguir programando, esto
genera una enorme ventaja ya que no es necesario escribir mucho
cédigo para implementarlo. La forma en que se veran es como
muestra el siguiente ejemplo:
public int getRuedas() {
return ruedas;
y
ioiis aia Vr Dave Foone faa Gear Oops Pate Team Waramienar Verona ae
AES OC seo isl TW D-
[ 7 Oe Geter yters
[Enos sve
reoey [BF = BLS PEGG GSE sie eps prem nptny tion
public String aalor()
‘ lamsensoncuerem="9i"?
public Seeing tiposstentos()(
Figura 8. Ena figura podemos ver cémo se pueden seleccionar los abjetos que creamos
convenientes y, a partir de eso, crear los getter y setter,
52 [Link],as JAVA Vol. I
public void setRuedas(int ruedas) (
[Link] = ruedas,
)
Se realizaré lo mismo con cada una de las variables creadas. Por
ejemplo, si tenemos 10 variables creadas, se crearan 10 getter y 10
setter, 20 métodos en total, todo en un segundo.
Al crear nuestros métodos getter y setter, puede que existan algunos
que nunca usemos por lo que estaremos contradiciendo el ahorro de
memoria, sin embargo, si tenemos en cuenta el ahorro de escritura de
c6digo, podemos considerarlo como una buena practica.
Ey a
i Public int get Ruedas) (
,
public void setRnedas(int ruedas) (
| [Link] = x
,
public int getanchot) (
public void setAncho(int anche) ¢
>
public int getLargo() (
revurn iargi
,
public void setLargo(int largo) {
chia. arge = larg
Figura 9, Podemos notar
que el IDE ha ubicado, por
poblic int getilotor() ( cada elemento creado
| 5 ee (variables), su respectivo
getter y setter, con la
codificacién necesaria
ids para continuar.
,
[public void setMotor(int motor) {
[Link] 532. PROGRAMACION ORIENTADA A OBJETOS ees
CONSTRUCCION DE OBJETOS
‘Trabajaremos ahora con la construccion de objetos; en el ejemplo de
la clase Auto, vamos a crear otro método, pero esta vez haremos que
inicialice un setter:
public void configuraAire (String aireAcond){ //Setter
Af ([Link]("si”)) {
‘[Link] = true;
Ahora que ya configuramos el estado del aire acondicionado del
auto, haremos lo mismo con el getter:
public String tieneAireAcond(){ //Getter
4€(aireAcond ==true) (
return “El coche tiene aire acondicionado”
yelse(
return “El coche no tiene aire acondicionado”;
Visibilidad de métodos y atributos
Cuando exponemos y, en contraposicién, escondemos elementos, estamos
haciendo referencia al nivel de visiblidad de los métodos y los atributos de las.
clases. Los atributos y los métodos que definamos como public seran visibles
desde cualquier clase; por el contrario, aquellos a los que definamos como private
estaran encapsulados y, por ende, solo podran ser invocados y manipulados dentro
de la misma clase.
54 [Link]aes JAVA Vol. I
A continuaci6n, crearemos un método que sea getter y setter a la
vez; aunque no sea una buena practica este tipo de implementaciones,
lo haremos para aprender un poco mas acerca de estos conceptos.
Basicamente, lo que lograré es hacer las dos cosas (getter y setter), pero
no a la vez, sino dependiendo de lo que le pidamos.
Para continuar con el ejemplo del Auto, incorporaremos el peso total
del vehiculo, sin embargo no sabemos si el auto va tener aire o asientos
de cuero, por lo tanto, podria tener peso extra. Veamos el codigo:
public String pesoAuto() (
//setter y Getter a 1a vez
int peso_carroceria = 500;
peso_Total = peso_plataforma + peso_carroceria;
if(
peso_Total = peso_Total + 50;
entosCuero==true) {
//Estimamos este peso extra de los
d
if (aireAcond =:
ntos de cuero
rue) {
peso_Total = peso_Total + 20;
//Bstimamos este peso
?
xeturn “el peso del coche
” + peso_total;
Entonces, :por qué seria un método getter y setter a la vez? Por un
lado establece, con una estructura de decision, los pesos adicionales
que tendré el auto y, por otro lado, los obtiene a través del return.
La anotaci6n @Override
Debemos declarar métodos sobre escritos cuando se va a asignar en tiempo de
compilacién y se hayan definido las firmas correspondientes al método. Aunque es
mejor encontrar errores en tiempo de compilacién que en ejecucién.
La anotacion @Override simplemente se utiliza para forzar al compilador a
comprobar en tiempo de compilacién que estamos sobrescribiendo correctamente
un método, y de este modo, evitar errores en tiempo de ejecucién.
[Link] 552. PROGRAMACION ORIENTADA A OBJETOS ees
Ahora declararemos un getter con el precio del coche, nuevamente
tendremos que considerar que no es lo mismo que tenga aire o que
cuente con asientos de cuero. Veamos el codigo:
public int precioCoche()( //Getter
int precioFinal= 15000; //Precio estimado en délares
if (asientoscuero:
rue) (
precioFinal += 2000; //Precio e:
d
if(aireacond ==true) (
precioFinal += 1500; //Precio e:
»
return precioFinal;
imado
imado
Ahora probamos este ejemplo en la clase Uso_Coche, recordemos que
esta contiene el método main que Ilamara a los métodos creados:
[Link] ("no") ;
System. out .print1n ([Link] ());
[Link] ("si") ;
System. out .print in ([Link] ()) ;
‘System. out .printin ([Link]()) ;
[Link] .printin("el precio final del auto es: * + mi-
[Link] ()) ;
Superpoblacién de clases
En Java, todas las clases forman parte de una jerarquia de clases. Es bien sabido
en la industria del software que se debe evitar la proliferacion de clases, lo que
provoca problemas de indole administrativa y obstaculiza la reutilizacién de
software. Evitemos complejizar las jerarquias.
56 [Link]ea JAVA Vol. I
Ahora ejecutaremos el programa, para ello debemos probar cuando
tiene asientos de cuero 0 cuando tiene aire, y cuando no presenta estas
caracteristicas. Hay que recordar que el precio establecido para este
auto es de 15000 délares, segiin ello, debe aumentar 2000 para los
asientos de cuero y 1500 para el aire.
De la misma manera, debemos probar el peso, recordando que los
asientos de cuero pesan mas y si lleva aire, también.
Al ejecutar el programa podemos ver lo siguiente en la consola:
el color del coche es: Rojo
El coche lleva asientos de cuero
El coche tiene aire acondicionado
el peso del coche es 1170
el precio final del auto es: 3500
Esta claro que el programa resulta un poco incémodo, pues debemos
cambiar los valores de manera manual, la forma correcta es usando
un cuadro de diélogo que nos pida los valores que deseemos para el
auto. Esto puede solucionarse gracias al uso de la clase Swing, que
conoceremos mas adelante.
CLASE SWING
La clase Swing nos permite trabajar con elementos de entrada de
datos, como caja de datos y mensajes. Para implementar esta clase
debemos importarla:
import [Link].*;
De este paquete vamos a utilizar un elemento llamado JOptionPane:
Auto miauto = new Auto();
System. out .print1n (JoptionPane.
showInputDialog(“Ingresa el color del auto: “));
[Link] 572. PROGRAMACION ORIENTADA A OBJETOS ees
miauto
stableceColor ([Link] ());
[Link] (JoptionPane.
showInputDialog("zTiene asientos de cuero?”));
System. out .print 1n ([Link]());
miAuto . configuraAire (JOptionPane.
showInputDialog("zTiene aire acondicionado?”)) ;
system. out .print In ([Link]());
system. out .printin ([Link]());
ae
System. out .print1n("el precio final del auto e:
[Link]());
Implementamos el JOptionPane cuyo método showInputDialog nos
permite efectuar la entrada de datos a través de un cuadro de didlogo.
Por otro lado, las siguientes instrucciones permiten que los resultados
puedan verse en la consola:
[Link] ([Link] ());
System. out .print1n ([Link]()) ;
System. out .print1n ([Link]()) ;
Cuando respondemos que si a alguno de los elementos extras que
tendra el auto, estos se sumaran al precio total y a su peso, mientras
que, si respondemos en forma negativa, dejara todo como se establecié
de manera predeterminada. Al ejecutarlo podemos verificar que el
programa funciona a la perfeccién
Java FX
Las bibliotecas de Java FX han venido en las ultimas versiones a reemplazar a Java
Swing en lo que se refiere a la GUI. Con el advenimiento de nuevos patrones de
disefio cada vez mas versdtiles, como MVC, los programadores estan viendo con
mejores ojos esta nueva alternativa que ofrece Oracle.
58 [Link]ier veg Foes Reinet Gente Depunr Bie Tem Hevaiesan Vemma Ams
1S OE arom ol TW: O-
fea [Link] x)
fer |B B-BIRSFEG Pe lagiealie
package poo;
[moore [Link].*2
public class Use Coane {
Public static void matn(string{] args) {
‘Auto miauco = new Auco()
‘Syatem. [Link] (JopeionFane. shovInputDialo|
[Link] (miAato,unColor ())7
oe
| ——_,
Figura 10. En esta imagen se muestra como Java Swing nos permite cargar informacion a través
de un cuadro de dilogo.
« ms
& RESUMEN CAPITULO 02
[Link] 592. PROGRAMACION ORIENTADA A OBJETOS: as
Actividades 02
Test de Autoevaluaci6n
1. {Como se crea una clase?
2. {De qué forma se puede instanciar un objeto de clase?
3. Nombre los elementos fundamentales de la programacién orientada a objetos.
4. (Qué funcién cumple el método constructor dentro de las clases?
5. {Cudl es el sentido de modularizar los programas?
6. {Qué significa el encapsulamiento?
7. (Qué es un método getter?
8. {Como pasamos parametros en los métodos?
9. {Qué es un constructor de objeto?
10. {Qué es la clase Swing?
Ejercicios practicos
1. Cree una clase e instancie los objetos que necesite para un programa en el que
se calcularan los sueldos de los empleados, teniendo en cuenta las horas extra
y los impuestos que se les descuenta.
2. Considerando el ejercicio anterior, debe encapsular las variables. Recuerde el
motivo por el que se realiza esta accion.
3. Provoque los métodos getter y setter necesarios para invocar a las acciones
realizadas en cada parte del programa.
4. Realice un programa calculadora, en el que dada cierta cantidad de nimeros, se
resuelvan operaciones basicas. Recuerde aplicar lo aprendido en este capitulo.
60 [Link]J
(~—F"
Sense eel;
esenciales de la POO
En este capitulo revisaremos en forma mas detallada
algunos de los elementos que componen la POO. Veremos
la colaboracion de clases, aprenderemos sobre la herencia
y, ademas, profundizaremos en el polimorfismo, es decir,
lograremos que los métodos enviados a los distintos objetos
sean interpretados de una manera inteligente.
‘033. ELEMENTOS ESENCIALES DE LA POO. ees
COLABORACION DE CLASES
Cuando dos 0 mas clases se comunican entre si y una de ellas intenta
enviar un mensaje a través de los métodos, estamos frente a la
colaboracién de clases. Asi como en la vida real es muy dificil que los
objetos se encuentren aislados, en la POO también deben relacionarse.
co Vola
aS Figura 1. En el modelo
se muestra como una
clase intenta comunicarse
con otra, esto se produce
gracias a los métodos.
Ahora veremos un ejemplo que muestra como manejariamos
una caja menor, pues nos servira para entender como funciona la
colaboracién de clases:
Package cajamenor;
public class IngresosEgresos {
J/atxibutos
private String nombre;
private int caja;
public IngresosEgresos (String nom) (
nombre=nom;
public void ingresar(int c) {
62 [Link]as JAVA Vol. It
cas:
public int retornarMonto() {
return caja;
public void imprimirIngresos() {
System. out .printin(nombre +” pagé “+ caja);
?
public void imprimirggresos() (
[Link] .printin("A “ + nombre +” se le pagé “+
(caja);
d
En este codigo creamos la clase y las variables privadas o atributos,
después el constructor de la clase, un método que pasa parametros;
luego creamos los getter y setter, finalmente el método imprimirIngresos()
¢ imprimirEgresos() que devolvera los valores antes configurados.
Ahora debemos crear la clase CajaMenor, que contendra la siguiente
codificacion:
package cajamenor;
public class CajaMenor {
private IngresosEgresos clientel, cliente2, cliente3,
cliente4, provi, prov2,pagol;
public CajaMenor() {
clientel=new IngresosEgresos (“Juan”) ;
cliente2=new IngresosEgresos (“Ana”);
[Link] 633. ELEMENTOS ESENCIALES DE LA POO as
public void operacion
cliente3=new IngresosEgresos (“José”) ;
cliente4=new Ingres Panaderia”);
provi=new IngresosEgresos (“Lécteos”) ;
Prov2=new IngresosEgresos (“Bebidas”) ;
pagol = new IngresosEgresos (“Banco”) ;
oO
= (500) ;
= (650) ;
cliente3. ingresar (450) ;
clientel.. ingre:
cliente2. ingre:
[Link] (200) ;
[Link] (150);
[Link] (800) ;
public void Totales()
{
Ant total = [Link]() + cliente2.
retornarMonto()+ [Link]()+ provl.
retornarMonto()+ [Link]()+ pagol.
retornarMonto () ;
[Link] ("El total de dinero en la caja es.
+ total);
cliente .imprimirIngresos () ;
cliente2. imprimirIngresos () ;
cliente3. imprimirIngresos () ;
provi. imprimirEgresos ();
[Link] ();
pagel. imprimirEgresos ();
public static void main(String[] ar) (
CajaMenor cajasnew CajaMenor() ;
[Link]ea JAVA Vol. I
casi
[Link]();
operaciones ();
Hasta aqui hemos creado ¢ instanciado la clase CajaMenor, también
definimos los atributos; mediante el constructor, le daremos el nombre
tanto a los clientes como a los proveedores y el pago, ya sea el pago
predeterminado o mediante el paso de parametros.
A continuaci6n, tenemos los métodos operar() en donde cargaremos
el dinero que entra o sale de acuerdo al nombre instanciado.
En el método Totales() se imprimir la informacion previamente
calculada, por otra parte, en el método main haremos la llamada de
todos los métodos creados tanto en esta clase como en la predecesora.
Cuando ejecutemos el programa, debera mostrar lo siguiente:
El total de dinero en la caja es: 450
Juan pagé 500
‘Ana pagé 650
José pagé 450
A Lacteos se le pagé 200
A bebidas se le pagé 150
A Banco se le pagé 800
Clases anidadas y métodos privados
Cuando tenemos tanto clases anidadas como internas, el miembro privado y el
cédigo que lo usa pueden estar en la misma clase, y al mismo tiempo, también
estan en diferentes clases. Como ejemplo, si tenemos dos clases anidadas en una
clase de nivel superior, entonces el cédigo en una de las clases anidadas puede ver
tun miembro privado de la otra clase anidada.
[Link] 653. ELEMENTOS ESENCIALES DE LA POO. ees
CONSTRUCTOR DE OBJETOS
Un constructor de objetos es un método que se llama
autométicamente cuando se declara un objeto de esa clase y cuya
funcién es inicializar el objeto. De hecho va a validar los valores que
los objetos contendran.
Recordemos la sintaxis de la construccién de un objeto
// cxeamos un objeto a través del constructor por defecto
Nombre nom = new Nombre();
Como ya hemos visto, trabajaremos con un ejemplo al cual le iremos
agregando elementos tedricos conforme vayamos avanzando con el cédigo.
Cambiaremos un poco la tematica de los ejemplos para que no se
torne mondtona la forma de nuestro aprendizaje. Esta vez trabajaremos
con una clase trabajador o empleado (para los efectos, da lo mismo).
El empleado va tener ciertos atributos (nombre, sueldo, fecha de
ingreso) y un método al que llamaremos aumentarSueldo().
OBJETO EMPLEADO
EMPLEADO
ase PENG
Was sate) Dra vary SUELDO
Figura 2. En el grafico se muestra un objeto llamado empleado, los atributos que llevara y el método.
Nos remitiremos al IDE para crear una clase Empleado, pero esta vez
trabajaremos en una misma clase. Esta clase contendra varias clases
adentro y, ademés, sabemos que esta clase tendré el método m
66 [Link]aes JAVA Vol. I
import [Link]; //importamos este paquete
public class UscEmpleado {
public static void main(string[] args) {
y
class Empleado{
public Empleado(String nom, double sue, int afio, int
mes, int dia){ //constructor de clase
>
// variables de clase
private String nombr
private double sueldo;
private Date altaIngreso;
Tengamos en cuenta que la clase Empleado no tiene el modificador de
acceso public, pues cuando convive en una sola estructura debe haber
una sola clase publica, de la misma manera que solo una de las clases
debe contener un main, que es el que ejecuta la clase piiblica y todo lo
que llamara segtin lo que se haya programado dentro.
El constructor de la clase va a recibir parametros y debe llevar el
mismo nombre de la clase que va a construir.
Tipos de datos objeto
‘Ademas de los tipos de datos primitivos (int, char, boolean) que conviven en la
libreria [Link], a partir de la version 5 de Java existen otros tipos de datos a los
que llamaremos tipos de objeto. Estos en principio se escriben con maytisculas,
tenemos: Boolean, Char, Byte, Short, Integer, Long, Float, Double, Biginteger.
En los tipos de datos objeto podemos envolver su respectivo tipo de dato primitivo
para realizar las operaciones directamente sobre un objeto. De igual manera, de un
tipo de dato objeto, padremos obtener su valor como tipo de dato primitivo.
[Link] 673. ELEMENTOS ESENCIALES DE LA POO. ees
En este momento debemos considerar a las variables de clase que,
a diferencia de las variables de instancia, son propias de la clase que
las contienen y no de las instancias de ellas.
Podemos notar que hemos puesto private en los modificadores de
acceso (encapsulacién) y, ademas, que Date es una variable de tipo de
datos objeto. Otra de las cosas que notamos es que, al poner Date, nos
aparece subrayado como si tuviese un error, entonces debemos importar
puesto que no esta dentro del paquete de [Link]. Debemos ir a la API
de Java y verificar cual es el paquete al que pertenece Date, que esta
dentro de [Link].*; con esto el marcado del error desaparecera.
Gregorian calendar
El Gregorian calendar es una subclase que hereda de la clase Calendar
distintos elementos, como los métodos, que podemos encontrar en
la API de Java, y que soporta un estandar de formatos de fechas y
horas de todo el mundo. Se encuentra dentro del paquete [Link].
GregorianCalendar. E] constructor tiene los siguientes parametros:
GregorianCalendar(int year, int month, int dayOfMonth)
Ahora bien, seguiremos con el ejemplo planteado donde
trabajaremos dentro del constructor public Empleado(), igualaremos las
variables de clase con el parametro que hemos pasado al constructor.
Es un buen momento para aprender a implementar una clase que
viene con Java para la construccién de una fecha con el Gregorian
calendar, la que también se encuentra dentro de la API de Java.
GregorianCalendar calendario = new GregorianCalendar (aio,
mes-1, dia);
Este cédigo nos indica que hemos creado un constructor, luego
hemos instanciado el objeto calendario y le hemos pasado los.
pardmetros que antes habiamos pasado. A la variable mes, le restamos
1, pues se indexa desde cero y con esto no nos perdemos tanto al
colocar los meses en enteros.
68 [Link]JAVA Vol. I
public Empleado(String nom, double sue, int afio,int mes,
int dia) {
nombre = nom;
sueldo
GregorianCalendar calendario = new
GregorianCalendar (afio, mes-1, dia);
altaingreso = [Link](); //devuelve la
fecha
eco
onstrane Deerain
etna Summary
Figura 3. Aqui vemos la pagina oficial de Oracle en la que se encuentra la API Gregorian
c
-alendar. Existen varios constructores, usaremos el segundo en el que podremos personalizar
nuestra propia fecha.
Ahora vamos a crear los getter que nos devolveran los valores que
hemos almacenado:
//GETTER
public String unNombre() {
return nombre;
[Link]
693. ELEMENTOS ESENCIALES DE LA POO. ees
public double unSueldo() {
return sueldo;
>
public Date unaFechaalta()(
return altatngreso;
A continuacién, crearemos un setter que nos va subir el sueldo.
No llevara getter puesto que lo que hace es construir un método y no
devolver algo que ya esta almacenado:
public void aumentaSueldo(double porcentaje) {
double aumento = (sueldo * porcentaje) /100;
sueldo += aumento; //operador incremental
)
Al crear este setter es obligatorio que lleve un pardmetro y, dentro de
61, haremos los calculos respectivos para que se aumente un porcentaje
al sueldo preestablecido.
Asimismo, hay que entender que el operador de incremento resume
lo siguiente:
sueldo = sueldo + aumento;
Una vez que hemos creado el constructor de objeto y los métodos
inherentes para que todo esto sea posible, nos queda ir a la clase
principal y crear las instancias de la clase Empleado. Esto lo haremos
dentro del método main:
Empleado empleadol = new Empleado("Juan Pérez”, 15000,
2000, 03, 18);
Empleado empleado2 = new Empleado ("Marta
Rodriguez”, 12000, 2003, 05,22);
Empleado empleado3 = new Empleado("Martin de
Robertis”, 16000, 1998, 10,30);
70 [Link]aes JAVA Vol. I
Hemos instanciado tres objetos de la clase Empleado y dentro de
los parametros pasamos los argumentos necesarios para cada uno.
Notemos que siempre usaremos la palabra New para crear instancias de
la clase Empleado.
Debemos destacar que, si hemos creado el constructor con tres
argumentos, debemos hacerlo con la misma cantidad, en caso contrario
nos marcaria un error; lo mismo sucede con los tipos de datos, deben
coincidir con los declarados antes.
Ahora utilizamos el método aumentaSueldo() para darles un aumento
(por ejemplo 10%) a cada uno de los empleados instanciados:
empleadol . aumentaSueldo (10) ;
empleado2 . aumentaSueldo (10) ;
empleado3 . aumentaSueldo (10) ;
Ya hemos creado todo lo que necesitamos, ahora vamos a imprimir
para poder ver los resultados por consola, para ello debemos escribir
lo siguiente
[Link](*| Nombre: "+[Link]()+ ”
| suetdo: "+ [Link]()+ * | Fecha de Ingre:
“templeadol .unaFechaalta());
[Link](*| Nombre: “+[Link]()+
* | suerdo: “+ empleado2 .unSueldo()+ * | Fecha de
Ingreso: “+[Link]()) ;
[Link] .printin(*| Nombre: “+empleado3
unNombre()+ * | Sueldo: * +[Link]()+ * | Fecha
de Ingreso: * + [Link]());
Al ejecutar el programa veremos lo siguiente:
| Nombre: Juan Pérez | Sueldo: 16500.0 | Fecha de
Ingreso: Sat Mar 18 [Link] ART 2000
| Nombre: Marta Rodriguez | Sueldo: 13200.0 | Fecha de
Ingreso: Thu May 22 [Link] ART 2003
[Link] n3. ELEMENTOS ESENCIALES DE LA POO. ees
| Nombre: Martin de Robertis | Sueldo: 17600.0 | Fecha de
Ingreso: Fri Oct 30 [Link] ART 1998
Podemos
mplificar esta codificacién a través de alguna de
los temas que fuimos aprendiendo a lo largo del libro, para ello,
implementaremos arreglos
Empleado[] misEmpleados = new Enpleado[3];
misEmpleados[0] = new Empleado ("Juan Pérez”, 15000,
2000, 03, 18);
misEmpleados [1]
12000, 2003, 05,22);
misEmpleados[2] = new Empleado ("Martin de Robertis”,
16000, 1998, 10,30);
new Empleado ("Marta Rodriguez”,
for(int i =0;1<3;4++4)(
misEmpleados [i] .aumentaSueldo (10) ;
Hemos creado un array Empleado(], seguido del nombre del array
(misEmpleados), De esta forma estamos instanciando dentro de la
variable del array con el indice de cada uno de los elementos que
creemos: misEmpleados{0]. Esto lo igualamos a New con los parametros
que consideremos convenientes,
Recordemos que debemos pasar la misma cantidad de argumentos
de los creados y respetar el tipado. En el ejemplo tenemos tipos String,
double e int.
Luego es necesario implementar un bucle for que recorra el arreglo y
que sea menor a la cantidad de elementos creados. Cuando escribimos
misEmpleados[i]. aparecern los distintos métodos que creamos,
elegimos el que hace que aumente el sueldo y, como argumento el 10,
(ue es el 10%)
for(int 4 =0;1<3;4++) (
System. out .print1n("Nombre: “ + misEmpleados [i].
7] [Link]aes JAVA Vol. I
unNombre()+ * Sueldo: * + misEmpleados[i].unSueldo() + ~
“+ misEmpleados [i] .unaFechaAlta()) ;
Fecha Ingres
y
Este bucle for sostendra los elementos de impresién que, a diferencia
del ejemplo que comentamos, debemos colocarle a misEmpleados{i
También podemos implementar un for each:
for(Empleado e: misEmpleados){ // una forma resumida
del for (con for each)
System. out .println("Nombre: ° + [Link]()+
* Sueldo: * + [Link]() + * Fecha Ingreso: “+
[Link]()) ;
)
Cuando ejecutemos el programa, nos presentara el mismo resultado.
Con esto tenemos un programa funcional, aunque la forma de
implementarlo dependera de nuestros gustos y necesidades.
USO DE CONSTANTES
Las constantes son elementos cuyo valor permanece inalterable
a lo largo de un programa, y la manera de crearlas es muy
parecida a la de las variables. Por convencién deben escribirse en
mayiisculas para diferenciarlas de las variables, ademas se debe
agregar adelante el modificador final. En consecuencia, cada vez
que veamos en una instruccién este modificador final, debemos
asociarlo a una constante
Su sintaxis es la siguiente: static final NOMBRE_CONSTANTE = valor.
Veamos un ejemplo para aclarar este concepto: static final PI = 3.14159.
Podemos verificar que, antes del modificador final, esta la palabra
reservada stati
Ahora presentaremos un pequefio programa para ver en qué casos se
pueden aplicar las constantes en Java:
[Link] 7B3. ELEMENTOS ESENCIALES DE LA POO. ees
public class UsoConstantes {
public static void main(string[] args) {
Empleado empleadol = new Empleado(*Juan”) ;
Empleado empleado2 = new Empleado("Rosa”);
‘empleadol . cambiaArea (“Administracién”) ;
System. out .print1n (empleadoi .devuelveDatos ()) ;
System. out . print In (empleado2. devuelveDatos ()) ;
,
class Empleado{
public Empleado(String nom) { //Constructor
nombre = nom;
areaTrabajo = “RRHH’
)
public void cambiaArea(String areaTrabajo) {//SETTER
[Link] = areaTrabajo;
»
public String devuelveDatos(){ //GETTER
return “El nombre “+ nombre + “ el drea
areaTrabajo;
d
private String nombre;
En principio, este codigo posee informacién de empleados que se
inician en un area laboral, para ello hemos creado un constructor con
los atributos de los objetos. Luego con un setter cambiaArea() y un getter
devuelveDatos(), lograremos ciertos cambios en ellos.
En el método main instanciamos los objetos de la clase Empleado
e incluimos informacién de dos empleados. Hasta aqui no hemos
hecho nada que no sepamos, pues son métodos y clases que venimos
trabajando en los tiltimos tres capitulos. Ahora bien, qué pasaria si
creamos un setter cambiaNombre():
public void cambiaNombre (String nombre) ( //SETTER
[Link] = nombre;
4 [Link]oe JAVA Vol. I
Luego, en el main instanciamos al objeto:
empleadol .cambiaNombre (“Maria”) ;
Cuando ejecutemos este programa veremos que empleadol, al que
inicialmente le pusimos por nombre Juan, pasara sin ningiin problema
a lamarse Maria.
Java no tiene ningun problema de hacerlo, pero esto no significa que
sea lo correcto, puesto que existen reglas a la hora de codificar.
Tae RESID
[acne Ear ver Navepe Fuente Reaciun Gear Oeuf Team Heramants Ventana Ajuda
DRESS OO awe TH >-B-O-
[Rowéenc unten | wtomtnteive =|
ea) |S SASF BG Pe siagleams
13) +
|}
Fry class empleado,
ie
nombre = noms
v7 I public Empleado(string non) (
}
Tneaxine Finn Bho tae &
a9 areatrabajo = "RRHH"
20
al 6 public void eambiaarea(sthing areatrabajo){//se rr
OY ee
Zz aa =
24) & |ittete mgt gee Nombre(Stiig nonbre)( //SE11E8
e t ‘[Link] = nombres
26 }
21/6 public sting devuelvepates(){ //cE Tre
2 | return "El nonbre es: "+ nonbre +" el rea es " + areatrabajo;
29 i
30 private final Sting nonbre;
a1 private String areaTrabajo;
Figura 4. En la codificacién, nétese que el IDE nos muestra como falla el programa si ponemos la
palabra clave final antes del tipo de dato del atributo nombre,
Recordemos que, en el constructor de la clase, creamos dos variables
con sus respectivos atributos:
private String nombre;
private String areaTrabajo;
[Link] 53. ELEMENTOS ESENCIALES DE LA POO. ees
A nombre le colocaremos la palabra reservada final, antes del tipo de
dato. Con esto, esa variable (nombre) no puede ser modificada:
private final String nombre;
Podemos notar que, inmediatamente, el programa comienza a fallar
en todos los lugares en donde se invoca a la variable. Si lo ejecutamos,
nos mostraré el siguiente error:
Exception in thread “main” java. [Link]:
Uncompilable source code - cannot assign a value to final
variable nombre
Trataremos las excepciones en profundidad en el Capitulo 9 de
este libro. Lo que haremos ahora es eliminar el setter que habiamos
creado para cambiar el nombre, asi como el llamado a él en el main.
USO DE STATIC
La palabra reservada static puede indicar que un atributo de una clase
puede no pertenecer a una instancia de una clase, sino a la clase en si
Por ello, cuando definimos un atributo como statie, solemos llamarlo
atributos de la clase.
Usemos el ejemplo anterior, en principio vamos a darle a cada
empleado un Id, sabemos ademas que este ntimero no puede repetirse
Parametrizaci6n de métodos
Es recurrente producir errores légicos cuando un método contiene un parémetro
‘0 una variable local con el mismo nombre que un campo de la clase. En esta
situacion, usaremos la referencia this si deseamos acceder al campo de la clase;
en caso contrario, se hara referencia al parémetro o a la variable local del método.
Por cierto estos errores son muy dificiles de localizar.
1% [Link]ee JAVA Vol. I
Ahora bien, usaremos la variable del tipo estatica para ver de qué
manera vamos a implementar dentro del ejemplo
class Empleado{
public Empleado(String nom, int Id){ //constructor
nombre = nom;
areaTrabajo = “REE”;
[Link] = 34
Dentro del constructor, agregamos la variable de tipo entero Id y
luego con el this igualamos a Id.
Nuevamente, el IDE nos marcara error en los objetos
instanciados en la clase principal (main), la que, si prestamos
atencién nos dira que estan preparados para recibir dos parametros
y solo les hemos pasado uno (recordemos que es un concepto que
ya hemos introducido).
Luego debemos agregar lo siguiente para que no nos marque mas
este tipo de errores muy recurrentes al omitir el paso de parémetros:
Empleado empleadol = new Empleado("Juan”, 1);
Empleado empleado2 = new Empleado("Rosa”, 2);
Aqui hemos colocado a cada empleado un Id después de los
nombres (1 y 2, respectivamente). Ahora que ya tenemos pasados los
parametros, falta aclararle al método getter (que es el encargado de
devolver los valores) que ahora también devuelva los Id creados
public String devuelveDatos(){ //GETTER
return “El nombre es: “+ nombre +“ el drea
es "+ areatrabajo +“ y el mp: * + 34
1
Esto funciona perfecto para fines educativos, pero, si queremos
implementarlo para un entorno productivo, no seria muy practico.
[Link] 13. ELEMENTOS ESENCIALES DE LA POO
Arann latins rare Tae
et awe rp oe teeter Gee et oie Soe
HESS OC aoe TB DBO:
Se aL
fore WS RBoRTeeeaele clas
10
na
2
a
us
as
16
a
a8
a9
20
21
public class Usoconstantes {
public static void matn(stringl] args) {
public Empleado(String nom, int Td)
osbre = noms
areaTrabajo = "RRM";
[Link] = Td;
Figura 5. Notemos el error que nos muestra al haber ingresado un nuevo tipo de dato (int) en los
parmetros del constructor, pues antes tenia String y basicamente estamos omitiendo el int.
Para no cometer errores a la hora de cargar informacién, por
ejemplo, que se repitan Id se saltee un nlimero correlativo, Java
posee una manera de resolverlo de manera automatica, aqi
debemos implementar la palabra clave static.
Sabemos que, cuando se instancia una clase y crea los objetos, este
crea una copia de los atributos en cada uno de los objetos, lo que
implica que cada objeto recibe una copia diferente (aunque en aspecto
se parezcan). Para los efectos del ejercicio, este efecto pareciera no ser
es donde
el indicado, pues no querriamos que ambos empleados compartieran
el Id o algtin otro atributo. Es como vamos a conseguir que cada uno de
los objetos comparta una copia tinica de la variable Id, Esto lo hacemos
poniendo el modificador static delante de la variable.
Ahora vamos a deshacer todo lo hecho en el punto anterior, y
agregaremos al atributo Id el modificador static:
private final String nombre;
private String areaTrabajo;
public static int Id;
[Link]ees JAVA Vol. I
Podemos ver que el IDE pone nuestra variable Id en cursiva, esto se
debe a que se ha convertido en una variable de clase. Ahora, en el
constructor, vamos a asignar que Id
Id =1;
Si ejecutamos el programa, notamos que, para ambos empleados, va
a dar el mismo Id (1). Esto es muy sencillo de solucionar, usaremos un,
incrementador y lo vamos a colocar en:
System. out .print In (empleadol .devuelveDatos ()) ;
[Link];
System. out .print in (empleado2 .devuelveDatos ()) ;
[Link]+;
[Link]++ lograra que el Id de cada empleado aumente de a uno
en uno. Hasta aca funciona de la manera esperada, pero aqui tenemos
dos situaciones y es donde entra en escena la encapsulacién, puesto
que le habiamos puesto public a la variable Id (solo para que esto
funcionara), pero, para efectos de buenas practicas, esto no deberiamos
hacerlo. El otro problema es que hay que incrementar en forma manual.
Al cambiar el modificador de acceso de public por private,
automaticamente saltan los errores de acceso a los miembros.
En principio crearemos una variable auxiliar a la que
lamaremos IdSiguiente, que implementaremos de la siguiente
manera en el constructor:
public Empleado(string nom) (
nombre = nom;
Trabajo = “RRER";
Id =1dSiguiente;
Idsiguientest;
Luego, en el getter también debemos colocarlo:
[Link] 93. ELEMENTOS ESENCIALES DE LA POO. Eas
private int Id;
private static int IdSiguiente
Notemos que le hemos asignado un valor inicial de 1, esto se debe
ala indexacién, asi el primer Id no empieza en 0. Ahora, cuando
ejecutemos el programa, nos mostrara lo siguiente
El nombre es: Juan el 4rea es RRHH y el ID: 1
E1 nombre Rot
el 4rea es RRHH y el ID: 2
El nombre es: Alberto el 4rea es RRHH y el ID: 3
Y ya no tenemos que preocuparnos de hacer el incremento cada vez
que incorporemos un nuevo empleado.
ATRIBUTOS OBJETOS
PSU a Cea wey
SR ec CO ea a ace
private int Id;
SNe eee eat eC eur ut ema ge pe
Dana SUC aur
MH private String areaTrabajo; DSCC ce
Srna uaa
Figura 6. Grafico del funcionamiento del static en Java. Notamos que cada instancia de objeto
crea copia de los atributos de la clase (variables).
80
[Link]aes JAVA Vol. I
METODOS STATIC
Este tipo de métodos pertenecen solo a la clase y no a un objeto, para
lamarlo no podemos utilizar ningiin objeto y solo tiene acceso a los
atributos static de la clase, por lo cual no es necesario instanciar un
objeto para invocarlo. La sintaxis de los métodos static es la siguiente:
[Link] ()
Veamos, sobre el ejemplo anterior, como podemos implementar este
tipo de métodos en Java. Dentro de la clase Empleado vamos a crear el
siguiente método:
public static String darIdsiguiente(){
return “El ID siguiente es : “+ IdSiguienté
)
E] método static obligatoriamente tendra un return y regresara, en
este caso, un atributo de la clase. Otro detalle importante es que
los métodos de esta indole no acceden a los campos de clase (sean
constantes o variables), sino que acttian sobre IdSiguiente que es
estatico. Para verificar esto realicemos el siguiente cambio:
public static String darIdSiguiente(){
return “El ID siguiente es : “+ Td;
Vemos que Id es una variable de campo non-Static, y,
automaticamente el IDE nos mostrar el siguiente error:
Exception in thread “main” [Link]:
Uncompilable source code - non-static variable Id cannot be
referenced from a static context
[Link] 813. ELEMENTOS ESENCIALES DE LA POO. oa
Para continuar, en el main vamos a trabajar con la salida de
informacion:
‘System. out .print1n (empleadol .devuelveDatos ()+”\
n” +empleado2 . devuelveDatos ()+”\n”+empleado3 .
devuelvepates ()+”\n") ;
System. out .print In ([Link].
Como vemos, hemos trabajado sobre la clase ya que el método, al
ser estatico, no permite trabajar sobre objetos instanciados.
=
S96 seg|resiasieaias
3 Enpleado empleado3 ~ new Empleado(~Albert2")s
aa
2 [Link]([Link] vedatos()+"\n" sempleado2 .devuelvepatos()"
2 ‘[Link]()+"\n")3
f| @ [Link]émpleado.,
fa 15
16 Pelaes
” )
is) }
IS| 25 lass empleado(
2 public enpleado(string nox)(
2 nobre = noms
2 areatrabaje = "Res
2 1d =rdsiguiente;
25 rasiguienters;
26 )
2 public void eanbéaarea(string arearrabajo)(/ Ser"
[Link] = areatrabajo;
Figura 7. En a imagen podemos ver que solo al escribir a clase nos muestra el método esttico, ya que
cconceptualmente estos métodos no trabajan sobre los abjetos
Métodos estaticos de la API
Cuando trabajamos con clases de la API de Java y utilizamos algunos de
sus métodos, sin darnos cuenta también lo hacemos con los llamados
métodos estaticos. Por ejemplo, con la clase Math. Veamos como:
82 [Link]os JAVA Vol. I
public class CalculosBasicos(
Math. sqrt (9); //Halla 1a raiz cuadrada de 9
[Link](2,3); //Halla 1a potencia de 2 elevado al cubo
En esos ejemplos observamos que los dos métodos, tanto sqrt como
Pow, son estaticos, pues actdan sobre una clase (Math) y no sobre objetos.
Method Summary
ieee I
‘Moar an Tree Matos and Deseiion
Figura 8. La API de Java en la clase Math. Verificamos que todos los métodos que pertenecen a
esta clase son del tipo static y que pueden devolver un int, float, double o long.
Alias de tipos
En Java, no podemos definir alias de tipo en un nivel superior, pero podemos
hacerlo por el alcance de una clase, o un método. Consideremos esto con los
nombres de Integer, Long, si le ponemos nombres mas cortos: ly L.:
class Test {
void x(l i, L1){
[Link]( [Link]() + “, “ + LlongValue()); }}
[Link] 833. ELEMENTOS ESENCIALES DE LA POO. ees
El método main
Otro método static, que trabajamos desde el comienzo, es el mai
sintaxis es la siguiente:
public static void main(string{] args) (
instrucciones...
El contenido de la instruccién es publie, para que su contenido pueda
ser utilizado dentro de la clase y de otras; void, pues no retorna ningiin
valor y, finalmente, static ya que este método no acta sobre ningtin objeto
y, cuando empezamos a utilizarlo, no hay ningiin objeto construido, de
hecho es este método el encargado de construir algin objeto.
Por otro lado, este método recibe parametros, para ser exactos un
array (llamado args) de tipo String.
SOBRECARGA
DE CONSTRUCTORES
Sabemos que un constructor es un método que le va a dar una instancia
inicial a los objetos. Debemos entender que las declaraciones de
las clases pueden tener versiones alternativas de constructores 0
métodos, que proporcionen varias maneras de llevar a cabo una tarea
en particular mediante diferentes conjuntos de parametros. A esto
que lo llamamos sobrecarga de un constructor o constructores
multiples (se puede crear un niimero grande de ellos, no hay limite).
Veamos el ejemplo de UsoEmpleado para entender como podemos
sobrecargar métodos. En principio, recordemos que ya teniamos un
constructor al que le pasamos algunos parametros’
public Empleado(String nom, double sue, int afio, int mes,
int dia) (
84 [Link]aes JAVA Vol. I
Plantearemos un caso en el que ingresa un nuevo empleado del
que solo conocemos el nombre. Sabemos que, si no le colocamos los
pardmetros a un método, no podemos darles un estado inicial a los
objetos que construyamos, porque nos daria un error. Entonces vamos
a sobrecargar el método, para que le dé un estado inicial a algiin
atributo; esto lo haremos dentro de la clase Empleado:
//sobrecarga de constructores
public Empleado(String nom) {
nombre = nom;
Observamos que hemos pasado tan solo un pardmetro, pues es
solo ese valor el que conocemos. Ahora vamos a la clase principal
(donde esta el main) ¢ instanciaremos a un nuevo objeto. Notemos
que nos va a sugerir qué constructor es el que necesitamos (de los
dos que tenemos):
Empleado[] misEmpleados = new Empleado[4];
misEmpleados[0] = new Empleado (“Juan Pérez”, 15000,
2000, 03, 18);
misEmpleados [1]
12000, 2003, 05,22);
misEmpleados[2] = new Empleado ("Martin de Robertis”,
16000, 1998, 10,30);
misEmpleados[3] = new Empleado("José Coronado"); //
nuevo objeto pero con distinto constructor
new Empleado (“Marta Rodriguez”,
EI Ultimo empleado que ingresamos tiene un solo parémetro, pues
pertenece al método que acabamos de crear, y recordemos que solo va
admitir un tnico argumento, en caso contrario nos marcaria error.
‘Vamos a ejecutar el programa y nos mostrara lo siguiente:
Nombre: José Coronado Sueldo: 0.0 Fecha Ingres
null
[Link] 853. ELEMENTOS ESENCIALES DE LA POO. eas
Hasta acd, como no teniamos informacién acerca del sueldo ni de
la fecha de ingreso del empleado José Coronado, nos dara sueldo 0.0 y
fecha null.
Recordemos que la fecha no era un tipo primitivo, sino una variable
de objeto (Date), por eso nos dara como resultado un null
Nos preguntamos qué pasaria si, en vez de obtener ese tipo de
resultados inciertos para los empleados de quienes no tengamos
suficiente informacién, nos diera algo predeterminado (por ejemplo, un
sueldo minimo y una fecha base):
//sobrecarga de constructores
public Empleado (String nom) {
// nombre = nom;
this (nom, 8000,2000,01,01); // llama al otro
constructor
[Fie aa Ta Tae a ani a ein Tan ro Ve
SEES OC euew TB bBo:
H B-/Q6ec|?eeiageuias
i
fe pleadon
lf 1 t
H nt u
fe * | Feet us
le] 2 nisempleados[e] = new enpleado ("Duan Pére:", 15000, 2000, @3, 18)
24 inistmpleados(1] = new Empleado ("Wart Rodrigues”, 12000," 2003, 85,22)3
2 inistmpleados[2] = new empleado ("hartin de Roberts", 16000, 1998, 10,30)3
°
23 )
30
a
2 fe ns
3
» for(Empleado e: mistmpleados){ suai:
35 [Link]("honbre: " + [Link]()+ " sueldo: " +
Figura 9, Cuando instanciamos Empleado en el cédigo, el IDE nos sugiere a los dos constructores,
entonces, debemos elegir con cuantos datos contamos para cargarle la informacién necesaria.
86 [Link]HERENCIA
La herencia es una de las caracteristicas mas sobresaliente en el
paradigma orientado a objetos, pues va a permitir que una clase
herede los atributos y los métodos de otra clase, esto significa que
podremos reutilizar cédigos. Con la herencia, las clases tienen un
sistema de jerarquias, en consecuencia, cada una de ellas presenta una
superclase, llamada también clase padre 0 clase base y, a su vez,
puede tener subclases, denominadas clases hija o clases extendidas.
Un dato para tener en cuenta es que, en Java, cada clase puede tener
solo una clase padre (herencia simple), y las clases hijas podrian
tener sus propios atributos y métodos, ademas de los heredados; estos
a su vez pueden ser modificados.
JERARQUIA DE HERENCIA
FIGURA 2D FIGURA 3D
oe ee Oe ee
Ce Cu eee LC SLCC
Figura 10. Con este grafico podemos darnos una idea de la existencia de jerarquias de herencia
en Java a través de las figuras geométricas de 2 y 3 dimensiones.
Traslademos este concepto a la vida real, imaginemos que alguno
de nosotros heredaramos, por ejemplo, una casa, en el supuesto caso
que esta tuviera una deuda, también la heredariamos y, de hecho,
deberiamos hacernos cargo de ella.
En este momento es necesario que utilicemos el proyecto POO que
contenia las clases Auto y Uso_Auto. Para utilizar la herencia y entender
como funciona este concepto, crearemos una clase nueva, que sera
[Link] 873. ELEMENTOS ESENCIALES DE LA POO. ees
Furgoneta, ya que este tipo de automovil, a simple vista, no posee las
caracteristicas de los coches normales, pero si comparte algunas de
ellas, como las ruedas, las puertas, el motor, el peso, el color, etcétera
Ademias, presenta caracteristicas propias que un coche no tiene, por
ejemplo, una capacidad de carga superior o que puedan viajar mas
personas. A esto lo llamaremos caracteristicas extras (atributos)
que el objeto furgoneta presentara.
Necesitamos crear la clase Furgoneta, que tendra ciertos
atributos que ya vimos en la clase Auto, es decir, que van a
ser compartidos, y ademés otros propios. Haremos que esta
clase herede, de la clase Auto, alguna de sus caracteristicas, asi
ahorramos la necesidad de co
y, Con esto, aplicamos el término de reutilizacion de cédigo.
Ahora hay que agregar que no solo heredaremos atributos, sino
también métodos (si tiene aire acondicionado, asientos normales 0
de cuero, etcétera).
Para crear una nueva clase, debemos hacerlo desde el paquete
abierto, como dijimos antes, se llamara Furgoneta:
ificar cosas que ya teniamos hechas
package poo;
i
* @author Carlos Arroyo
”
public class Furgoneta(
La primera linea es el paquete al que nos referiamos (poo), luego estan
los comentarios (datos del autor en este caso) y el nombre de la clase.
Para que esta clase herede de otra, debemos agregarle la palabra
reservada extends después de la clase y, luego, el nombre de la clase
padre (Auto):
public class Furgoneta extends Auto{
88 [Link]aes JAVA Vol. I
Si hablamos de jerarquias, la clase Auto es una superclase, y la
clase Furgoneta se acaba de convertir en una subclase.
Yendo un poco mas a fondo en este concepto, la clase Furgoneta tendra
atributos y métodos propios, ademas que va a heredar de la clase padre
otros. Sin embargo, una subclase no puede heredar de otras clases, aunque
en la vida real esto pueda suceder, en POO en Java no existe la herencia
multiple, concepto que si existe en otros lenguajes de programacién.
Ahora empezamos a codificar nuestra nueva clase:
public class Furgoneta extends Auto(
private int capacidadcarg:
private int asientosExtra;
public Furgoneta(int asientosExtra, int
capacidadcarga) { //constructor de 1a cl
super(); //llama al constructor de la
superclase>Auto
this.
apacidadCarga = capacidadCarga;
this asientosExtra = asientosExtra;
En principio hemos creado dos atributos propios de la clase
Furgoneta, de la misma manera los encapsulamos usando private.
Herencia multiple
En el paradigma orientado a objetos existe la posibilidad de heredar caracteristicas
y comportamientos de una clase a otra, sin embargo, esto solo se puede hacer
desde una tnica clase, a esto lo llamamos herencia simple. En Java no existe
la herencia multiple, es decir, que una clase pueda heredar atributos y métodos
de varias clases, esto si sucede en otros lenguajes, como C++. Pero, a cambio,
dispone de la construccién denominada Interface, que permite una forma de
simulacién o implementacién limitada de la herencia multiple.
[Link] 893. ELEMENTOS ESENCIALES DE LA POO. ees
Luego escribimos el método constructor de la clase y le pasamos dos
parametros (con los mismos nombres de los atributos).
Debemos tener en cuenta que super() es una palabra reservada que
significa que va a llamar al constructor de la clase padre. Luego, vamos
a crear los this de cada uno de los argumentos ya que nos indicara que
el elemento al que hace alusién se encuentra en la misma clase, es
decir, que les esta dando un estado inicial a las dos variables; ademas,
vemos que se repiten los mismos valores luego del signo igual, a los
que no hay que confundir, veamos:
[Link] = capacidadCarga;
El primero pertenece a la variable de la clase, mientras que el
segundo corresponde al argumento del constructor de la clase. Hay
que decir que se pudo haber omitido el this dandole un nombre distinto
a los argumentos. A esto le agregaremos un método getter:
//GETTER
public String datosFurgoneta() {
return " La capacidad de carga
capacidadCarga +” kg. “+ “ y los lugares son: * +
asientosExtra;
d
El método getter retornara un String con los valores de la capacidad
de carga y concatenamos con los asientos extras que tenga el vehiculo.
Antes teniamos una clase llamada Uso_Auto, sin embargo, para evitar
confusiones, le vamos a cambiar el nombre por el de Uso_Vehiculo, pues
hemos agregado una clase Furgoneta. Esta accion también se puede
hacer con las teclas Ctrl +R.
Una vez dentro de la clase Uso_Vel
lo, escribiremos el siguiente cédigo
Auto miAutol = new Auto();
miAutol .estableceColor (“Azul”) ;
90 [Link]aes JAVA Vol. I
Furgoneta miFurgol= new Furgoneta();
Notemos que, en la tercera linea, surge un error; si observamos en
el marcador, que nos da sugerencias y errores, veremos indicado que
faltan argumentos y, de hecho, dos del tipo enteros (int), recordemos
que en la clase Furgoneta el constructor tenia dos argumentos.
Corrijamos de la siguiente forma:
Furgoneta miFurgol= new Furgoneta (8,600) ;
Entonces 8 es la capacidad extra de asientos y 600 la capacidad de
carga. Ahora pasaremos al nuevo objeto miFurgol algunos estados 0
métodos:
miFurgol .estableceColor (“blanco”) ;
miFurgol .estableceAsientos ("si");
miFurgol .configuraAire ("Si");
Cuando escribimos el objeto instanciado y el punto, el IDE nos
propone una cierta cantidad de atributos y métodos, pero esta vez,
al ser una clase que hereda de otra, también se veran los de la clase
padre, es decir, de Auto.
Y este es el punto al que queriamos llegar, la gran ventaja de la
herencia, la reutilizacién de cédigo, ya que no hemos tenido la
necesidad de programar de nuevo.
Sobrecargas de métodos
El lenguaje Java no permite que dos métodos sean “equivalentes de anulacién”
dentro de la misma clase, independientemente de sus clausulas potenciales 0 tipos
de devolucién potencialmente diferentes.
[Link] 13. ELEMENTOS ESENCIALES DE LA POO. Ss
[bch Kater Yr Ainvge Foe Revue Greer Depo rie Tear Heroes Werte Ade
Beas OO sere TB D--@
=
Be
sey © cantidad_ruedas() string
ee re ting aircon) ell
q| 5 public © datosFurgoneta() string
ils 1 @equals(object obj) boolean
2/10 syster| @estableceasientos(string asientoscuero) void 1
fee aa) Wd @establececolor(string color_auto) void
12 itd @ getclass() Classe?» =) rien
$33 ‘@hashcode() int
li] 24 tc @notify() void) *r
15 @notifyAll() void
Wi en nie
Hew systes] @ precioauto() int, pia
le 38 © tipoasientos() string
19 auto mi otostring() string
20 miautol © uncolor() string
a Furgone 0 wait() void ~
2 mifurgon.
gl}
" 3
Figura 11. En esta imagen se muestra que, al poner el punto luego de escribir el objeto
instanciado, los atributos y los métodos tanto de Furgoneta como de Auto también serdn visibles.
En la clase Auto agregaremos un getter (luego de los atributos):
public String datosGenerales(){ //Getter
return “La plataforma del vehiculo tiene “+ ruedas
+” ruedas’#”, mide: “+ largo/1000+ * mts con un ancho de: “+
anchot” cms y un peso de plataforma de “ + peso_plataformat * kg.
d
Este getter en si tiene como datos generales ciertos estados de la
clase Auto, pero al usar la herencia cuando hagamos el objeto miFurgol
invocamos el getter, veamos lo que sucede:
System. out .print1n(miFurgol .datosGenerales());
Cuando lo ejecutamos obtenemos lo siguiente:
La plataforma del vehiculo tiene 4 ruedas, mide: 2 mts
con un ancho de: 300 cms y un peso de plataforma de 600 kg.
92 [Link],JAVA Vol. I
Entonces, por la herencia, nos traerd caracteristicas propias de la
clase Auto (que tiene 4 ruedas, el largo y el ancho), en consecuencia,
arraigara esas caracteristicas para si. Ahora traeremos los datos propios
de la furgoneta, para ello lo vamos a concatenar con el cédigo anterior:
System. out .print1n ([Link]()+ miFurgol.
datosFurgoneta ()) ;
Esta vez la salida, luego de la ejecucion, seré la siguiente:
La plataforma del vehiculo tiene 4 ruedas, mide: 2 mts
con un ancho de: 300 cms y un peso de plataforma de 600 kg.
La capacidad de carga es: 600 kg. y los lugares s:
Por otro lado, si queremos ingresar los métodos al objeto de clase
miAutol y colocamos el punto para verificar qué tipo de métodos nos
sugiere el IDE, verificamos que no aparece ninguno de los métodos propios
de la clase Furgoneta, y esto es l6gico, ya que son métodos propios de ella,
por lo tanto, el otro objeto no los podria ver y mucho menos invocar.
TS Te Tine Fare FRR TR Ta EE To aR TTT
BES OC emo 1 TB D-H-G-
rol meted Fugen)
‘Rikon ventional stpehuezol= new Furgoneta(#,600) ;
2 vametonmrveunse Pcecovor("blanco”);
aS ceasientos ("si");
24 net musi ranire("Si");
e ‘System. out println(miauto1 .datosfurgoneta()) 5
26 system. [Link]([Link]()+ [Link]())
27
28 }
Figura 12. En la figura se veriica que, a pesar de que el método datosFurgoneta() de la
clase Furgoneta fue invocado por el objeto miAutol, este dara error.
[Link] 33. ELEMENTOS ESENCIALES DE LA POO. ees
Regla de diseno
Esta regla consiste en aplicar el término “Es un...
clases. En el ejemplo tenemos que la clase Furgoneta hereda de la clase Auto:
anuestro disefio de
public class Furgoneta extends Auto{
Segtin esta regla, nos preguntamos: "Una furgoneta es un auto?’
Y claramente la respuesta es No. Pues una furgoneta es un tipo de
vehiculo; en cambio, un vehiculo no siempre es una furgoneta.
Para concluir: pudimos haber programado una clase mas bien
general llamada Vehiculo de la cual van a heredar caracteristicas el resto
de las clases. A esto lo llamamos “hacer una planificacion correcta de
nuestros programas”.
VEHICULO
[a a ee
areata c-] Camion
Figura 13. La figura nos muestra la herencia y cémo deberia respetarse la regla de su disefio.
EL POLIMORFISMO
Este término esté muy ligado en Java al concepto de herencia, nos dice
que podemos programar de una manera mas general en vez de una
forma especifica, esto nos permite escribir programas que procesen
objetos que compartan la misma superclase, de una manera directa
© indirecta, como si todos fueran parte de ella, simplificando de esta
forma enormemente la programacién de objetos.
94 [Link]ea JAVA Vol. I
Veamos un ejemplo de la vida real para comprender este concepto
tan abstracto. Supongamos que queremos programar varios tipos de
vehiculos: un automévil, un vehiculo que va por agua-tierra (anfibio) y
otro que, a la vez, despliegue alas y logre volar. Todos estos vehiculos
en si pueden tener tanto comportamientos propios y distintos como
comportamientos en comiin, por ejemplo, el de moverse.
Esto lo programaremos en la superclase Vehiculo. Cuando enviamos
el mensaje mover, cada vehiculo sabe como hacerlo, puesto que
fue programado para eso. Nosotros confiamos en que lo hacen,
independientemente de cémo lo hagan. Esta respuesta al mismo mensaje
de cada uno de los tres objetos es el concepto clave del polimorfismo,
pues este mismo mensaje tiene diversas formas de resultados.
Veamos un caso para poder implementar este concepto, para
ello trabajaremos sobre el ejemplo de Uso_Empleado, pero esta vez
crearemos una clase mas que se lamara Jefe. Esta clase sera una
subclase de Empleado. De tal forma que implementaremos de una
manera correcta el uso de la herencia. Nos hacemos la pregunta: “{Un
Jefe es un empleado? La respuesta es si. Ahora lo hacemos al revés:
“Un empleado es un jefe?". La respuesta es no siempre, entonces,
vamos a dejar que la clase Jefe sea una subclase de Empleado.
Je!
public cla: extends Empleado(
public Jefe(String nom, double sue, int afio, int mes,
int dia){
super(nom, sue, afio, mes, dia);
En el c6digo de la clase Jefe, que va a heredar de la clase Empleado,
le creamos un constructor con cinco argumentos, luego, en super
colocaremos también cinco arguments.
Crearemos un campo de clase a la que llamaremos incentivo,
recordemos que para el ejemplo solo los jefes recibiran un incentivo:
private double incentivo; //campo de clase
Ahora un setter para que reciba el parametro con el valor que le
pasemos por el incentivo:
[Link] 953. ELEMENTOS ESENCIALES DE LA POO. Eas
public void ganaIncentivo (double m){ //SETTER
incentivo = m;
Le pasamos a la variable incentivo el parametro m que habiamos
pasado por argumento en el setter. Un tema que no podemos olvidar es
que, si bien en la clase Jefe es posible heredar el sueldo del empleado,
en la practica esto no sucede asi. Aqui debemos sobrescribir el método
unSueldo() que es el que nos va traer el sueldo heredado:
public double unSueldo(){
double sueldoyefe = unSueldo();
return sueldoJefe + incentivo;
Sobrescribimos el método y adentro le cargamos informacion propia
de la clase Jefe. El IDE nos marcara que estamos sobrescribiendo el
método y que escribamos @Override antes del método sobrescrito, a
manera de sugerencia
Si nos localizamos en la otra clase, también existiré una marca ala
altura del método public double unSueldo(), que nos advierte que este
método se encuentra redefinido. Por lo tanto, en la clase donde lo
sobrescribimos, invalida al método de origen.
(Spe asagnSSSNN SOS
SESS OC sue Tw HO
eo
[elon @G-5- QS Pealeee aaenks
acKage Eepreado;
public class 2efe extends empleado{ Figura 14. El
public aefe(string non, double sue, int ato, int mes, int diay{ | IDE nos sefiala en
{ super(nen, ste, aho, mes, da);
los marcadores
1 pbb que estamos
12 | iene me sobrescribiendo
: tun método y
nos sugiere que
escribamos @
Override,
% [Link].com_eS JAVA Vol. I
Ahora corregiremos algo que no esta bien del todo en el cédigo en
el que hemos trabajado. Al sobrescribir un método de otra clase, no se
garantiza que traiga los elementos que requerimos, porque le pedimos
que almacene en sueldodefe lo que devuelve el método unSueldo. Deberia
quedar de la siguiente forma:
double sueldoJefe = [Link]();
Al utilizar super le decimos que no llame al método de la clase Jefe,
sino al de la clase padre.
En la clase Uso_Empleado escribiremos el cédigo para instanciar el
nuevo objeto de uno de los jefes, en este caso un jefe de RRHH:
Jefe jefeRRHH = new Jefe ("Manuel
Ferndndez”, 50000, 1998, 04,21);
Je feRRHH. ganaIncentivo (6000) ;
Empleado[] misEmpleados = new Empleado[5];
Una vez instanciado, le cargamos el método ganalncentivo() con un
valor double. Y luego, como habiamos trabajado con arrays, debemos
agregar un indice més (5). Ahora es cuando entra en escena el concepto
de polimorfismo:
; //polimorfismo
Opera el principio de sustitucién, porque el objeto espera un
objeto del tipo Empleado, sin embargo, estamos poniendo un objeto de
tipo Jefe, con lo que utilizamos un objeto de la subclase aun cuando el
programa espere a uno de la superclase. Agreguemos un elemento mas
Referencia a Superclase
Cuando referenciamos a una superclase, lo podemos hacer de una manera
polimérfica a cualquier método declarado en la superclase y sus superclases. Una
variable de un tipo de interfaz debe hace referencia a un objeto para llamar a los
métodos y a todos los objetos de la clase Object.
[Link] 73. ELEMENTOS ESENCIALES DE LA POO.
en el array [6], de tal forma que lo instanciemos e inicialicemos en una
1ea de cédigo, el programa no deberia mostrar un error:
misma
misEmpleados[5] = new Jefe("José Lépez”, 66000,
2001, 10,27);
Recordemos que habiamos utilizado un foreach para que hiciera el
recorrido por el array:
for(Empleado e: misEmpleados) {
@. aumentaSueldo (10) ;
?
for(Empleado e: misEmpleados) {
System. out .print1n(*Nombre:
[Link]()+ “ Sueldo: * +
[Link]() + “ Fecha Ingreso: “+
[Link]());
d
Aqui es donde se ve la potencia del polimorfismo, puesto que la
variable e pertenece a la clase Empleado, para el ejemplo nuestro los
empleados no tienen incentivo; pero cuando ejecutamos el programa:
Nombre: Manuel Fernéndez Sueldo: 61000.0 Fecha Ingreso:
Tue Apr 21 [Link] GMT-03:00 1998
Al sueldo base de 50.000 le agregamos un 10% (5000) y le sumamos
un incentivo de 6000: esto nos dara 61000.
Descendentes y ascendentes
Es importante considerar que cuando realizamos la tarea de asignar una variable
de la superclase a una variable de la subclase (sin una conversién descendente
explicita) veremos que se provocaré un error de compilacién. Por esta razon
debemos poner atencién a este tipo de asignacién.
[Link]aes JAVA Vol. I
Esto quiere decir que el programa se da cuenta de que el empleado
Manuel Fernandez viene de la clase Jefe y le aplica el incentivo que solo
tiene esa clase. Es decir, la variable e se comporta de una u otra forma,
de acuerdo con el lugar de donde venga el objeto al que le envia el
mensaje, esto se denomina enlazado dina:
0, es decir, la forma
como la maquina virtual de Java entiende y decide a quién enviarle un
mensaje A y a quién enviarle un mensaje B.
=’ RESUMEN CAPITULO 03
En este capitulo profundizamos en algunos aspectos de la programacion
orientada a objetos, trabajamos con la colaboraci6n entre clases y la
manera en que ellas se comunican a través de mensajes (métodos);
aprendimos a construir objetos, trabajamos con el uso de constantes
y final. También revisamos el uso de static y los métodos estaticos,
conocimos los distintos constructores y la sobrecarga de métodos en sus
distintas versiones. Finalmente vimos la herencia y el polimorfismo,
[Link] 93. ELEMENTOS ESENCIALES DE LA POO oes
Actividades 03
Test de Autoevaluaci6n
1, SOBRE EL AUTOR > [Link]
Carlos Arroyo Diaz es programador, escritor y RedUSERS PREMIUM la ne
contenidista especializado en tecnologias yeducacién. biblioteca digital de USERS. | —=—=—=—=—=">
Se ha desemperiado como consutor técnica en INET, _Acnederds a cients de
yactualmente trabaja como mentor docente en el area _publicaciones: Informes;
de Programacion en varios proyectos del Ministerio de eBooks; Gufas; Revistas;
Il
Educacién de la Ciudad Auténoma de Buenos Aires. Cursos. Todo el contenido esta ~
ésponibleonine -otiney ——?
> RedUSERS para cualquier dispositive. | 5 ey
En nuestro sitio podra encontrar noticias relacionadas y participar Publicamos, al menos, una >=
de la comunidad de tecnologia mas importante de América Latina, novedad cada 7 dias.