1. Definición de hilos
2. Ciclo de vida de un hilo
3. Sintaxis de creación de un hilo
4. La clase y métodos de la clase que permiten manipular un hilo.
5. Para qué sirve la interface runable.
Solución
1. Un hilo es una secuencia de código en ejecución dentro del contexto de un proceso. Los hilos no pueden ejecutarse ellos solos; requieren la supervisión de un proceso padre para correr.
Dentro de cada proceso hay varios hilos ejecutándose. Por ejemplo, Word puede tener un hilo en background chequeando automáticamente la gramática de lo que estoy escribiendo, mientras otro hilo puede estar salvando automáticamente los cambios del documento en el que estoy trabajando. Como Word, cada aplicación (proceso) puede correr varios hilos los cuales están realizando diferentes tareas. Esto significa que los hilos están siempre asociados con un proceso en particular.
Los hilos a menudo son conocidos o llamados procesos ligeros. Un hilo, en efecto, es muy similar a un proceso pero con la diferencia de que un hilo siempre corre dentro del contexto de otro programa. Por el contrario, los procesos mantienen su propio espacio de direcciones y entorno de operaciones. Los hilos dependen de un programa padre en lo que se refiere a recursos de ejecución. La siguiente figura muestra le relación entre hilos y procesos.
Figura 1.1 Relación entre hilos y procesos
2. El comportamiento de un hilo depende del estado en que se encuentre, este estado define su modo de operación actual, por ejemplo, si está corriendo o no. A continuación proporcionamos la relación de estados en los que puede estar un hilo Java.
New
Runnable
Not running
Dead
New
Un hilo esta en el estado new la primera vez que se crea y hasta que el método start es llamado. Los hilos en estado new ya han sido inicializados y están listos para empezar a trabajar, pero aún no han sido notificados para que empiecen a realizar su trabajo.
Runnable
Cuando se llama al método start de un hilo nuevo, el método run es invocado y el hilo entra en el estado runnable. Este estado podría llamarse “running” porque la ejecución del método run significa que el hilo esta corriendo. Sin embargo, debemos tener en cuenta la prioridad de los hilos. Aunque cada hilo está corriendo desde el punto de vista del usuario, en realidad todos los hilos, excepto el que en estos momentos esta utilizando la CPU, están en el estado runnable (ejecutables, listos para correr) en cualquier momento dado. Uno puede pensar conceptualmente en el estado runnable como si fuera el estado “running”, sólo tenemos que recordar que todos los hilos tienen que compartir los recursos del sistema.
Not running
El estado not running se aplica a todos los hilos que están parados por alguna razón. Cuando un hilo está en este estado, está listo para ser usado y es capaz de volver al estado runnable en un momento dado. Los hilos pueden pasar al estado not running a través de varias vías.
A continuación se citan diferentes eventos que pueden hacer que un hilo esté parado de modo temporal.
El método suspend ha sido llamado
El método sleep ha sido llamado
El método wait ha sido llamado
El hilo esta bloqueado por I/O
Para cada una de estas acciones que implica que el hilo pase al estado not running hay una forma para hacer que el hilo vuelva a correr. A continuación presentamos la lista de eventos correspondientes que pueden hacer que el hilo pase al estado runnable.
Si un hilo está suspendido, la invocación del método resume
Si un hilo está durmiendo, pasarán el número de milisegundos que se ha especificado que debe dormir
Si un hilo está esperando, la llamada a notify o notifyAll por parte del objeto por el que espera
Si un hilo está bloqueado por I/O, la finalización de la operación I/O en cuestión
Dead
Un hilo entra en estado dead cuando ya no es un objeto necesario. Los hilos en estado dead no pueden ser resucitados y ejecutados de nuevo. Un hilo puede entrar en estado dead a través de dos vías:
El método run termina su ejecución.
El método stop es llamado.
La primera opción es el modo natural de que un hilo muera. Uno puede pensar en la muerte de un hilo cuando su método run termina la ejecución como una muerte por causas naturales.
En contraste a esto, está la muerte de un hilo “por causa” de su método stop. Una llamada al método stop mata al hilo de modo asíncrono.
Aunque la segunda opción suene un poco brusca, a menudo es muy útil. Por ejemplo, es bastante común que los applets maten sus hilos utilizando el método stop cuando el propio método stop del applet ha sido invocado. La razón de esto es que el método stop del applet es llamado normalmente como respuesta al hecho de que el usuario ha abandonado la página web que contenía el applet y no es adecuado dejar hilos de un applet corriendo cuando el applet no está activo, así que es deseable matar los hilos.
3. Crear un hilo en java es una tarea muy sencilla. Basta heredar de la clase Thread y definir el método run(). Luego se instancia esta clase y se llama al método start() para que arranque el hilo. Más o menos esto
public MiHilo extends Thread
{
public void run()
{
// Aquí el código pesado que tarda mucho
}
};
...
MiHilo elHilo = new MiHilo();
elHilo.start();
System.out.println("Yo sigo a lo mio");
Listo. Hemos creado una clase MiHilo que hereda de Thread y con un método run(). En el método run() pondremos el código que queremos que se ejecute en un hilo separado. Luego instanciamos el hilo con un new MiHilo() y lo arrancamos con elHilo.start(). El System.out que hay detrás se ejecutará inmediatamente después del start(), haya terminado o no el código del hilo.
4. Thread
La clase Thread es la clase responsable de producir hilos funcionales para otras clases. Para añadir la funcionalidad de hilo a una clase simplemente se deriva la clase de Thread y se ignora el método run. Es en este método run donde el procesamiento de un hilo toma lugar, y a menudo se refieren a él como el cuerpo del hilo. La clase Thread también define los métodos start y stop, los cuales te permiten comenzar y parar la ejecución del hilo, además de un gran número de métodos útiles.
5. Java no soporta herencia múltiple de forma directa, es decir, no se puede derivar una clase de varias clases padre. Esto nos plantea la duda sobre cómo podemos añadir la funcionalidad de Hilo a una clase que deriva de otra clase, siendo ésta distinta de Thread. Para lograr esto se utiliza la interfaz Runnable. La interfaz Runnable proporciona la capacidad de añadir la funcionalidad de un hilo a una clase simplemente implementando la interfaz, en lugar de derivándola de la clase Thread.
Las clases que implementan la interfaz Runnable proporcionan un método run que es ejecutado por un objeto hilo asociado que es creado aparte. Esta es una herramienta muy útil y a menudo es la única salida que tenemos para incorporar multihilo dentro de las clases. Esta cuestión será tratada más ampliamente en el apartado de Creación de hilos.
"La mayoría de las ideas fundamentales de la ciencia son esencialmente sencillas y, por regla general pueden ser expresadas en un lenguaje comprensible para todos." ALBERT EINSTEIN
martes, 9 de noviembre de 2010
jueves, 19 de agosto de 2010
ACTIVIDAD 4
1. PROGRAMACIÓN APPLET
Una applet es un fichero de clase que se escribe específicamente para visualizar gráficos en la red Internet. Las applets se incluyen en las páginas Web utilizando la etiqueta HTML (APPLET). Cuando se ejecutan en una página Web, las applets de Java se descargan automáticamente y el browser las ejecuta, visualizándose en el espacio de la página que se ha reservado para ellas. Pueden hacer de todo, desde trabajar con gráficos hasta visualizar animaciones, gestionar controles (como los que veremos funcionar en este capítulo), cuadros de texto y botones.
El uso de las applets hace que las páginas Web sean activas, no pasivas, que es su principal atracción.
Cuando se trabaja con AWT, el proceso es como sigue: se crea una applet nueva, basándola en la clase java.applet.App1et que, a su vez, está basada en la clase Component de AWT. He aquí un ejemplo que hemos visto antes y que haremos de nuevo en este capítulo. Este ejemplo visualiza el texto "¡Hola desde Java!" en una página Web:
import java.applet.Applet;
import java.awt.*;
public class applet extends Applet
{
public void paint (Graphics g)
{
g.drawString ("¡Hola desde Java!", 60, 100);
La applet se compila en un fichero de bytecode con extensión ".class".
Una vez que se tiene este fichero, se sube a un proveedor de servicios de la red Internet (ISP).
2. PROGRAMACIÓN EN AUTÓNOMO
Todo en Java está dentro de una clase, incluyendo programas autónomos.
Las aplicaciones autónomas se ejecutan dando al entorno de ejecución de Java el nombre de la clase cuyo método main debe invocarse. Por ejemplo, una línea de comando (en Unix o Windows) de la forma java –cp. Hola ejecutará un programa (previamente compilado y generado como “Hola.class”). El nombre de la clase cuyo método main se llama puede especificarse también en el fichero “MANIFEST” del archivo de empaquetamiento de Java (.jar).
3. CARACTERISTICAS DE APPLET
o Se ejecutan sólo en la plataforma "cliente" de un sistema, como contraste de un servlet.
o A diferencia de las subrutinas, en los applets ciertas capacidades son restringidas por el contenedor (el navegador).
o Un applet está escrito en un lenguaje diferente del script o del HTML que lo invoca.
o Los applet son escritos en un lenguaje compilado, mientras que el lenguaje scripting del contenedor es un lenguaje interpretado. Esto permite mayor performance y potencia al applet.
o A diferencia de una subrutina, puede implementarse un componente web completo en forma de applet.
o A diferencia de un programa, no puede ejecutarse de forma independiente (necesita un programa contenedor).
Jerarquía de clases:
· java.lang.Object
· java.awt.Component
· java.awt.Container← java.awt.Panel ← java.applet.Applet
· Todos los applets derivan de java.applet.Applet
· No tiene un main() con el que comienza la ejecución
· Debe redefinir métodos heredados de Applet que controlan su ejecución:
· init(), start(), stop(), destroy()
· Hereda los métodos gráficos de Component, y la capacidad de añadir componentes de interface de usuario los hereda de Container y de Panel
· Suele redefinir el método gráfico paint()
4. CARACTERÍSTICAS DE AWT
* Los Contenedores contienen Componentes, que son los controles básicos
* No se usan posiciones fijas de los Componentes, sino que están situados a través de una disposición controlada (layouts)
* El común denominador de más bajo nivel se acerca al teclado, ratón y manejo de eventos
* Alto nivel de abstracción respecto al entorno de ventanas en que se ejecute la aplicación (no hay áreas cliente, ni llamadas a X, ni hWnds, etc.)
* La arquitectura de la aplicación es dependiente del entorno de ventanas, en vez de tener un tamaño fijo
* Es bastante dependiente de la máquina en que se ejecuta la aplicación (no puede asumir que un diálogo tendrá el mismo tamaño en cada máquina)
* Carece de un formato de recursos. No se puede separar el código de lo que es propiamente interface. No hay ningún diseñador de interfaces (todavía)
5. CARACTERÍSTICAS DE SWING
Esta lección ha explicado algunos de los mejores conceptos que necesitarás conocer para construir GUIs Swing -- el árbol de contenidos, el control de distribución, el manejo de eventos, el dibujado, y los threads. Además, hemos tocado tópicos relacionados, como los bordes. Esta sección explica algunas características Swing que no se han explicado todavía.
Características que ProporcionaJComponent
Excepto los contenedores de alto nivel, todos los componentes que empiezan con J descienden de la clase JComponent. Obtienen muchas características de esta clase, como la posibilidad de tener bordes, tooltips, y Aspecto y Comportamiento configurable. También heredan muchos métodos de conveniencia. Para más detalles, sobre lo que proporciona la clase JComponent puedes ver La clase JComponent
Iconos
Muchos componentes Swing -- principalmente los botones y las etiquetas -- pueden mostrar imágenes. Estas imágenes se especifican como objetos Icon. Puedes ver Cómo usar Iconos para ver instrucciones y una lista de ejemplos que usa iconos.
Actions
Con objetos Action, el API Swing proporciona un soporte especial para compartir datos y estados entre dos o más componentes que pueden generar eventos action. Por ejemplo, si tenemos un botón y un ítem de menú que realizan la misma función, podríamos considerar la utilización de un objeto Action para coordinar el texto, el icono y el estado de activado de los dos componentes. Para más detalles, puedes ver Cómo usar Actions.
Aspecto y Comportamiento Conectable
Un sencillo programa puede tener uno o varios aspectos y comportamientos. Se puede permitir que el usuario determine el aspecto y comportamiento, o podemos determinarlos programáticamente. Puedes ver Cómo seleccionar el Aspecto y Comportamiento para más detalles.
Soporte para Tecnologías Asistivas
Las tecnologías asisticas como los lectores de pantallas pueden usar el API de accesibilidad para obtener información sobre los componentes Swing. Incluso si no hacemos nada, nuestro programa Swing probablemente funcionará correctamente con tecnologías asistivas, ya que el API de accesibilidad está construido internamente en los componentes Swing. Sin embargo, con un pequeño esfuerzo extra, podemos hacer que nuestro programa funcione todavía mejor con tecnologías asistivas, lo que podría expandir el mercado de nuestro programa. Puedes ver Cómo Soportar Tecnologías Asistivas para más detalles.
Modelos de Datos y Estados Separados
La mayoría de los componentes Swing no-contenedores tienen modelos. Por ejemplo, un botón (JButton) tiene un modelo (ButtonModel) que almacena el estado del botón -- cuál es su mnemónico de teclado, si está activado, seleccionado o pulsado, etc. Algunos componentes tienen múltiples modelos. Por ejemplo, una lista (JList) usa un ListModel que almacena los contenidos de la lista y un ListSelectionModel que sigue la pista de la selección actual de la lista.
Normalmente no necesitamos conocer los modelos que usa un componente. Por ejemplo, casi todos los programas que usan botones tratan directamente con el objeto JButton, y no lo hacen en absoluto con el objeto ButtonModel.
Entonces ¿Por qué existen modelos separados? Porque ofrecen la posibilidad de trabajar con componentes más eficientemente y para compartir fácilmente datos y estados entre componentes. Un caso común es cuando un componente, como una lista o una tabla, contiene muchos datos. Puede ser mucho más rápido manejar los datos trabajando directamente con un modelo de datos que tener que esperar a cada petición de datos al modelo. Podemos usar el modelo por defecto del componente o implementar uno propio.
Para más información sobre los modelos, puedes visitar las páginas individuales de cada componente o La Anatomía de un Programa Basado en Swing que describe algunos modelos personalizados usados por el programa creado en esa sección.
6. CLASES DE AWT
Component
Container
LayoutManager
LayoutManager2
Panel
ScrollPane
Window
Frame
Dialog
Filedialog
Button
Canvas
Checkbox
Choice
Label
List
Scrollbar
TextComponent
TextField
TextArea
7. MÉTODOS RELACIONADOS A LA CLASE BOTTON
void addActionListener(ActionListener l)
ActionListener
AccessibleContext getAccessibleContext ()
String getActionCommand ()
String getLabel ()
EventListener [] getListeners (Class listenerType)
AddXXXListener ()
AddActionListener ( )
Void removeActionListener (ActionListener l)
Void setActionCommand (String command)
void setLabel(String label)
8. MÉTODOS RELACIONADOS A LA CLASE LABEL
ApplyStyle
ApplyStyleSheetSkin
CopyBaseAttributes
DataBind
Dispose
Equals
FindControl
Focus
GetHashCode
GetType
HasControls
MergeStyle
ReferenceEquals
RenderBeginTag
RenderControl
RenderEndTag
ResolveClientUrl
ResolveUrl
SetRenderMethodDelegate
ToString
Métodos protegidos
AddAttributesToRender
AddedControl
AddParsedSubObject
BuildProfileTree
ClearChildControlState
ClearChildState
ClearChildViewState
CreateChildControls
CreateControlCollection
CreateControlStyle
DataBind
DataBindChildren
EnsureChildControls
EnsureID
Finalize
FindControl
GetDesignModeState
HasEvents
IsLiteralContent
LoadControlState
LoadViewState
MapPathSecure
MemberwiseClone
OnBubbleEvent
OnDataBinding
OnInit
OnLoad
OnPreRender
OnUnload
OpenFile
RaiseBubbleEvent
RemovedControl
Render
RenderChildren
RenderContents
RenderControl
ResolveAdapter
SaveControlState
SaveViewState
SetDesignModeState
TrackViewState
9. MÉTODOS RELACIONADOS A LA CLASE TEXTFIELD
Equals
GetHashCode
GetType
MemberType
ReferenceEquals
ToString
Protegido Métodos
Finalize
MemberwiseClone
Una applet es un fichero de clase que se escribe específicamente para visualizar gráficos en la red Internet. Las applets se incluyen en las páginas Web utilizando la etiqueta HTML (APPLET). Cuando se ejecutan en una página Web, las applets de Java se descargan automáticamente y el browser las ejecuta, visualizándose en el espacio de la página que se ha reservado para ellas. Pueden hacer de todo, desde trabajar con gráficos hasta visualizar animaciones, gestionar controles (como los que veremos funcionar en este capítulo), cuadros de texto y botones.
El uso de las applets hace que las páginas Web sean activas, no pasivas, que es su principal atracción.
Cuando se trabaja con AWT, el proceso es como sigue: se crea una applet nueva, basándola en la clase java.applet.App1et que, a su vez, está basada en la clase Component de AWT. He aquí un ejemplo que hemos visto antes y que haremos de nuevo en este capítulo. Este ejemplo visualiza el texto "¡Hola desde Java!" en una página Web:
import java.applet.Applet;
import java.awt.*;
public class applet extends Applet
{
public void paint (Graphics g)
{
g.drawString ("¡Hola desde Java!", 60, 100);
La applet se compila en un fichero de bytecode con extensión ".class".
Una vez que se tiene este fichero, se sube a un proveedor de servicios de la red Internet (ISP).
2. PROGRAMACIÓN EN AUTÓNOMO
Todo en Java está dentro de una clase, incluyendo programas autónomos.
Las aplicaciones autónomas se ejecutan dando al entorno de ejecución de Java el nombre de la clase cuyo método main debe invocarse. Por ejemplo, una línea de comando (en Unix o Windows) de la forma java –cp. Hola ejecutará un programa (previamente compilado y generado como “Hola.class”). El nombre de la clase cuyo método main se llama puede especificarse también en el fichero “MANIFEST” del archivo de empaquetamiento de Java (.jar).
3. CARACTERISTICAS DE APPLET
o Se ejecutan sólo en la plataforma "cliente" de un sistema, como contraste de un servlet.
o A diferencia de las subrutinas, en los applets ciertas capacidades son restringidas por el contenedor (el navegador).
o Un applet está escrito en un lenguaje diferente del script o del HTML que lo invoca.
o Los applet son escritos en un lenguaje compilado, mientras que el lenguaje scripting del contenedor es un lenguaje interpretado. Esto permite mayor performance y potencia al applet.
o A diferencia de una subrutina, puede implementarse un componente web completo en forma de applet.
o A diferencia de un programa, no puede ejecutarse de forma independiente (necesita un programa contenedor).
Jerarquía de clases:
· java.lang.Object
· java.awt.Component
· java.awt.Container← java.awt.Panel ← java.applet.Applet
· Todos los applets derivan de java.applet.Applet
· No tiene un main() con el que comienza la ejecución
· Debe redefinir métodos heredados de Applet que controlan su ejecución:
· init(), start(), stop(), destroy()
· Hereda los métodos gráficos de Component, y la capacidad de añadir componentes de interface de usuario los hereda de Container y de Panel
· Suele redefinir el método gráfico paint()
4. CARACTERÍSTICAS DE AWT
* Los Contenedores contienen Componentes, que son los controles básicos
* No se usan posiciones fijas de los Componentes, sino que están situados a través de una disposición controlada (layouts)
* El común denominador de más bajo nivel se acerca al teclado, ratón y manejo de eventos
* Alto nivel de abstracción respecto al entorno de ventanas en que se ejecute la aplicación (no hay áreas cliente, ni llamadas a X, ni hWnds, etc.)
* La arquitectura de la aplicación es dependiente del entorno de ventanas, en vez de tener un tamaño fijo
* Es bastante dependiente de la máquina en que se ejecuta la aplicación (no puede asumir que un diálogo tendrá el mismo tamaño en cada máquina)
* Carece de un formato de recursos. No se puede separar el código de lo que es propiamente interface. No hay ningún diseñador de interfaces (todavía)
5. CARACTERÍSTICAS DE SWING
Esta lección ha explicado algunos de los mejores conceptos que necesitarás conocer para construir GUIs Swing -- el árbol de contenidos, el control de distribución, el manejo de eventos, el dibujado, y los threads. Además, hemos tocado tópicos relacionados, como los bordes. Esta sección explica algunas características Swing que no se han explicado todavía.
Características que ProporcionaJComponent
Excepto los contenedores de alto nivel, todos los componentes que empiezan con J descienden de la clase JComponent. Obtienen muchas características de esta clase, como la posibilidad de tener bordes, tooltips, y Aspecto y Comportamiento configurable. También heredan muchos métodos de conveniencia. Para más detalles, sobre lo que proporciona la clase JComponent puedes ver La clase JComponent
Iconos
Muchos componentes Swing -- principalmente los botones y las etiquetas -- pueden mostrar imágenes. Estas imágenes se especifican como objetos Icon. Puedes ver Cómo usar Iconos para ver instrucciones y una lista de ejemplos que usa iconos.
Actions
Con objetos Action, el API Swing proporciona un soporte especial para compartir datos y estados entre dos o más componentes que pueden generar eventos action. Por ejemplo, si tenemos un botón y un ítem de menú que realizan la misma función, podríamos considerar la utilización de un objeto Action para coordinar el texto, el icono y el estado de activado de los dos componentes. Para más detalles, puedes ver Cómo usar Actions.
Aspecto y Comportamiento Conectable
Un sencillo programa puede tener uno o varios aspectos y comportamientos. Se puede permitir que el usuario determine el aspecto y comportamiento, o podemos determinarlos programáticamente. Puedes ver Cómo seleccionar el Aspecto y Comportamiento para más detalles.
Soporte para Tecnologías Asistivas
Las tecnologías asisticas como los lectores de pantallas pueden usar el API de accesibilidad para obtener información sobre los componentes Swing. Incluso si no hacemos nada, nuestro programa Swing probablemente funcionará correctamente con tecnologías asistivas, ya que el API de accesibilidad está construido internamente en los componentes Swing. Sin embargo, con un pequeño esfuerzo extra, podemos hacer que nuestro programa funcione todavía mejor con tecnologías asistivas, lo que podría expandir el mercado de nuestro programa. Puedes ver Cómo Soportar Tecnologías Asistivas para más detalles.
Modelos de Datos y Estados Separados
La mayoría de los componentes Swing no-contenedores tienen modelos. Por ejemplo, un botón (JButton) tiene un modelo (ButtonModel) que almacena el estado del botón -- cuál es su mnemónico de teclado, si está activado, seleccionado o pulsado, etc. Algunos componentes tienen múltiples modelos. Por ejemplo, una lista (JList) usa un ListModel que almacena los contenidos de la lista y un ListSelectionModel que sigue la pista de la selección actual de la lista.
Normalmente no necesitamos conocer los modelos que usa un componente. Por ejemplo, casi todos los programas que usan botones tratan directamente con el objeto JButton, y no lo hacen en absoluto con el objeto ButtonModel.
Entonces ¿Por qué existen modelos separados? Porque ofrecen la posibilidad de trabajar con componentes más eficientemente y para compartir fácilmente datos y estados entre componentes. Un caso común es cuando un componente, como una lista o una tabla, contiene muchos datos. Puede ser mucho más rápido manejar los datos trabajando directamente con un modelo de datos que tener que esperar a cada petición de datos al modelo. Podemos usar el modelo por defecto del componente o implementar uno propio.
Para más información sobre los modelos, puedes visitar las páginas individuales de cada componente o La Anatomía de un Programa Basado en Swing que describe algunos modelos personalizados usados por el programa creado en esa sección.
6. CLASES DE AWT
Component
Container
LayoutManager
LayoutManager2
Panel
ScrollPane
Window
Frame
Dialog
Filedialog
Button
Canvas
Checkbox
Choice
Label
List
Scrollbar
TextComponent
TextField
TextArea
7. MÉTODOS RELACIONADOS A LA CLASE BOTTON
void addActionListener(ActionListener l)
ActionListener
AccessibleContext getAccessibleContext ()
String getActionCommand ()
String getLabel ()
EventListener [] getListeners (Class listenerType)
AddXXXListener ()
AddActionListener ( )
Void removeActionListener (ActionListener l)
Void setActionCommand (String command)
void setLabel(String label)
8. MÉTODOS RELACIONADOS A LA CLASE LABEL
ApplyStyle
ApplyStyleSheetSkin
CopyBaseAttributes
DataBind
Dispose
Equals
FindControl
Focus
GetHashCode
GetType
HasControls
MergeStyle
ReferenceEquals
RenderBeginTag
RenderControl
RenderEndTag
ResolveClientUrl
ResolveUrl
SetRenderMethodDelegate
ToString
Métodos protegidos
AddAttributesToRender
AddedControl
AddParsedSubObject
BuildProfileTree
ClearChildControlState
ClearChildState
ClearChildViewState
CreateChildControls
CreateControlCollection
CreateControlStyle
DataBind
DataBindChildren
EnsureChildControls
EnsureID
Finalize
FindControl
GetDesignModeState
HasEvents
IsLiteralContent
LoadControlState
LoadViewState
MapPathSecure
MemberwiseClone
OnBubbleEvent
OnDataBinding
OnInit
OnLoad
OnPreRender
OnUnload
OpenFile
RaiseBubbleEvent
RemovedControl
Render
RenderChildren
RenderContents
RenderControl
ResolveAdapter
SaveControlState
SaveViewState
SetDesignModeState
TrackViewState
9. MÉTODOS RELACIONADOS A LA CLASE TEXTFIELD
Equals
GetHashCode
GetType
MemberType
ReferenceEquals
ToString
Protegido Métodos
Finalize
MemberwiseClone
miércoles, 11 de agosto de 2010
ACTIVIDAD 3
Existen dos tipos principales de traductores de los lenguajes de programación de alto nivel:
* Compilador, que analiza el programa fuente y lo traduce a otro equivalente escrito en otro lenguaje (por ejemplo, en el lenguaje de la máquina). Su acción equivale a la de un traductor humano, que toma un libro y produce otro equivalente escrito en otra lengua.
* Intérprete, que analiza el programa fuente y lo ejecuta directamente, sin generar ningún código equivalente. Su acción equivale a la de un intérprete humano, que traduce las frases que oye sobre la marcha, sin producir ningún escrito permanente. Intérpretes y compiladores tienen diversas ventajas e inconvenientes que los hacen complementarios:
o Un intérprete facilita la búsqueda de errores, pues la ejecución de un programa puede interrumpirse en cualquier momento para estudiar el entorno (valores de las variables, etc.). Además, el programa puede modificarse sobre la marcha, sin necesidad de volver a comenzar la ejecución.
o Un compilador suele generar programas más rápidos y eficientes, ya que el análisis del lenguaje fuente se hace una sola vez, durante la generación del programa equivalente. En cambio, un intérprete se ve obligado generalmente a analizar cada instrucción tantas veces como se ejecute (incluso miles o millones de veces).
o Un intérprete permite utilizar funciones y operadores más potentes, como por ejemplo ejecutar código contenido en una variable en forma de cadenas de caracteres. Usualmente, este tipo de instrucciones es imposible de tratar por medio de compiladores. Los lenguajes que incluyen este tipo de operadores y que, por tanto, exigen un intérprete, se llaman interpretativos. Los lenguajes compiladores, que permiten el uso de un compilador, prescinden de este tipo de operadores.
Los compiladores difieren de los intérpretes en varios aspectos:
* Un programa que ha sido compilado puede correr por sí solo, pues en el proceso de compilación se lo transformo en otro lenguaje (lenguaje máquina).
* Un intérprete traduce el programa cuando lo lee, convirtiendo el código del programa directamente en acciones.
* La ventaja del intérprete es que dado cualquier programa se puede interpretarlo en cualquier plataforma (sistema operativo), en cambio el archivo generado por el compilador solo funciona en la plataforma en donde se lo ha creado.
* Pero por otro lado un archivo compilado puede ser distribuido fácilmente conociendo la plataforma, mientras que un archivo interpretado no funciona si no se tiene el intérprete.
* Hablando de la velocidad de ejecución un archivo compilado es de 10 a 20 veces más rápido que un archivo interpretado.
* Compilador, que analiza el programa fuente y lo traduce a otro equivalente escrito en otro lenguaje (por ejemplo, en el lenguaje de la máquina). Su acción equivale a la de un traductor humano, que toma un libro y produce otro equivalente escrito en otra lengua.
* Intérprete, que analiza el programa fuente y lo ejecuta directamente, sin generar ningún código equivalente. Su acción equivale a la de un intérprete humano, que traduce las frases que oye sobre la marcha, sin producir ningún escrito permanente. Intérpretes y compiladores tienen diversas ventajas e inconvenientes que los hacen complementarios:
o Un intérprete facilita la búsqueda de errores, pues la ejecución de un programa puede interrumpirse en cualquier momento para estudiar el entorno (valores de las variables, etc.). Además, el programa puede modificarse sobre la marcha, sin necesidad de volver a comenzar la ejecución.
o Un compilador suele generar programas más rápidos y eficientes, ya que el análisis del lenguaje fuente se hace una sola vez, durante la generación del programa equivalente. En cambio, un intérprete se ve obligado generalmente a analizar cada instrucción tantas veces como se ejecute (incluso miles o millones de veces).
o Un intérprete permite utilizar funciones y operadores más potentes, como por ejemplo ejecutar código contenido en una variable en forma de cadenas de caracteres. Usualmente, este tipo de instrucciones es imposible de tratar por medio de compiladores. Los lenguajes que incluyen este tipo de operadores y que, por tanto, exigen un intérprete, se llaman interpretativos. Los lenguajes compiladores, que permiten el uso de un compilador, prescinden de este tipo de operadores.
Los compiladores difieren de los intérpretes en varios aspectos:
* Un programa que ha sido compilado puede correr por sí solo, pues en el proceso de compilación se lo transformo en otro lenguaje (lenguaje máquina).
* Un intérprete traduce el programa cuando lo lee, convirtiendo el código del programa directamente en acciones.
* La ventaja del intérprete es que dado cualquier programa se puede interpretarlo en cualquier plataforma (sistema operativo), en cambio el archivo generado por el compilador solo funciona en la plataforma en donde se lo ha creado.
* Pero por otro lado un archivo compilado puede ser distribuido fácilmente conociendo la plataforma, mientras que un archivo interpretado no funciona si no se tiene el intérprete.
* Hablando de la velocidad de ejecución un archivo compilado es de 10 a 20 veces más rápido que un archivo interpretado.
domingo, 8 de agosto de 2010
ACTIVIDAD 2
1. LENGUAJE DE PROGRAMACIÓN
Un lenguaje de programación es un idioma artificial diseñado para expresar computaciones que pueden ser llevadas a cabo por máquinas como las computadoras. Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana. Está formado de un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el código fuente de un programa informático se le llama programación.
También la palabra programación se define como el proceso de creación de un programa de computadora, mediante la aplicación de procedimientos lógicos, a través de los siguientes pasos:
• El desarrollo lógico del programa para resolver un problema en particular.
• Escritura de la lógica del programa empleando un lenguaje de programación específico (codificación del programa)
• Ensamblaje o compilación del programa hasta convertirlo en lenguaje de máquina.
• Prueba y depuración del programa.
• Desarrollo de la documentación.
Existe un error común que trata por sinónimos los términos 'lenguaje de programación' y 'lenguaje informático'. Los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo el HTML. (Lenguaje para el marcado de páginas web que no es propiamente un lenguaje de programación sino un conjunto de instrucciones que permiten diseñar el contenido y el texto de los documentos)
Permite especificar de manera precisa sobre qué datos debe operar una computadora, cómo deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural, tal como sucede con el lenguaje Léxico. Una característica relevante de los lenguajes de programación es precisamente que más de un programador pueda usar un conjunto común de instrucciones que sean comprendidas entre ellos para realizar la construcción del programa de forma colaborativa.
Los lenguajes de programación son herramientas que nos permiten crear programas y software. Entre ellos tenemos Del phi, Visual Basic, Pascal, Java, etc.
Una computadora funciona bajo control de un programa el cual debe estar almacenado en la unidad de memoria; tales como el disco duro.
Los lenguajes de programación de una computadora en particular se conocen como código de máquinas o lenguaje de máquinas.
2. JAVA
Es un lenguaje de programación orientado a objetos desarrollado por Sun Microsystems a principios de los años 90. El lenguaje en sí mismo toma mucha de su sintaxis de C y C++, pero tiene un modelo de objetos más simple y elimina herramientas de bajo nivel, que suelen inducir a muchos errores, como la manipulación directa de punteros o memoria.
Las aplicaciones Java están típicamente compiladas en un bytecode, aunque la compilación en código máquina nativo también es posible. En el tiempo de ejecución, el bytecode es normalmente interpretado o compilado a código nativo para la ejecución, aunque la ejecución directa por hardware del bytecode por un procesador Java también es posible.
La implementación original y de referencia del compilador, la máquina virtual y las bibliotecas de clases de Java fueron desarrolladas por Sun Microsystems en 1995. Desde entonces, Sun ha controlado las especificaciones, el desarrollo y evolución del lenguaje a través del Java Community Process, si bien otros han desarrollado también implementaciones alternativas de estas tecnologías de Sun, algunas incluso bajo licencias de software libre.
Entre noviembre de 2006 y mayo de 2007, Sun Microsystems liberó la mayor parte de sus tecnologías Java bajo la licencia GNU GPL, de acuerdo con las especificaciones del Java Community Process, de tal forma que prácticamente todo el Java de Sun es ahora software libre (aunque la biblioteca de clases de Sun que se requiere para ejecutar los programas Java aún no lo es).
El lenguaje Java se creó con cinco objetivos principales:
1. Debería usar la metodología de la programación orientada a objetos.
2. Debería permitir la ejecución de un mismo programa en múltiples sistemas operativos.
3. Debería incluir por defecto soporte para trabajo en red.
4. Debería diseñarse para ejecutar código en sistemas remotos de forma segura.
5. Debería ser fácil de usar y tomar lo mejor de otros lenguajes orientados a objetos, como C++.
Para conseguir la ejecución de código remoto y el soporte de red, los programadores de Java a veces recurren a extensiones como CORBA (Common Object Request Broker Architecture), Internet Communications Engine u OSGi respectivamente.
Orientado a Objetos
La primera característica, orientado a objetos (“OO”), se refiere a un método de programación y al diseño del lenguaje. Aunque hay muchas interpretaciones para OO, una primera idea es diseñar el software de forma que los distintos tipos de datos que usen estén unidos a sus operaciones. Así, los datos y el código (funciones o métodos) se combinan en entidades llamadas objetos. Un objeto puede verse como un paquete que contiene el “comportamiento” (el código) y el “estado” (datos). El principio es separar aquello que cambia de las cosas que permanecen inalterables. Frecuentemente, cambiar una estructura de datos implica un cambio en el código que opera sobre los mismos, o viceversa. Esta separación en objetos coherentes e independientes ofrece una base más estable para el diseño de un sistema software. El objetivo es hacer que grandes proyectos sean fáciles de gestionar y manejar, mejorando como consecuencia su calidad y reduciendo el número de proyectos fallidos. Otra de las grandes promesas de la programación orientada a objetos es la creación de entidades más genéricas (objetos) que permitan la reutilización del software entre proyectos, una de las premisas fundamentales de la Ingeniería del Software. Un objeto genérico “cliente”, por ejemplo, debería en teoría tener el mismo conjunto de comportamiento en diferentes proyectos, sobre todo cuando estos coinciden en cierta medida, algo que suele suceder en las grandes organizaciones. En este sentido, los objetos podrían verse como piezas reutilizables que pueden emplearse en múltiples proyectos distintos, posibilitando así a la industria del software a construir proyectos de envergadura empleando componentes ya existentes y de comprobada calidad; conduciendo esto finalmente a una reducción drástica del tiempo de desarrollo. Podemos usar como ejemplo de objeto el aluminio. Una vez definidos datos (peso, maleabilidad, etc.), y su “comportamiento” (soldar dos piezas, etc.), el objeto “aluminio” puede ser reutilizado en el campo de la construcción, del automóvil, de la aviación, etc.
La reutilización del software ha experimentado resultados dispares, encontrando dos dificultades principales: el diseño de objetos realmente genéricos es pobremente comprendido, y falta una metodología para la amplia comunicación de oportunidades de reutilización. Algunas comunidades de “código abierto” (open source) quieren ayudar en este problema dando medios a los desarrolladores para diseminar la información sobre el uso y versatilidad de objetos reutilizables y bibliotecas de objetos.
Independencia de la plataforma
La segunda característica, la independencia de la plataforma, significa que programas escritos en el lenguaje Java pueden ejecutarse igualmente en cualquier tipo de hardware. Este es el significado de ser capaz de escribir un programa una vez y que pueda ejecutarse en cualquier dispositivo, tal como reza el axioma de Java, ‘’’write once, run everywhere’’’.
Para ello, se compila el código fuente escrito en lenguaje Java, para generar un código conocido como “bytecode” (específicamente Java bytecode) instrucciones máquina simplificadas específicas de la plataforma Java. Esta pieza está “a medio camino” entre el código fuente y el código máquina que entiende el dispositivo destino. El bytecode es ejecutado entonces en la máquina virtual (JVM), un programa escrito en código nativo de la plataforma destino (que es el que entiende su hardware), que interpreta y ejecuta el código. Además, se suministran bibliotecas adicionales para acceder a las características de cada dispositivo (como los gráficos, ejecución mediante hebras o threads, la interfaz de red) de forma unificada. Se debe tener presente que, aunque hay una etapa explícita de compilación, el bytecode generado es interpretado o convertido a instrucciones máquina del código nativo por el compilador JIT (Just In Time).
Hay implementaciones del compilador de Java que convierten el código fuente directamente en código objeto nativo, como GCJ. Esto elimina la etapa intermedia donde se genera el bytecode, pero la salida de este tipo de compiladores sólo puede ejecutarse en un tipo de arquitectura.
La licencia sobre Java de Sun insiste que todas las implementaciones sean “compatibles”. Esto dio lugar a una disputa legal entre Microsoft y Sun, cuando éste último alegó que la implementación de Microsoft no daba soporte a las interfaces RMI y JNI además de haber añadido características ‘’dependientes’’ de su plataforma. Sun demandó a Microsoft y ganó por daños y perjuicios (unos 20 millones de dólares) así como una orden judicial forzando la acatación de la licencia de Sun. Como respuesta, Microsoft no ofrece Java con su versión de sistema operativo, y en recientes versiones de Windows, su navegador Internet Explorer no admite la ejecución de applets sin un conector (o plugin) aparte. Sin embargo, Sun y otras fuentes ofrecen versiones gratuitas para distintas versiones de Windows.
Las primeras implementaciones del lenguaje usaban una máquina virtual interpretada para conseguir la portabilidad. Sin embargo, el resultado eran programas que se ejecutaban comparativamente más lentos que aquellos escritos en C o C++. Esto hizo que Java se ganase una reputación de lento en rendimiento. Las implementaciones recientes de la JVM dan lugar a programas que se ejecutan considerablemente más rápido que las versiones antiguas, empleando diversas técnicas, aunque sigue siendo mucho más lento que otros lenguajes.
La primera de estas técnicas es simplemente compilar directamente en código nativo como hacen los compiladores tradicionales, eliminando la etapa del bytecode. Esto da lugar a un gran rendimiento en la ejecución, pero tapa el camino a la portabilidad. Otra técnica, conocida como compilación JIT (Just In Time, o ‘’’compilación al vuelo’’’), convierte el bytecode a código nativo cuando se ejecuta la aplicación. Otras máquinas virtuales más sofisticadas usan una ‘’’re compilación dinámica’’’ en la que la VM es capaz de analizar el comportamiento del programa en ejecución y recompila y optimiza las partes críticas. La re compilación dinámica puede lograr mayor grado de optimización que la compilación tradicional (o estática), ya que puede basar su trabajo en el conocimiento que de primera mano tiene sobre el entorno de ejecución y el conjunto de clases cargadas en memoria. La compilación JIT y la re compilación dinámica permiten a los programas Java aprovechar la velocidad de ejecución del código nativo sin por ello perder la ventaja de la portabilidad en ambos.
La portabilidad es técnicamente difícil de lograr, y el éxito de Java en ese campo ha sido dispar. Aunque es de hecho posible escribir programas para la plataforma Java que actúen de forma correcta en múltiples plataformas de distinta arquitectura, el gran número de estas con pequeños errores o inconsistencias llevan a que a veces se parodie el eslogan de Sun, "Write once, run anywhere" como "Write once, debug everywhere" (o “Escríbelo una vez, ejecútalo en cualquier parte” por “Escríbelo una vez, depúralo en todas partes”)
El concepto de independencia de la plataforma de Java cuenta, sin embargo, con un gran éxito en las aplicaciones en el entorno del servidor, como los Servicios Web, los Servlets, los Java Beans, así como en sistemas empotrados basados en OSGi, usando entornos Java empotrados.
El recolector de basura
En Java el problema de las fugas de memoria se evita en gran medida gracias a la recolección de basura (o automatic garbage collector). El programador determina cuándo se crean los objetos y el entorno en tiempo de ejecución de Java (Java runtime) es el responsable de gestionar el ciclo de vida de los objetos. El programa, u otros objetos pueden tener localizado un objeto mediante una referencia a éste. Cuando no quedan referencias a un objeto, el recolector de basura de Java borra el objeto, liberando así la memoria que ocupaba previniendo posibles fugas (ejemplo: un objeto creado y únicamente usado dentro de un método sólo tiene entidad dentro de éste; al salir del método el objeto es eliminado). Aun así, es posible que se produzcan fugas de memoria si el código almacena referencias a objetos que ya no son necesarios-es decir, pueden aún ocurrir, pero en un nivel conceptual superior. En definitiva, el recolector de basura de Java permite una fácil creación y eliminación de objetos, mayor seguridad y puede que más rápida que en C++
3. MAQUINA VIRTUAL
En informática una máquina virtual es un software que emula a una computadora y puede ejecutar programas como si fuese una computadora real. Este software en un principio fue definido como "un duplicado eficiente y aislado de una máquina física". La acepción del término actualmente incluye a máquinas virtuales que no tienen ninguna equivalencia directa con ningún hardware real.
Una característica esencial de las máquinas virtuales es que los procesos que ejecutan están limitados por los recursos y abstracciones proporcionados por ellas. Estos procesos no pueden escaparse de esta "computadora virtual".
Uno de los usos domésticos más extendidos de las máquinas virtuales es ejecutar sistemas operativos para "probarlos". De esta forma podemos ejecutar un sistema operativo que queramos probar (Linux, por ejemplo) desde nuestro sistema operativo habitual (Mac OS X por ejemplo) sin necesidad de instalarlo directamente en nuestra computadora y sin miedo a que se desconfigure el sistema operativo primario.
Las máquinas virtuales se pueden clasificar en dos grandes categorías según su funcionalidad y su grado de equivalencia a una verdadera máquina.
• Máquinas virtuales de sistema (en inglés System Virtual Machine)
• Máquinas virtuales de proceso (en inglés Process Virtual Machine)
Máquinas virtuales de sistema
Las máquinas virtuales de alivio sistema, también llamadas máquinas virtuales de hardware, permiten a la máquina física subyacente multiplexarse entre varias máquinas virtuales, cada una ejecutando su propio sistema operativo. A la capa de software que permite la virtualización se la llama monitor de máquina virtual o "hypervisor". Un monitor de máquina virtual puede ejecutarse o bien directamente sobre el hardware o bien sobre un sistema operativo ("host operating system").
Aplicaciones de las máquinas virtuales de sistema
• Varios sistemas operativos distintos pueden coexistir sobre la misma computadora, en sólido aislamiento el uno del otro, por ejemplo para probar un sistema operativo nuevo sin necesidad de instalarlo directamente.
• La máquina virtual puede proporcionar una arquitectura de instrucciones (ISA) que sea algo distinta de la verdadera máquina. Es decir, podemos simular hardware.
• Varias máquinas virtuales (cada una con su propio sistema operativo llamado sistema operativo "invitado" o "guest"), pueden ser utilizadas para consolidar servidores. Esto permite que servicios que normalmente se tengan que ejecutar en computadoras distintas para evitar interferencias, se puedan ejecutar en la misma máquina de manera completamente aislada y compartiendo los recursos de una única computadora. La consolidación de servidores a menudo contribuye a reducir el coste total de las instalaciones necesarias para mantener los servicios, dado que permiten ahorrar en hardware.
• La virtualización es una excelente opción hoy día, ya que las máquinas actuales (Laptops, desktops, servidores) en la mayoría de los casos están siendo "sub-utilizados" (gran capacidad de disco duro, memoria RAM, etc.), llegando a un uso de entre 30% a 60% de su capacidad. Al virtualizar, la necesidad de nuevas máquinas en una ya existente permite un ahorro considerable de los costos asociados (energía, mantenimiento, espacio, etc.).
Máquinas virtuales de proceso
Una máquina virtual de proceso, a veces llamada "máquina virtual de aplicación", se ejecuta como un proceso normal dentro de un sistema operativo y soporta un solo proceso. La máquina se inicia automáticamente cuando se lanza el proceso que se desea ejecutar y se para cuando éste finaliza. Su objetivo es el de proporcionar un entorno de ejecución independiente de la plataforma de hardware y del sistema operativo, que oculte los detalles de la plataforma subyacente y permita que un programa se ejecute siempre de la misma forma sobre cualquier plataforma.
El ejemplo más conocido actualmente de este tipo de máquina virtual es la máquina virtual de Java. Otra máquina virtual muy conocida es la del entorno .Net de Microsoft que se llama "Common Language Runtime".
4. JDK
El Java Development Kit, JDK por sus siglas en inglés, es un grupo de herramientas para el desarrollo de software provisto por Sun Microsystems, Inc. Incluye las herramientas necesarias para escribir, testear, y depurar aplicaciones y applets de Java.
5. ENTORNO DE PROGRAMACIÓN
• Siguiendo la terminología anterior, es el banco de trabajo del programador
• Da soporte a las actividades de la fase de codificación (preparación del código y prueba de unidades)
• Los mismos productos sirven también para el diseño detallado y para las pruebas de integración.
• Se sitúa, por tanto, en la parte central del ciclo de desarrollo.
Funciones de un Entorno de Programación
· Como se ha dicho, la misión de un Entorno de Programación es dar soporte a la preparación de programas, es decir, a las actividades de codificación y pruebas.
* Las tareas esenciales de la fase de codificación son:
o Edición (creación y modificación) del código fuente
o Proceso/ejecución del programa
+ Interpretación directa (código fuente)
+ Compilación (código máquina) - montaje - ejecución
+ Compilación (código intermedio) - interpretación
* Otras funciones:
o Examinar (hojear) el código fuente
o Analizar consistencia, calidad, etc.
o Ejecutar en modo depuración
o Ejecución automática de pruebas
o Control de versiones
o Generar documentación, reformar código
o ... y otras muchas más ...
Tipos de Entornos de Programación
Un entorno de programación puede estar concebido y organizado de maneras muy diferentes. A continuación se mencionan algunas de ellas.
En las primeras etapas de la informática la preparación de programas se realizaba mediante una cadena de operaciones tales como la que se muestra en la figura para un lenguaje procesado mediante compilador. Cada una de las herramientas debía invocarse manualmente por separado. En estas condiciones no puede hablarse propiamente de un entorno de programación.
o El editor es un editor de texto simple
o El compilador traduce cada fichero de código fuente a código objeto
o El montador (linker / builder / loader) combina varios ficheros objeto para generar un fichero ejecutable
o El depurador maneja información en términos de lenguaje de máquina
* Un entorno de programación propiamente dicho combina herramientas como éstas, mejoradas y mejor integradas. A veces se nombra con las siglas IDE (Integrated Development Environment). Los componentes cuya evolución ha sido más aparente son los que realizan la interacción con el usuario:
o El editor ya no es un simple editor de texto, sino que tiene una clara orientación al lenguaje de programación usado (reconoce y maneja determinados elementos sintácticos)
o El depurador no presenta información en términos del lenguaje de máquina, sino del lenguaje fuente
o El editor está bien integrado con las demás herramientas (se posiciona directamente en los puntos del código fuente en los que hay errores de compilación, o que se están ejecutando con el depurador en un momento dado.
* No es fácil establecer una clasificación dentro de la variedad de entornos de programación existentes. En algún momento se describieron las siguientes clases de entornos, no excluyentes:
o Entornos centrados en un lenguaje
o Entornos orientados a estructura
o Entornos colección de herramientas
6. TIPOS DE DATOS (JAVA)
Los tipos de datos de Java se clasifican en:
TDP: Tipo de Dato Primitivo, e.g. enteros, flotantes y caracteres
TDA: Tipo de Dato Abstracto, Clase ó Referencia, e.g. cadenas, estructuras de datos, objetos, etc.
viernes, 6 de agosto de 2010
ACTIVIDAD 1
1. ENCAPSULAMIENTO
El encapsulamiento consiste en unir en la Clase las características y comportamientos, esto es, las variables y métodos. Es tener todo esto es una sola entidad. En los lenguajes estructurados esto era imposible. Es evidente que el encapsulamiento se logra gracias a la abstracción y el ocultamiento que veremos a continuación.
La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que tendremos a las Clases como cajas negras donde sólo se conoce el comportamiento pero no los detalles internos, y esto es conveniente porque nos interesará será conocer qué hace la Clase pero no será necesario saber cómo lo hace.
2. HERENCIA
La herencia es uno de los conceptos más cruciales en la POO. La herencia básicamente consiste en que una clase puede heredar sus variables y métodos a varias subclases (la clase que hereda es llamada superclase o clase padre). Esto significa que una subclase, aparte de los atributos y métodos propios, tiene incorporados los atributos y métodos heredados de la superclase. De esta manera se crea una jerarquía de herencia.
Java permite el empleo de la herencia , característica muy potente que permite definir una clase tomando como base a otra clase ya existente. Esto es una de las bases de la reutilización de código, en lugar de copiar y pegar.
En java, como ya vimos la herencia se especifica agregando la clausula extends después del nombre de la clase. En la clausula extends indicaremos el nombre de la clase base de la cuál queremos heredar.
Al heredar de una clase base, heredaremos tanto los atributos como los métodos, mientras que los constructores son utilizados, pero no heredados.
3. POLIMORFISMO
En programación orientada a objetos el polimorfismo se refiere a la posibilidad de definir clases diferentes que tienen métodos o atributos denominados de forma idéntica, pero que se comportan de manera distinta.
Por ejemplo, podemos crear dos clases distintas: Pez y Ave que heredan de la superclase Animal. La clase Animal tiene el método abstracto mover que se implementa de forma distinta en cada una de las subclases (peces y aves se mueven de forma distinta).
Como se mencionó anteriormente, el concepto de polimorfismo se puede aplicar tanto a funciones como a tipos de datos. Así nacen los conceptos de funciones polimórficas y tipos polimórficos. Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; los tipos polimórficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no está especificado.
4. MODULARIDAD
En programación modular, y más específicamente en programación orientada a objetos, se denomina Modularidad a La propiedad que permite subdividir una aplicación en partes más pequeñas (llamadas módulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes.
Estos módulos que se puedan compilar por separado, pero que tienen conexiones con otros módulos. Al igual que la encapsulación, los lenguajes soportan la Modularidad de diversas formas.
Descomponer un programa en un número pequeño de abstracciones coherentes que pertenecen al dominio del problema y enmascaran la complejidad interna.
* Existen muchas acepciones del concepto de modularidad.
* Van desde una subrutina hasta la asignación de trabajo para un programador.
* La modularidad consiste en subdividir el software en partes denominadas módulos, cada uno con un propósito especifico, que se integran para satisfacer los requerimientos de un problema.
* La modularidad es el atributo más sencillo del software, que permite a un programa ser manejable intelectualmente.
* Asimismo, la modularidad es un enfoque comúnmente aceptado tanto para análisis como para diseño.
5. PRINCIPIO ALTA COHESION Y BAJO ACOPLAMIENTO
Los conceptos de cohesión y acoplamiento están íntimamente relacionados. Un mayor grado de cohesión implica uno menor de acoplamiento. Maximizar el nivel de cohesión intramodular en todo el sistema resulta en una minimización del acoplamiento intermodular.
Alta cohesión
Nos dice que la información que almacena una clase debe de ser coherente y debe estar (en la medida de lo posible) relacionada con la clase.
a. Cohesión Coincidente: El módulo realiza múltiples tareas, sin ninguna relación entre ellas.
b. Cohesión Lógica: El módulo realiza múltiples tareas relacionadas, pero, en tiempo de ejecución, sólo una de ellas será llevada a cabo.
c. Cohesión Temporal: Las tareas llevadas a cabo por un módulo tienen, como única relación el deber ser ejecutadas “al mismo tiempo”.
d. Cohesión de Procedimiento: La única relación que guardan las tareas de un módulo es que corresponden a una secuencia de pasos propia del “producto”.
e. Cohesión de Comunicación: Las tareas corresponden a una secuencia de pasos propia del “producto” y todas afectan a los mismos datos.
f. Cohesión de Información: Las tareas llevadas a cabo por un módulo tienen su propio punto de arranque, su codificación independiente y trabajan sobre los mismos datos. El ejemplo típico: OBJETOS
g. Cohesión Funcional: Cuando el módulo ejecuta una y sólo una tarea, teniendo un único objetivo a cumplir, se dice que tiene Cohesividad Funcional.
Bajo acoplamiento
Es la idea de tener las clases lo menos ligadas entre sí que se pueda. De tal forma que en caso de producirse una modificación en alguna de ellas, se tenga la mínima repercusión posible en el resto de clases, potenciando la reutilización, y disminuyendo la dependencia entre las clases
a. Acoplamiento de Contenido: Cuando un módulo referencia directamente el contenido de otro módulo. (En lenguajes de alto nivel es muy raro)
b. Acoplamiento Común: Cuando dos módulos acceden (y afectan) a un mismo valor global.
c. Acoplamiento de Control: Cuando un módulo le envía a otro un elemento de control que determina la lógica de ejecución del mismo.
A. COHESIÓN
La cohesión mide el costo del cambio dentro de un elemento. Un elemento es cohesivo a medida que cambia el elemento entero cuando el sistema necesita cambiar.
Un elemento puede tener poca cohesión tanto por ser muy grande o muy pequeño. Un elemento muy pequeño, que resuelve sólo una parte del problema, va a necesitar estar acoplado a otros elementos para resolver las otras partes del problema. Si cambia la solución se va a necesitar cambiar todos los elementos. Un elemento que resuelve muchos problemas sólo va a necesitar cambiarse en parte. Esto es más riesgoso y más costoso que cambiar un elemento completo, porque primero se necesita averiguar qué parte del elemento debe cambiarse, y luego probar que las partes sin cambios del elemento realmente sigan sin cambios. Los elementos cohesivos, que se reemplazan en su totalidad, no tienen estos costos.
La estrategia de aislar los cambios es una forma de inducir la cohesión antes de hacer un cambio; por ejemplo, extraer la parte de un método que necesita cambiarse dentro de un método propio antes de hacer el cambio.
B. ACOPLAMIENTO
Dos elementos están acoplados en la medida en el que los cambios en uno tienden a necesitar cambios en el otro. Por ejemplo, la comunicación por red entre dos sistemas está acoplada respecto a cambios en el protocolo - si un sistema necesita cambiar el protocolo, el otro va a necesitar cambiar también. El acoplamiento entre los elementos es un conductor de cambios.
Empezaremos por el acoplamiento. El término "acoplamiento" hace alusión al grado de dependencia que tienen dos unidades de software. Tiempo atrás se utilizaba la palabra "módulo" o "subrutina" en lugar de unidad de software. Hoy en día, en opinión del que escribe, la palabra "módulo" es completamente inadecuada y obsoleta. Mejor utilizaremos "unidad de software", que es un concepto más amplio.
Bien... ¿Qué es una unidad de software? Pues simplemente cualquier pieza de software que realice algún cometido. Por ejemplo: una función, un método, una clase, una librería, una aplicación, un componente, etc.
Si hablamos de funciones, el acoplamiento nos da una idea de lo dependientes que son dos funciones entre sí. Es decir, en qué grado una función puede hacer su trabajo sin la otra. Si hablamos de librerías, el acoplamiento nos dará una idea de en qué medida el contenido de una librería puede hacer su trabajo sin la otra.
Cuando dos unidades de software son absolutamente independientes (cada una puede hacer su trabajo sin contar para nada con la otra), encontramos el grado más bajo de acoplamiento, y decimos que ambas unidades están totalmente desacopladas.
Nuestro objetivo al programar o diseñar debe ser el de tener un acoplamiento lo más bajo posible entre dos unidades de software cualesquiera. Por supuesto, es imposible lograr un desacoplamiento total entre las unidades. Sin embargo, manteniendo lo más bajo posible el acoplamiento lograremos que las distintas "piezas" de nuestro software funcionen sin depender demasiado unas de otras. Eso redunda en una mejora considerable en la detección y corrección de errores, en una mayor facilidad de mantenimiento y sobre todo, en la reutilización de esas "piezas" de software.
6. PRINCIPIO ABIERTO-CERRADO
Las entidades software deben estar abiertas para su extensión, pero cerradas para su modificación.
Bertrán Meyer
• Sistema funcionando (cerrado), pero ampliable (abierto).
• Conseguir cambios añadiendo nuevo código sin afectar al resto de elementos del diseño.
7. CLASE
Una clase es la estructura de un objeto, es decir, la definición de todos los elementos de que está hecho un objeto. Un objeto es, por lo tanto, el "resultado" de una clase. En realidad, un objeto es una instancia de una clase, por lo que se pueden intercambiar los términos objeto o instancia (o incluso evento).
Una clase se compone de dos partes:
• Atributos (denominados, por lo general, datos miembros): esto es, los datos que se refieren al estado del objeto
• Métodos (denominados, por lo general, funciones miembros): son funciones que pueden aplicarse a objetos
Si tenemos una clase llamada auto, los objetos Peugeot y Renault serán instancias de esa clase. También puede haber otros objetos Peugeot 406, diferenciados por su número de modelo. Asimismo, dos instancias de una clase pueden tener los mismos atributos, pero considerarse objetos distintos independientes. En un contexto real: dos camisas pueden ser idénticas, pero no obstante, también ser diferentes de alguna manera. Sin embargo, si las mezclamos es imposible distinguir una de la otra.
8. INSTANCIA
Bien, decíamos que una clase es como la definición de un objeto, pero no es el objeto en sí, del modo como una idea no es una cosa física (el ejemplo de la silla). Así que para sentarnos necesitaremos convertir esa idea en algo, en un objeto real; a ese objeto lo llamamos instancia.
En un mismo proyecto puedo tener una o más instancias de una misma clase sin problemas.
Cada vez que creamos una nueva instancia, ésta adquiere las propiedades, métodos y eventos de la clase a la que pertenece (es lo que permite la relación es un), sin embargo, cada instancia es independiente de las otras; esto nos da dos ventajas:
1. Si hago algún cambio en la clase, todas las instancias de esta clase se actualizarán automáticamente; esto nos permite hacer cambios sin tener que ir a cada una de las instancias (se aplica el mismo principio de herencia, aunque a un nivel diferente).
2. Al ser independientes de las otras instancias, puedo darles valores diferentes sin que afecten a las demás (como tener una silla negra, una roja, una más alta, etc.). Aunque comparten la misma estructura, pueden programarse individualmente, dando versatilidad y flexibilidad al código.
9. PASO DE MENSAJES
Mediante el denominado paso de mensajes, un objeto puede solicitar de otro objeto que realice una acción determinada o que modifique su estado. El paso de mensajes se suele implementar como llamadas a los métodos de otros objetos.
Desde el punto de vista de la programación estructurada, esto correspondería con la llamada a funciones.
10. ATRIBUTO
Los atributos son las características individuales que diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables.
Las variables de instancia también denominados miembros dato, son declaradas en la clase pero sus valores son fijados y cambiados en el objeto.
Además de las variables de instancia hay variables de clase, las cuales se aplican a la clase y a todas sus instancias. Por ejemplo, el número de ruedas de un automóvil es el mismo cuatro, para todos los automóviles.
11. METODO
Son los métodos de una clase son funciones propias de la misma, formando parte de su definición. Cada instancia de la clase contiene los métodos y atributos particulares de la misma. Los métodos de una clase operan sobre los atributos particulares. La llamada de un método es similar a la consulta de un atributo.
Los paréntesis son obligatorios para la definición de los métodos aunque no se emplee ningún argumento. Una de las consecuencias de que Java sea un lenguaje orientado a objetos es que todo el código que se escriba ha de estar incluido dentro de una clase.
La creación de un objeto mediante new involucra la invocación de un método especial de la clase denominado constructor, encargado de realizar las funciones de inicialización necesarias para la correcta creación del objeto. El compilador de Java introduce un constructor de forma implícita si el programador no proporciona un constructor propio.
Los lenguajes orientados a objetos, proporcionan mecanismos que refuerzan el modelo orientado a objetos. Los mecanismos fundamentales se llaman encapsulado, herencia y polimorfismo.
12. CONSTRUCTOR
En una clase existe una función miembro muy particular llamada Constructor.
Un constructor es una función que debe tener el mismo nombre que la clase y no debe retornar ningún valor, (ni siquiera void), y se encarga de asignarle valores iniciales, (o simplemente inicializar), a los datos miembros.
En el ejemplo descubrirá que allí no hay ningún constructor definido, cuando ocurre esto el compilador de C++ crea en ejecución el constructor.
No obstante hubiera sido correcto haber definido un constructor que se encargara de, por ejemplo, inicializar con 0 los datos miembros.
Un constructor es invocado automáticamente cuando se crea la instancia, o sea que no hay llamarlo explícitamente desde el programa principal.
El encapsulamiento consiste en unir en la Clase las características y comportamientos, esto es, las variables y métodos. Es tener todo esto es una sola entidad. En los lenguajes estructurados esto era imposible. Es evidente que el encapsulamiento se logra gracias a la abstracción y el ocultamiento que veremos a continuación.
La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que tendremos a las Clases como cajas negras donde sólo se conoce el comportamiento pero no los detalles internos, y esto es conveniente porque nos interesará será conocer qué hace la Clase pero no será necesario saber cómo lo hace.
2. HERENCIA
La herencia es uno de los conceptos más cruciales en la POO. La herencia básicamente consiste en que una clase puede heredar sus variables y métodos a varias subclases (la clase que hereda es llamada superclase o clase padre). Esto significa que una subclase, aparte de los atributos y métodos propios, tiene incorporados los atributos y métodos heredados de la superclase. De esta manera se crea una jerarquía de herencia.
Java permite el empleo de la herencia , característica muy potente que permite definir una clase tomando como base a otra clase ya existente. Esto es una de las bases de la reutilización de código, en lugar de copiar y pegar.
En java, como ya vimos la herencia se especifica agregando la clausula extends después del nombre de la clase. En la clausula extends indicaremos el nombre de la clase base de la cuál queremos heredar.
Al heredar de una clase base, heredaremos tanto los atributos como los métodos, mientras que los constructores son utilizados, pero no heredados.
3. POLIMORFISMO
En programación orientada a objetos el polimorfismo se refiere a la posibilidad de definir clases diferentes que tienen métodos o atributos denominados de forma idéntica, pero que se comportan de manera distinta.
Por ejemplo, podemos crear dos clases distintas: Pez y Ave que heredan de la superclase Animal. La clase Animal tiene el método abstracto mover que se implementa de forma distinta en cada una de las subclases (peces y aves se mueven de forma distinta).
Como se mencionó anteriormente, el concepto de polimorfismo se puede aplicar tanto a funciones como a tipos de datos. Así nacen los conceptos de funciones polimórficas y tipos polimórficos. Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; los tipos polimórficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no está especificado.
4. MODULARIDAD
En programación modular, y más específicamente en programación orientada a objetos, se denomina Modularidad a La propiedad que permite subdividir una aplicación en partes más pequeñas (llamadas módulos), cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y de las restantes partes.
Estos módulos que se puedan compilar por separado, pero que tienen conexiones con otros módulos. Al igual que la encapsulación, los lenguajes soportan la Modularidad de diversas formas.
Descomponer un programa en un número pequeño de abstracciones coherentes que pertenecen al dominio del problema y enmascaran la complejidad interna.
* Existen muchas acepciones del concepto de modularidad.
* Van desde una subrutina hasta la asignación de trabajo para un programador.
* La modularidad consiste en subdividir el software en partes denominadas módulos, cada uno con un propósito especifico, que se integran para satisfacer los requerimientos de un problema.
* La modularidad es el atributo más sencillo del software, que permite a un programa ser manejable intelectualmente.
* Asimismo, la modularidad es un enfoque comúnmente aceptado tanto para análisis como para diseño.
5. PRINCIPIO ALTA COHESION Y BAJO ACOPLAMIENTO
Los conceptos de cohesión y acoplamiento están íntimamente relacionados. Un mayor grado de cohesión implica uno menor de acoplamiento. Maximizar el nivel de cohesión intramodular en todo el sistema resulta en una minimización del acoplamiento intermodular.
Alta cohesión
Nos dice que la información que almacena una clase debe de ser coherente y debe estar (en la medida de lo posible) relacionada con la clase.
a. Cohesión Coincidente: El módulo realiza múltiples tareas, sin ninguna relación entre ellas.
b. Cohesión Lógica: El módulo realiza múltiples tareas relacionadas, pero, en tiempo de ejecución, sólo una de ellas será llevada a cabo.
c. Cohesión Temporal: Las tareas llevadas a cabo por un módulo tienen, como única relación el deber ser ejecutadas “al mismo tiempo”.
d. Cohesión de Procedimiento: La única relación que guardan las tareas de un módulo es que corresponden a una secuencia de pasos propia del “producto”.
e. Cohesión de Comunicación: Las tareas corresponden a una secuencia de pasos propia del “producto” y todas afectan a los mismos datos.
f. Cohesión de Información: Las tareas llevadas a cabo por un módulo tienen su propio punto de arranque, su codificación independiente y trabajan sobre los mismos datos. El ejemplo típico: OBJETOS
g. Cohesión Funcional: Cuando el módulo ejecuta una y sólo una tarea, teniendo un único objetivo a cumplir, se dice que tiene Cohesividad Funcional.
Bajo acoplamiento
Es la idea de tener las clases lo menos ligadas entre sí que se pueda. De tal forma que en caso de producirse una modificación en alguna de ellas, se tenga la mínima repercusión posible en el resto de clases, potenciando la reutilización, y disminuyendo la dependencia entre las clases
a. Acoplamiento de Contenido: Cuando un módulo referencia directamente el contenido de otro módulo. (En lenguajes de alto nivel es muy raro)
b. Acoplamiento Común: Cuando dos módulos acceden (y afectan) a un mismo valor global.
c. Acoplamiento de Control: Cuando un módulo le envía a otro un elemento de control que determina la lógica de ejecución del mismo.
A. COHESIÓN
La cohesión mide el costo del cambio dentro de un elemento. Un elemento es cohesivo a medida que cambia el elemento entero cuando el sistema necesita cambiar.
Un elemento puede tener poca cohesión tanto por ser muy grande o muy pequeño. Un elemento muy pequeño, que resuelve sólo una parte del problema, va a necesitar estar acoplado a otros elementos para resolver las otras partes del problema. Si cambia la solución se va a necesitar cambiar todos los elementos. Un elemento que resuelve muchos problemas sólo va a necesitar cambiarse en parte. Esto es más riesgoso y más costoso que cambiar un elemento completo, porque primero se necesita averiguar qué parte del elemento debe cambiarse, y luego probar que las partes sin cambios del elemento realmente sigan sin cambios. Los elementos cohesivos, que se reemplazan en su totalidad, no tienen estos costos.
La estrategia de aislar los cambios es una forma de inducir la cohesión antes de hacer un cambio; por ejemplo, extraer la parte de un método que necesita cambiarse dentro de un método propio antes de hacer el cambio.
B. ACOPLAMIENTO
Dos elementos están acoplados en la medida en el que los cambios en uno tienden a necesitar cambios en el otro. Por ejemplo, la comunicación por red entre dos sistemas está acoplada respecto a cambios en el protocolo - si un sistema necesita cambiar el protocolo, el otro va a necesitar cambiar también. El acoplamiento entre los elementos es un conductor de cambios.
Empezaremos por el acoplamiento. El término "acoplamiento" hace alusión al grado de dependencia que tienen dos unidades de software. Tiempo atrás se utilizaba la palabra "módulo" o "subrutina" en lugar de unidad de software. Hoy en día, en opinión del que escribe, la palabra "módulo" es completamente inadecuada y obsoleta. Mejor utilizaremos "unidad de software", que es un concepto más amplio.
Bien... ¿Qué es una unidad de software? Pues simplemente cualquier pieza de software que realice algún cometido. Por ejemplo: una función, un método, una clase, una librería, una aplicación, un componente, etc.
Si hablamos de funciones, el acoplamiento nos da una idea de lo dependientes que son dos funciones entre sí. Es decir, en qué grado una función puede hacer su trabajo sin la otra. Si hablamos de librerías, el acoplamiento nos dará una idea de en qué medida el contenido de una librería puede hacer su trabajo sin la otra.
Cuando dos unidades de software son absolutamente independientes (cada una puede hacer su trabajo sin contar para nada con la otra), encontramos el grado más bajo de acoplamiento, y decimos que ambas unidades están totalmente desacopladas.
Nuestro objetivo al programar o diseñar debe ser el de tener un acoplamiento lo más bajo posible entre dos unidades de software cualesquiera. Por supuesto, es imposible lograr un desacoplamiento total entre las unidades. Sin embargo, manteniendo lo más bajo posible el acoplamiento lograremos que las distintas "piezas" de nuestro software funcionen sin depender demasiado unas de otras. Eso redunda en una mejora considerable en la detección y corrección de errores, en una mayor facilidad de mantenimiento y sobre todo, en la reutilización de esas "piezas" de software.
6. PRINCIPIO ABIERTO-CERRADO
Las entidades software deben estar abiertas para su extensión, pero cerradas para su modificación.
Bertrán Meyer
• Sistema funcionando (cerrado), pero ampliable (abierto).
• Conseguir cambios añadiendo nuevo código sin afectar al resto de elementos del diseño.
7. CLASE
Una clase es la estructura de un objeto, es decir, la definición de todos los elementos de que está hecho un objeto. Un objeto es, por lo tanto, el "resultado" de una clase. En realidad, un objeto es una instancia de una clase, por lo que se pueden intercambiar los términos objeto o instancia (o incluso evento).
Una clase se compone de dos partes:
• Atributos (denominados, por lo general, datos miembros): esto es, los datos que se refieren al estado del objeto
• Métodos (denominados, por lo general, funciones miembros): son funciones que pueden aplicarse a objetos
Si tenemos una clase llamada auto, los objetos Peugeot y Renault serán instancias de esa clase. También puede haber otros objetos Peugeot 406, diferenciados por su número de modelo. Asimismo, dos instancias de una clase pueden tener los mismos atributos, pero considerarse objetos distintos independientes. En un contexto real: dos camisas pueden ser idénticas, pero no obstante, también ser diferentes de alguna manera. Sin embargo, si las mezclamos es imposible distinguir una de la otra.
8. INSTANCIA
Bien, decíamos que una clase es como la definición de un objeto, pero no es el objeto en sí, del modo como una idea no es una cosa física (el ejemplo de la silla). Así que para sentarnos necesitaremos convertir esa idea en algo, en un objeto real; a ese objeto lo llamamos instancia.
En un mismo proyecto puedo tener una o más instancias de una misma clase sin problemas.
Cada vez que creamos una nueva instancia, ésta adquiere las propiedades, métodos y eventos de la clase a la que pertenece (es lo que permite la relación es un), sin embargo, cada instancia es independiente de las otras; esto nos da dos ventajas:
1. Si hago algún cambio en la clase, todas las instancias de esta clase se actualizarán automáticamente; esto nos permite hacer cambios sin tener que ir a cada una de las instancias (se aplica el mismo principio de herencia, aunque a un nivel diferente).
2. Al ser independientes de las otras instancias, puedo darles valores diferentes sin que afecten a las demás (como tener una silla negra, una roja, una más alta, etc.). Aunque comparten la misma estructura, pueden programarse individualmente, dando versatilidad y flexibilidad al código.
9. PASO DE MENSAJES
Mediante el denominado paso de mensajes, un objeto puede solicitar de otro objeto que realice una acción determinada o que modifique su estado. El paso de mensajes se suele implementar como llamadas a los métodos de otros objetos.
Desde el punto de vista de la programación estructurada, esto correspondería con la llamada a funciones.
10. ATRIBUTO
Los atributos son las características individuales que diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables.
Las variables de instancia también denominados miembros dato, son declaradas en la clase pero sus valores son fijados y cambiados en el objeto.
Además de las variables de instancia hay variables de clase, las cuales se aplican a la clase y a todas sus instancias. Por ejemplo, el número de ruedas de un automóvil es el mismo cuatro, para todos los automóviles.
11. METODO
Son los métodos de una clase son funciones propias de la misma, formando parte de su definición. Cada instancia de la clase contiene los métodos y atributos particulares de la misma. Los métodos de una clase operan sobre los atributos particulares. La llamada de un método es similar a la consulta de un atributo.
Los paréntesis son obligatorios para la definición de los métodos aunque no se emplee ningún argumento. Una de las consecuencias de que Java sea un lenguaje orientado a objetos es que todo el código que se escriba ha de estar incluido dentro de una clase.
La creación de un objeto mediante new involucra la invocación de un método especial de la clase denominado constructor, encargado de realizar las funciones de inicialización necesarias para la correcta creación del objeto. El compilador de Java introduce un constructor de forma implícita si el programador no proporciona un constructor propio.
Los lenguajes orientados a objetos, proporcionan mecanismos que refuerzan el modelo orientado a objetos. Los mecanismos fundamentales se llaman encapsulado, herencia y polimorfismo.
12. CONSTRUCTOR
En una clase existe una función miembro muy particular llamada Constructor.
Un constructor es una función que debe tener el mismo nombre que la clase y no debe retornar ningún valor, (ni siquiera void), y se encarga de asignarle valores iniciales, (o simplemente inicializar), a los datos miembros.
En el ejemplo descubrirá que allí no hay ningún constructor definido, cuando ocurre esto el compilador de C++ crea en ejecución el constructor.
No obstante hubiera sido correcto haber definido un constructor que se encargara de, por ejemplo, inicializar con 0 los datos miembros.
Un constructor es invocado automáticamente cuando se crea la instancia, o sea que no hay llamarlo explícitamente desde el programa principal.
Suscribirse a:
Entradas (Atom)