2.1 DECLARACIÓN DE CLASES: ATRIBUTOS, MÉTODOS, ENCAPSULAMIENTO. La declaración de una clase define la estructura de la misma. Dicho de otra forma, la declaración de una clase informa de los elementos que la conforman. Posteriormente a ser declarada, una clase debe ser implementada convenientemente, es decir, se debe de be es escr crib ibir ir el có códi digo go co corr rres espo pond ndie ient ntee a lo loss pr proc oced edim imie ient ntos os y fu funci ncion ones es qu quee determinan el funcionamiento de esa clase. Las clases se declaran en la sección TIPO del script pues las clases son, al fin y al cabo, tipos de datos. La programación orientada a obetos se basa en la programación de clases! a diferencia de la programación estructurada, que est" centrada en las funciones. #na clase es un molde del que luego se pueden crear m$ltiples obetos, con similares caracter%sticas. #naa cl #n clas asee es un unaa pl plan antitillllaa &m &mol olde de', ', qu quee de defifine ne at atri ribu buto toss &v &vari ariab able les' s' y m( m(to todo doss &funciones' La clase define los atributos y m(todos comunes a los obetos de ese tipo, pero luego, cada obeto tendr" sus propios valores y compartir"n las mismas funciones. Debemos crear una clase antes de poder crear obetos &instancias' de esa clase. )l crear un obeto de una clase, se dice que se crea una instancia de la clase o un obeto propiamente dicho. Tipos de atributos. Obetivos* a' Profundi+ar en el concepto de atributo de una clase e indicar indicar los tipos de atributos en ava b' Interpretar el código fuente de una aplicación ava donde donde aparecen distintos distintos tipos de atributos c' -o -ons nstr trui uirr un unaa ap aplilica caci ción ón a ava va se senc ncililla la,, co conv nveni enien ente teme ment ntee es espec pecifific icad ada, a, qu quee emplee clases con diferentes tipos de atributos. Los at Los atri ribu buto tos, s, ta tamb mbi( i(nn llllam amad ados os da dato toss o va vari riab able less mi miem embr broo so sonn por porci cion ones es de información que un obeto posee o conoce de s% mismo. #na clase puede tener
cualquier n$mero de atributos o no Tener ninguno. e declaran con un identificador y el tipo de dato correspondiente.
/odificador public protectec private pac5age
0isibilidad P$blica &1' Protegida 2 en la herencia&3' Privada&4' De paquete &6'
Métodos. ava como todo lenguae de programación orientado a obetos utili+a los llamados m(todos. ) continuación veremos cómo se crea un m(todo y como se utili+an. e podr%a decir que e7isten 8 grandes tipos de m(todos, el primer tipo de m(todo son m(todos que reali+an procesos, puedes reali+ar cualquier operación con ellos, sin embargo el propósito es manipular variables e7istentes. 9l segundo tipo de m(todos son los que reali+an un proceso o c"lculo, y calculan una variable espec%fica, un eemplo podr%a ser un m(todo para obtener el valor de una multiplicación. Los m(todos en ava pueden tener par"metros, es decir, que un m(todo puede utili+ar variables predefinidas para ser utili+adas en sus procesos. Encapsulamiento. -omo se puede observar de los diagramas, las variables del obeto se locali+an en el centro o n$cleo del obeto. Los m(todos rodean y esconden el n$cleo del obeto de otros obetos en el programa. )l empaquetamiento de las variables de un obeto con la protección de sus m(todos se le llama encapsulamiento. T%picamente, el encapsulamiento es utili+ado para esconder detalles de la puesta en pr"ctica no importantes de otros obetos. 9ntonces, los detalles de la puesta en pr"ctica pueden cambiar en cualquier tiempo sin afectar otras partes del programa. 9l encapsulamiento de variables y m(todos en un componente de soft:are ordenado es, todav%a, una simple idea poderosa que provee dos principales beneficios a los desarrolladores de soft:are.
Modularidad. esto es, el código fuente de un obeto puede ser escrito, as% como darle mantenimiento, independientemente del código fuente de otros obetos. )s% mismo, un obeto puede ser transferido alrededor del sistema sin alterar su estado y conducta. Ocultamiento de la información, es decir, un obeto tiene una ;interfa+ publica; que otros obetos pueden utili+ar para comunicarse con (l. Pero el obeto puede mantener información y m(todos privados que pueden ser cambiados en cualquier tiempo sin afectar a los otros obetos que dependan de ello. Los obetos proveen el beneficio de la modularidad y el ocultamiento de la información. Las clases proveen el beneficio de la reutili+ación. Los programadores de soft:are utili+an la misma clase, y por lo tanto el mismo código, una y otra ve+ para crear muchos obetos. 9n las implantaciones orientadas a obetos se percibe un obeto como un paquete de datos y procedimientos que se pueden llevar a cabo con estos datos. 9sto encapsula los datos y los procedimientos. La realidad es diferente* los atributos se relacionan al obeto o instancia y los m(todos a la clase.
2.2 INSTANCIACIÓN DE UNA CLASE. Podemos interpretar que una clase es el plano que describe como es un obeto de la clase, por tanto podemos entender que a partir de la clase podemos fabricar obetos. ) ese obeto construido se le denomina instancia, y al proceso de construir un obeto se le llama instanciación. -uando se construye un obeto es necesario dar un valor inicial a sus atributos, es por ello que e7iste un m(todo especial en cada clase, llamado constructor, que es eecutado de forma autom"tica cada ve+ que es instanciada una variable. >eneralmente el constructor se llama igual que la clase y no devuelve ning$n valor. )n"logamente, destructor es un m(todo perteneciente a una clase que es eecutado de forma autom"tica cuando un obeto es destruido. ava no soporta los destructores. 9s posible que e7ista m"s de un constructor en una clase, diferenciados sólo en los
par"metros que recibe, pero en la instanciación sólo ser" utili+ado uno de los constructores. 9emplo* clase base pac5age eemplo?de?libro! import ava.util.canner! public class /ain @
public static void main&tringAB args' @ canner entrada C ne: canner&ystem.in'! Libro-alificaciones miLibro-alificaciones C ne: Libro-alificaciones&'! ystem.out.println&;9scribe algo* ;'! tring nombreDel-urso C entrada.ne7tLine&'! ystem.out.println&'! miLibro-alificaciones.mostrar/ensae&nombreDel-urso'!
clase derivada pac5age eemplo?de?libro!
public class Libro-alificaciones @ public void mostrar/ensae&tring nombredelsaludo' @ ystem.out.printf&;Eienvenido al libro de calificaciones para *FnGsFn;, nombredelsaludo'!
2.3 REFERENCIA AL OBJETO ACTUAL. La utili+ación de THI en lugar de hacer referencia e7pl%citamente al obeto actual por su nombre &por eemplo, thisform.command.caption' hace que el código de programa pueda alternarse entre obetos, porque evita el nombre del obeto y encapsula autom"ticamente la clase primaria del obeto. THI permite hacer referencia a una propiedad o un obeto de una definición de clase. Los m(todos de un bloque de definición de clase pueden utili+ar THI para especificar una propiedad o un obeto que e7istir" cuando se cree la clase. Puesto que m$ltiples instancias de obetos comparten el mismo código de m(todo, THI siempre hace referencia a la instancia en la que est" eecut"ndose el código. i hay m$ltiples instancias de un obeto, y se llama a uno de los m(todos del obeto, THI hace referencia al obeto correcto. -ada obeto puede acceder a una referencia a si mismo mediante la palabra this. -uando se hace una llamada a un m(todo no static para un obeto especifico, el cuerpo del m(todo utili+a en forma impl%cita la palabra this para hacer referencia a las variables de instancia y los dem"s m(todos del obeto. )hora demostraremos el uso impl%cito y e7plicito de la referencia this para permitir al m(todo main de la clase PruebaThis que muestre en pantalla los datos pr%vate de un obeto de la clase Tiempoimple. Hicimos esto para demostrar que, al compilador un archivo .ava que contiene mas de una clase, el compilador produce un archivo de clase separado por la e7tensión .class para cada clase compilada.
22 9emplo This.java 22#so implicito y e7plicito de this para hacer referencia a los miembros de un obeto public class PruebaThis @ public static void main &tring argsAB' @
Tiempoimple tiempoCne: Tiempoimple&J, K, M '! ystem.out.println&tiempo.creartring&''! 22fin de main 22fin de la clase PruebaThis 22la clase Tiempoimple demuestra la referencia ;this; public class Tiempoimple @ private int hora! 2248K private int minuto! 224JM private int segundo!224JM 22si el constructor utili+a nombres de parametros identicos a 22los nombres de las variables de instancia, se reuiere la 22referencia ;this; para diferenciar unos nombres de otros public Tiempoimple &int hora,int minuto, int segundo' @ this.horaChora!22establece la hora del obeto ;this; this.minutoCminuto!22establece el minuto del obeto ;this; this.segundoCsegundo!22establece el segundo del obeto ;this; 22fin del constructor de Tiempoimple 22usa la referencia ;this; e7plicita e implicita para llamar tring#niversal public tring creartring&' @ return tring.format&;G8Ns*GsFnG8Ns*Gs;, ;this.atring#niversal&';,this.atring#niversal&', ;atring#niversal&';,atring#niversal&''! 22fin del metodo creartring 22convierte a tring en formato de hora universal &HH*//*' public tring atring#niversal&' @ 22;this;no se requiere aqui para acceder a las variables de instancia, 22ya que el metodo no tiene variable locales con los mismos 22nombres que las variables de instancia return tring.format&;G8d*G8d*G8d;, this.hora, this.minuto, this.segundo'!
22fin del metodo string#niversal 22fin de la clase Tiempoimple
2.4 MÉTODOS : DECLARACIÓN , MENSAJES , PASO DE PARÁMETROS, RETORNO DE VALORES. Los m(todos o funciones miembro se definen dentro de la clase a la que pertenecen y constituyen la interfa+ o forma de acceder a la estructura interna de los obetos es decir a los datos privados. Los m(todos definen cual son las operaciones que se pueden reali+ar con los atributos de los obetos de la clase. La eecución de un programa orientado a obetos consiste, en recibir, interpretar y responder unos obetos a los mensaes que env%an otros obetos. 9n P.O.O. un mensae est" asociado siempre con un m(todo, de manera que cuando un obeto recibe un mensae la respuesta a ese mensae es eecutar el m(todo asociado
• • •
•
Modo de acceso* 9spec%fica el tipo de acceso permitido indicando que usuarios de la clase podr"n acceder a ese m(todo, los m(todos son la $nica forma de acceso a los atributos privados. Por defecto los m(todos tienen protección paquete, es decir son accesibles desde cualquier clase que pertene+ca al mismo paquete. Todas las clases de un mismo fichero .ava pertenecen a un mismo paquete. Public* )ccesible desde cualquier otra clase. Pac5age* )ccesible sólo desde el mismo paquete. Protected* e comporta como un m(todo p$blico para los m(todos del mismo paquete o de las subclases y para el resto como un m(todo privado. Pr%vate* ólo accesible a trav(s de m(todos de la propia clase. Retorno de valores: #n m(todo puede devolver un valor a quien lo llama o no devolver nada. 9l valor devuelto por un m(todo puede ser de un tipo primitivo de datos o una referencia, pero nunca puede devolver m"s de un valor. 9l valor de retorno nunca puede ser un obeto de una superclase, s% de la misma clase o de una subclase. i el m(todo no devuelve nada el tipo devuelto por el m(todo es el tipo void.
Paso de parámetros a una función o método. Los par"metros de una función son variables locales que se iniciali+an en el momento de la llamada al m(todo. uera de la función no se conocen y no pueden ser accedidas. e crean al entrar en la función y se destruyen al salir de ella. 9l paso de par"metros o argumentos a las funciones se puede hacer de dos formas. Paso por valor , paso por referencia.
2.5 CONSTRUCTORES Y DESTRUCTORES: DECLARACIÓN, USO Y SUS APLICACIONES. Para crear un obeto se necesita reservar suficiente espacio en memoria e iniciali+ar los valores de los campos que representan el estado del obeto. 9ste trabao es reali+ado por un tipo especial de m(todo denominado constructor. Constructor #n m(todo constructor de una clase es un m(todo especial que* tiene el mismo nombre que la clase y no tiene tipo de retorno. La sinta7is para la declaración de un m(todo constructor es* AatributosB AmodificadoresB identificadorQ & Apar"metrosB ' Ainiciali+adorB @ 22 -uerpo del constructor. Donde* atributos &opcional' es información declarativa adicional, modificadores &opcional' se restringen a e7tern y a los modificadores de acceso, identificador es el nombre del m(todo constructor &igual al nombre de la clase', par"metros &opcional' es la lista de par"metros pasados al constructor, iniciali+ador &opcional'. -on el iniciali+ador, el constructor invoca previamente a otro constructor. 9l iniciali+ador puede ser uno de los siguientes* base&AlistaDePar"metrosB' this&AlistaDePar"metrosB' -uerpo del constructor es el bloque de programa que contiene las instrucciones para iniciali+ar la instancia de clase &obeto'. Destructor
La sinta7is para declarar un destructor es* A)tributosB 6 IdentificadorQ & ' @ 22 -uerpo del destructor. #na clase solamente puede tener un destructor. Los destructores no pueden heredarse o sobrecargarse, los destructores no pueden invocarse, sino que son invocados autom"ticamente, un destructor no acepta modificadores ni par"metros, por eemplo, la siguiente es una declaración de un destructor para la clase igura* 6 igura&' @ 22 Instrucciones para limpiar. a destrucción por defecto: Reco!ida de basura 9l int(rprete de ava posee un sistema de recogida de basura, que por lo general permite que no nos preocupemos de liberar la memoria asignada e7pl%citamente. 9l recolector de basura ser" el encargado de liberar una +ona de memoria din"mica que hab%a sido reservada mediante el operador ne:, cuando el obeto ya no va a ser utili+ado m"s durante el programa &por eemplo, sale del "mbito de utili+ación, o no es referenciado nuevamente'. 9l sistema de recogida de basura se eecuta periódicamente, buscando obetos que ya no est(n referenciados. a destrucción personali"ada: finali"e ) veces una clase mantiene un recurso que no es de ava como un descriptor de archivo o un tipo de letra del sistema de ventanas. 9n este caso ser%a acertado el utili+ar la finali+ación e7pl%cita, para asegurar que dicho recurso se libera. 9sto se hace mediante la destrucción personali+ada, un sistema similar a los destructores de -11. Para especificar una destrucción personali+ada se aRade un m(todo a la clase con el nombre finali+e.
2. SOBRECAR!A DE MÉTODOS. #n m(todo sobrecargado se utili+a para reutili+ar el nombre de un m(todo pero con diferentes argumentos &opcionalmente un tipo diferente de retorno'. Las reglas para sobrecargar un m(todo son las siguientes* •
Los m(todos sobrecargados deben de cambiar la lista de argumentos.
•
Pueden cambiar el tipo de retorno.
•
Pueden cambiar el modificador de acceso.
•
Pueden declarar nuevas o m"s amplias e7cepciones.
•
#n m(todo puede ser sobrecargado en la misma clase o en una subclase.
#eamos un método $ue se desea sobrecar!ar: public void cambiarTamano&int tamano, tring nombre, float patron'@ Los siguientes m(todos son sobrecargas legales del m(todo cambiarTamano&'* public void cambiarTamano&int tamano, tring nombre'@ public int cambiarTamano&int tamano, float patron'@ public void cambiarTamano&float patron, tring nombre' thro:s IO97ception@ Cómo invocar un método sobrecar!ado: Lo que define qu( m(todo es el que se va a llamar son los argumentos que se env%an al mismo durante la llamada. i se invoca a un m(todo con un tring como argumento, se eecutar" el m(todo que tome un tring como argumento, si se manda a llamar al mismo m(todo pero con un float como argumento, se eecutar" el m(todo que tome un float como argumento y as% sucesivamente. i se invoca a un m(todo con un argumento que no es definido en ninguna de las versiones sobrecargadas entonces el compilador arroar" un mensae de error. Seglas de la sobrecarga y sobreescritura de m(todos*
•
•
•
•
•
)hora que hemos visto ambas formas de reescribir m(todos, revisemos las reglas y diferencias entre ambos tipos de reescritura* %r!umentos* 9n un m(todo sobrecargado los argumentos deben de cambiar mientras que en un m(todo sobreescrito O deben cambiar. El tipo de retorno* 9n un m(todo sobrecargado el tipo de retorno puede cambiar, en un m(todo sobreescrito O puede cambiar, e7cepto por subtipos del tipo declarado originalmente. E&cepciones* 9n un m(todo sobrecargado las e7cepciones pueden cambiar, en un m(todo sobreescrito pueden reducirse o eliminarse pero O deben de arroarse e7cepciones nuevas o m"s amplias. %cceso* 9n un m(todo sobrecargado puede cambiar, en un m(todo sobreescrito el acceso O debe de hacerse m"s restrictivo &puede ser menos restrictivo'. %l invocar* 9n un m(todo sobrecargado los argumentos son los que determinan qu( m(todo es el que se invocar", en un m(todo sobreescrito el tipo de obeto determina qu( m(todo es elegido.
Ejemplo : clase base pac5age sobre5arga!
public class /ain @
public static void main&tringAB args' @ 22 TODO code application logic here articulo obarticuloCne: articulo&'! obarticulo.fiarprecio&;U;'! obarticulo.mostrarprecio&'!
edad obedadC ne: edad&'! obedad.poneredad&'! obedad.mostraredad&'!
Clase articulo pac5age sobre5arga! public class articulo @ private double precio! public void fiarprecio&'@ precioCJ.J! public void fiarprecio&tring precio'@ ystem.out.println&;o es un valor;'! public void fiaprecio &double precio'@ this.precioCprecio! public void mostrarprecio&'@ ystem.out.printf&;precio es G.8f;,precio'! ystem.out.println&'! Clase edad pac5age sobre5arga! public class edad @ private int edad! public void poneredad&'@ edadC 88! public void poneredad&tring edad'@ ystem.out.println&;no es una edad;'!
public void poneredad&int edad'@ this.edadC edad! public void mostraredad&'@ ystem.out.printf&;la edad es * Gd ;,edad'! ystem.out.println&'!
2." SOBRECAR!A DE OPERADORES: CONCEPTO Y UTILIDAD, OPERADORES UNARIOS Y BINARIOS. La sobrecarga de operadores es la capacidad para transformar los operadores de un lenguae como por eemplo el 1, 4, etc, cuando se dice transformar se refiere a que los operandos que entran en uego no tienen que ser los que admite el lenguae por defecto. /ediante esta t(cnica podemos sumar dos obetos creados por nosotros o un obeto y un entero, en ve+ de limitarnos a sumar n$meros enteros o reales, por eemplo. La sobrecarga de operadores ya era posible en c11 y en otros lenguaes, pero sorprendentemente ava no lo incorpora, as% que podemos decir que esta caracter%stica es una ventaa de c3 respecto a ava, aunque mucha gente, esta posibilidad, no lo considera una ventaa porque complica el código. ) la hora de hablar de operadores vamos a distinguir entre dos tipos, los unarios y los binarios. Los unarios son aquellos que solo requieren un operando, por eemplo a11, en este caso el operando es VaV y el operador V11V. Los operadores binarios son aquellos que necesitan dos operadores, por eemplo a1c , ahora el operador es V1V y los operandos VaV y VcV. 9s importante esta distinción ya que la programación se har" de forma diferente.
Los operadores que podemos sobrecargar son los unarios, 1, 4, W, 6, 11, 44! y los binarios 1, 4, X, 2, G, Y, Z, [, , QQ. 9s importante decir que los operadores de comparación, CC, WC, , Q, C, QC, se pueden sobrecargar pero con la condición que siempre se sobrecargue el complementario, es decir, si sobrecargamos el CC debemos sobrecargar el WC 'peradores (narios 9n esta sección se ver" cómo sobrecargar los operadores unarios, es decir aquellos que toman un solo operando, como por eemplo a11. 9l prototipo de los m(todos que van a sobrecargar operadores unarios ser"* public static Operando operator11&Operando a' -omo antes sustituyendo el 11 por cualquier operador unario. 9l eemplo dentro de nuestra clase de n$meros compleos ser%a* public static -omple7um operator11&-omple7um a' @ float au7img C a.Img! float au7real C a.Seal! return ne: -omple7um&11au7real, 11au7img'! 'peradores binarios Para empe+ar vamos a sobrecargar el operador suma&V1V' para que al sumar dos obetos de la clase -omple7um, es decir dos n$meros compleos obtengamos un n$mero compleo que ser" la suma de ambas partes. -abe destacar que los prototipos para sobrecargar operadores ser"n* public static Operando operator1&Operando a, Operando b' 9ste es el prototipo para el operador 1, el resto de operadores binarios van a seguir el mismo patrón. Por tanto el código del m(todo de sobrecarga ser" el siguiente* public static -omple7um operator1&-omple7um a, -omple7um b' @ return ne: -omple7um&a.Seal 1 b.Seal, a.Img 1 b.Img'!
9ste m(todo sobrecarga el operador suma para que podamos sumar dos n$meros compleos. #n dato a tener en cuenta es que los m(todos que sobrecargan operadores deben ser static. -omo se ve en el código los operandos son VaV y VbV, que se reciben como par"metro y el resultado de la operación es otro n$mero compleo que es el que retorna el m(todo. Por tanto se limita a crear un nuevo n$mero compleo con ambas partes operadas. De la misma forma podemos crear la sobrecarga del operador resta&V4V' para que lleve a cabo la misma función* public static -omple7um operator4&-omple7um a, -omple7um b' @ return ne: -omple7um&a.Seal 4 b.Seal, a.Img 4 b.Img'! -omo vemos el m(todo es id(ntico solo que sustituyendo los 1 por 4. 9n este caso el trabao que hacemos dentro del m(todo es trivial pero podr%a ser tan compleo como se quisiera.