lunes, 26 de septiembre de 2016

Interfaz Gráfica

En java se conoce como interfaz gráfica de cierta forma como la parte visual de un programa realizado en este tipo de programación, donde la interfaz se muestra a partir de ventanas mejor conocidas como JFrame. Para crear una ventana nueva o interfaz gráfica, se debe crear una clase nueva importando el JFrame como tal y luego en el nombre de la clase escribir "extends JFrame" como se muestra a continuación.










Para después crear otra clase nueva donde esta nos dejara mostrar la nueva ventana a partir de la creación de un objeto que una vez haya sido instanciado con la clase ventana se le colocara "setVisible(true)", siendo esto lo que permite que el JFrame se pueda visualizar. Veamos esto en código java











Al ejecutar esto nos aparecerá una pequeña ventana por defecto, que no tiene ni titulo, tamaño determinado, una posición de inicio elegida, algún atributo, entre otros. Como se puede apreciar en la siguiente imagen






Esta seria nuestra ventana que tiene tanto tamaño y posición por defecto, teniendo este aspecto tan pequeño y ubicándose hacia la parte superior izquierda de la pantalla que es la ubicación predeterminada.
Ya sabiendo esto podemos aplicarle ahora nuevas característica a nuestra ventana como lo es el tamaño con el método "setSize", y otros de esta misma forma. También le podemos agregar atributos de tipo objeto a nuestro JFrame que vendrían siendo cosas como botones, cajas de texto, letras, menús desplegables, entre otros, que es lo que normalmente vemos en distintos programas o software ya realizados que usamos en nuestra vida cotidiana.
Empecemos por las características que queremos agregar a nuestra ventana, El tamaño como ya se había mencionado antes sera con el método "setSize", para el titulo del JFrame sera "setTitle", para la ubicación en la pantalla sera "setLocationRelativeTo", el "setResizable" es para permitir o denegar que la ventana sea cambiada de tamaño mientras es ejecutada, "setLayout" es el que nos permite poder cambiar las posiciones de los componente de la ventana como lo es un botón o que estos sean posicionado automáticamente por el programa y por ultimo tenemos el "setDefaultCloseOperation" que es el que nos permite terminar todo proceso una vez que la ventana se haya cerrado, esto con el fin de que no quede ningún proceso activo para cuando se vuelva a ejecutar o visualizar la ventana. Veamos todo lo anterior ya en el código java




Como se ve en la imagen, para llevar a cabo estas características, se tienen que colocar en un método el cual en este caso se llama configurarVentana, que fue creado con anterioridad en el constructor de la ventana. Una vez hechas las modificaciones ahora nuestra ventana se debe ver así:



Ahora prosigamos a agregarle los componentes a la ventana, para poder agregarlos primero se deben importar como se hizo con el JFrame, en este caso estos son los que se importaron incluyendo el JFrame
Siendo JButton el botón, JLabel un texto como tal y JTextField la caja de texto.
Ahora veamos el resto del código para la creación de estos componentes

Primero tenemos la creación de los componentes, siendo creados como unos atributos de tipo objeto, como por ejemplo el atributo texto que es de tipo JLabel, es decir un atributo de tipo objeto. una vez creados se hará uso del método inicializarComponentes creado en el constructor de la ventana, donde primero se instanciaran los componentes es decir se crearan objetos de estos, después se configuraran los componentes asignándoles cosas como el texto (este es dependiendo del componente por ejemplo en la caja de texto no se coloca), tamaño y la posición como se puede ver, Y por ultimo se agregaran los componentes a la ventana con la palabra "add" como se puede apreciar en la imagen. Una vez acabado la configuración de los componentes de la ventana, esta al ser ejecutada quedara así:











































lunes, 19 de septiembre de 2016

Encapsulamiento

El encapsulamiento en la programación orientada a objetos no es mas que ocultar los detalles de una clase, es decir sus atributos, teniéndolos en una visibilidad privada donde solo la clase propietaria puede acceder a estos, por eso que se dice que una clase esta encapsulada cuando sus atributos son privados.
Aunque es únicamente visible para si mismo, se puede acceder a estos datos gracias a los métodos publicos GET y SET creados en la misma clase, permitiendo pedir y alterar los datos de un objeto. Las clases encapsuladas también pueden compartir sus detalles con otra clase pero únicamente si lo permiten.

Un ejemplo en UML podría ser:















Ahora veamos como seria en java






















Visibilidad
  • public (publico): +
  • private (privado): -
  • protected (protegido): #

Herencia

La herencia es una característica de la programación orientada a objetos más exactamente una relación entre clases, donde esta permite que una clase puede adoptar los atributos y clases de otra clase. Esta relación también es conocida como generalización ya que se refiere a que una o varias clases hacen parte de una clase superior o general dependiendo del enfoque, la clase derivada es decir la que adquiere métodos y atributos de la clase base se le conoce como subclase, y la clase base se le conoce como super clase. Cabe mencionar que la subclase aunque hereda a la super clase, también
puede tener métodos y atributos propios.

Veamos un ejemplo en diagrama de clases


Aquí tenemos dos clases una llamada Persona y otra llamada EstudianteUniversitario relacionadas por herencia o generalización representada con esa flecha, donde la clase EstudianteUniversitario con sus propio métodos y atributos esta heredando los métodos y atributos de Persona , diciendo así que EstudianteUniversitario es una clase de Persona. Nota: También puede ser una relación donde en vez de Persona sea Estudiante a secas indicando que EstudianteUniversitario es una clase de Estudiante, pero reitero todo depende de que forma se este viendo el problema es decir que enfoque se le esta dando.

Ahora veamos este ejemplo en java







































Para llevar a cabo correctamente la herencia en java, hay que colocar la palabra "extends" después del nombre de la clase y seguido del extends colocar el nombre la de clase que heredara en este caso es Persona como se puede observar en la clase EstudianteUniversitario. Como se están heredando los métodos y atributos de la clase Persona, no es necesario volver a escribir su contenido en cuanto a métodos y atributos, únicamente se coloca su contenido propio. 

En algunos casos si es necesario escribir nuevamente algún método después de la herencia, frecuentemente esto sucede en la herencia de métodos abstractos de una clase abstracta, ya que estos métodos no están desarrollados y necesitaran desarrollarse en la subclase para llevarse a cabo.

Un ejemplo de esto es el siguiente
















En este pequeño diagrama se encuentran dos clases donde la clase Circunferencia se relaciona con la clase FiguraGeometrica la cual tiene atributos, métodos GET y unos métodos abstractos que serán heredados, y por ser abstractos tendrán que ser desarrollados por la subclase en su código como se puede ver a continuación en java:






































La  clase Circunferencia deberá desarrollar esos métodos abstractos mediante de ciertas operaciones para calcular el área y perímetro como se puede apreciar en la ultima imagen, donde después de desarrollar el proceso matemático retornaran ambos métodos un valor float que serán respectivamente el área y perímetro calculado.

Estos casos de métodos abstractos se consideran un tipo como tal de herencia.
Nota: para reconocer un método abstracto en un diagrama de clases, se debe ver como esta escrito si en letra cursiva o scrib, si esta en letra cursiva es un método abstracto. En este caso los métodos de área y perímetro no están escritos en cursiva porque el programa para realizar el diagrama UML no lo permitía, pero aun así hay que tener en cuenta eso.

domingo, 18 de septiembre de 2016

Métodos Primordiales y Polimorfismo Dinámico

Estos métodos se pueden encontrar cada vez que se realiza una relación de generalización como se puede ver en el polimorfismo, donde el método al momento de ser utilizado por la subclase no podrá alterar su código fuente, es decir, el método lo realizara tal cual como lo definió la super clase, a estos métodos se les conoce como métodos primordiales. Esto también puede funcionar al revés, es decir, que la subclase desarrolle algún método y la super clase lo pueda utilizar, ya que la super clase puede usar un objeto de si misma o algún objeto de la subclase.
En términos de polimorfismo cuando se usan métodos primordiales se denomina como polimorfismo dinámico, y mas que todo en los casos que la super clase contiene un objeto de la subclase.
Veamos un ejemplo en UML




















Se encuentra la super clase CuentaBancaria y la subclase CuentaAhorros que sera la que heredara los atributos saldo y numero, y el método retiro.

Ahora miremos en java













En la clase CuentaBancaria se encuentra el código de los atributos, metodos GET y SET, un constructor por defecto, y el método retiro el cual ya esta definido en su cuerpo por tanto al ser adquirido por la CuentaAhorros por herencia, no lo podrá modificar siendo así un método primordial. Por lo tanto en la clase CuentaAhorros solo se encuentra un constructor sobrecargado llamando a los SET de la super clase para poder instanciar, y el "extends" para indicar la relación de generalización. 

Métodos Sobrecargados y Polimorfismo Estático

Como se vio anteriormente en los constructores, el constructor sobrecargado es el mismo caso del método sobrecargado, donde el método esta argumentado es decir adquiere ciertos valores por parámetros y tiene su código fuente desarrollado en algunos casos, pero estos métodos no son para instanciar la clase sino para que los objetos realicen el proceso que tiene  el método ya sea como realizar alguna operación matemática, en donde algunos casos estos métodos pueden afectar los atributos de un objeto ya creado.
Estos métodos pueden ser propios de una clase o pueden ser adquiridos por otra como se ve en el polimorfismo. 
Y cuando estos métodos son adquiridos por polimorfismo, se le denomina polimorfismo estático que no es mas otra cosa que la sobrecarga de métodos en java.

Veamos un ejemplo en diagrama de clases












En este diagrama se encuentra la clase CuentaBancaria la cual tiene como atributos saldo y numero, y un método llamado retiro ademas de los métodos GET, SET y su constructor que suponemos ya están ahí como tal. El método retiro como se puede ver pasara por parámetros el valor del retiro que se desea gracias al pRetiro, ademas el método retornara un valor double el cual sera el nuevo valor del saldo después del retiro.
Ahora vemos esto en java



























Como se puede ver este método también retornara un valor double como se menciono anteriormente, no todos los casos son así lo mismo con el cuerpo del método, no siempre estará desarrollado, para que sea un método sobrecargado es que siempre deberá pasar algún valor por parametros

Polimorfismo


El polimorfismo en java se refiere al momento en que un método puede realizar distintos procesos en función de un objeto de una clase en concreto, donde esta clase adquiere este método ya sea por la relación de herencia con otra clase o por la relación de realización con una interface, esta ultima tiene como objetivo contener métodos abstractos para que una clase los desarrolle. 

Es por eso que el polimorfismo se ve normalmente en la especialización de una clase, donde sus subclases heredan sus métodos, ya sean abstractos o desarrollados como tal para que los pueda realizar, lo mismo sucede con la interface.


Un ejemplo en diagrama UML es:














En este pequeño diagrama se encuentran dos clases donde la clase circunferencia se conecta o mejor dicho relaciona, con la clase figura geométrica la cual tiene unos atributos y métodos lo cuales con la relación de tipo herencia o generalización (la flecha) serán heredados a la subclase circunferencia, donde podrá realizarlos teniendo en cuenta sus atributos ya propuestos y los tipos de métodos que son.

Vemos este ejemplo en java.






































En  este caso los métodos heredados a excepción de los GET creados en la clase figura geométrica, son abstractos por lo que al momento de realizar el código de las clases en circunferencia, está deberá desarrollar esos métodos abstractos mediante de ciertas operaciones para calcular el área y perímetro. Y para que esta pueda tomar estos métodos y desarrollarlos a voluntad por su herencia, se debe colocar la palabra "extends" y seguido el nombre de la clase de donde obtendrá los métodos, esto es seguido del "public class NombreClase" como se puede ver en la segunda imagen de código.

Nota: para reconocer un método abstracto en un diagrama de clases, se debe ver como esta escrito si en letra cursiva o scrib, si esta en letra cursiva es un método abstracto. En este caso los métodos de área y perímetro no están escritos en cursiva porque el programa para realizar el diagrama UML no lo permitía, pero aun así hay que tener en cuenta eso.

Constructores

Un constructor en java, es un método que nos permite instanciar o crear objetos de una clase, una particularidad de los constructores para reconocerlos es que no tienen ningún retorno aunque sean un método como tal, no retornan ni siquiera vació (void). Para crear correctamente un constructor tanto en código como en el diagrama de clases se debe tener en cuenta que este siempre se llamara igual que la clase y su visibilidad sera publica.

Existen distintos tipos de constructores en total son tres:

1.Constructor por defecto: es como tal el constructor común con las anteriores especificaciones en donde no retorna nada y dentro de su cuerpo de código esta completamente vació donde para poder hacer la debida creación de objetos deberá hacer uso de los métodos SET de la clase. Veamos un ejemplo del constructor por defecto en un diagrama de clases.

















Ahora veamos este mismo ejemplo pero en código java















Veamos ahora 2 ejemplos mas pero únicamente con código















2. Constructor sin argumentos: Este constructor se diferencia del de por defecto donde el cuerpo tiene cualquier tipo de código mientras que el constructor por defecto tiene vació su cuerpo, no hace nada. Se le llama sin argumentos ya que este constructor no indica que valores de atributos específicamente pasar al momento de crear el objeto siendo igual que el constructor por defecto haciendo uso de los metodos SET de la clase para poder instanciarla. En diagrama de clases es completamente igual
















Pero en código java ya se ven los cambios con respecto al diagrama en UML.


















Veamos 2 ejemplos más pero únicamente en código java

















3. Constructor sobrecargado: por ultimo se encuentra el constructor sobrecargado, el cual es un constructor que si se encuentra argumentado y tiene su cuerpo de código desarrollado, es decir, ya tiene indicado que valores de atributos pasar al momento de crear un objeto a partir de parámetros y en su cuerpo indica que parámetro corresponde a cada atributo, de esta forma evitando el uso de los métodos SET. Veamos un ejemplo en diagrama de clases.











Nota: pColor y pTamño son los parámetros que nos servirán para poder pasar los valores de los atributos a un nuevo objeto.

Ahora veamos este ejemplo en código java
















Por ultimo veamos 2 ejemplos mas pero únicamente en código java