Fecha y hora actual: Jueves 17 Ene 2019 04:13
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Curso VB .NET - Tema 1.18 - Clases, fases - Java

Responder al Tema

Índice del Foro > Visual Basic .NET > Curso VB .NET - Tema 1.18 - Clases, fases - Java

Autor Mensaje
Tesis
Administrador


Registrado: 04 Mar 2007
Mensajes: 3200
Ubicación: Valencia - España

Mensaje Publicado: Miércoles 25 Mar 2009 20:31

Título del mensaje: Curso VB .NET - Tema 1.18 - Clases, fases - Java

Responder citando

Curso de programación en .NET - Tema 1.18 - Clases, fases - Java


1. Clases, Java fases en su ejecución.

1.1 Objetivos del tema.
Ver las distintas fases por las que pasa un objeto en Java, desde que se realiza la instancia del mismo en su clase hasta, que finaliza la existencia del mismo.

1.2 Introducción.
Es importante tener presente en que momento, cuando y como se van desarrollando las distintas etapas de la vida de un objeto, de esa forma no estaremos consumiendo recursos del sistema de forma innecesaria.
Un objeto es igual que un ser vivo, nace, crece y desaparece, lo que hay que hacer es ajustar esos pasos a las necesidades de nuestro programa.

  • Inicialización
  • Ejecución
  • Finalización


1.3 Iniciar la clase, crear una instancia.
Cuando se crea un objeto a partir de una clase, el primer paso es instanciar ese objeto, con una u otra sintaxis, se dispone de un constructor, un método especializado, que se ejecuta de forma automática al crearse el objeto de la clase en cuestión.

En Java es el método que coincide con el nombre de la clase.

Código:
package clasefases;
public class Clase
{
   int UnDato;
   // Constructor
   public Clase()
   {
   }
   public Clase(int AlgunDato)
   {
      UnDato = AlgunDato;
   }
}


En esa fase disponemos de la posibilidad de reclamar datos necesarios para la correcta ejecución de la clase, y es donde debemos o podemos realizar el control de los mismos.

Código:
package clasefases;
public class Clase
{
   int UnDato;
   // Constructor
   private Clase()
   {
   }
   // Constructor que obliga a que se introduzca un valor entero
   public Clase(int AlgunDato)
   {
      UnDato = AlgunDato;
   }
}


También podemos optar por no reclamar ninguna información y arrancar con los datos de nuestra clase inicializados a los valores que nosotros consideremos oportunos.

Código:
package clasefases;
public class Clase
{
   int UnDato = 10; // Variable incializada
   // Constructor
   public Clase()
   {
   }
}


Cualquiera de las dos soluciones es correcta, cual utilizar vendrá marcado por las circunstancias en las que se tenga que utilizar el objeto.

Código:
package clasefases;
public class Clase
{
   int UnDato;
   // Constructor
   private Clase()
   {
   }
   public Clase(int AlgunDato)
   {
      UnDato = AlgunDato;
   }
}


Es posible crear en la clase una zona de única ejecución, de tal forma que nos permita realizar acciones una única vez cuando la clase se instancia por primera vez.

Código:
package clasefases;
public class Clase
{
   int UnDato;
   static
   {
      System.out.println("Creación del objeto");
      System.out.println("Solo la primera vez");
   }
   // Constructor
   private Clase()
   {
   }
}


1.4 Proteger nuestra clase.
Se trata de bloquear el constructor sin argumentos convirtiéndolo en private.
En muchas ocasiones es imprescindible, sobre todo cuando deseamos exigir datos en la inicialización de la misma, y no deseamos que se inicie una copia de nuestra clase de forma accidental.

Código:
package clasefases;
public class Clase
{
   int UnDato;
   // Constructor bloqueado
   private Clase()
   {
   }
   // Constructor que obliga a que se introduzca un valor.
   public Clase(int AlgunDato)
   {
      UnDato = AlgunDato;
   }
}


De esa forma no es visible y no se puede utilizar, y es imposible que se use accidentalmente.
Normalmente es muy habitual que necesitemos varios escenarios posibles en el inicio de un objeto, por lo que la solicitud de datos en el constructor se puede volver algo complicada.

En las clases existe el concepto de sobrecarga, esto significa poder escribir varias versiones de un mismo método, - más adelante se expondrá el tema - , ese es el camino más adecuado para poder solventar el problema de los distintos escenarios posibles en el inicio de una clase para los objetos que se derivan de ella.

En el siguiente ejemplo, podemos observar como se han escrito varias versiones del constructor en el cual se ha declarado distintas versiones de la misma variable, String, Integer, aunque no tiene porque cambiar el nombre de la variable.

Código:
package clasefases;
public class Clase
{
   int UnDato;
   // Constructor bloqueado
   private Clase()
   {
   }
   // Constructor que obliga a que se introduzca un valor.
   public Clase(int AlgunDato)
   {
   }
   // Constructor que obliga a que se introduzcan un valor.
   public Clase(boolean AlgunDato)
   {
   }
}


Pero también se puede crear con distintas variables en cada uno de ellos.

Código:
package clasefases;
public class Clase
{
   int UnDato;
   // Constructor bloqueado
   private Clase()
   {
   }
   // Constructor que obliga a que se introduzca un valor.
   public Clase(int AlgunDato)
   {
   }
   // Constructor que obliga a que se introduzca dos valor.
   public Clase(int AlgunDato, int OtroDato)
   {
   }
}


Podemos observar como en este ejemplo se mantiene el nombre de la variable, pero se añade una nueva en la segunda versión del mismo.

1.5 Ejecución de la clase.
La clase no se ejecuta, se ejecuta una instancia de la misma, en el objeto que de ella se crea.
El punto de inicio es el constructor de la misma.

Código:
// Constructor que obliga a que se introduzca un valor.
public Clase(int AlgunDato)
{
}


La ejecución del objeto, se iniciará en una fase inicial cuando se declara y se inicializa el mismo, y en segundas fases cuando se reclama la ejecución de cualquiera de sus métodos.

La finalización de la ejecución de cualquiera de sus métodos no implica que deje de ser utilizado el objeto y que éste deje de consumir recursos.

La ejecución permanecerá activa hasta que se ejecute una asignación de “nothing” o “null”, al objeto que de ella se deriva, o bien hasta que desaparezca el mismo de la memoria por finalizar el procedimiento o programa que lo reclama, o bien finalicemos la misma con el método de finalización previsto en el lenguaje.

Tengamos presente que mientras no se ejecute una de estas acciones, el objeto estará consumiendo recursos del sistema.

1.6 Finalización de la clase.
En Java, aunque el método finalize() siempre se invocará antes de que el recolector de memoria libere la zona de memoria ocupada por el objeto, no hay garantía alguna de que el recolector de memoria reclame la memoria de un determinado objeto, es decir, no hay garantía de que el método finalize() sea invocado.

La regla de oro a seguir es que no se debe poner ningún código que deba ser ejecutado en el método finalize().

Por ejemplo, si se necesita concluir la comunicación con un servidor cuando ya no se va a usar un objeto, no debe ponerse el código de desconexión en el método finalize(), porque puede que nunca sea llamado.

Luego, en Java, es responsabilidad del programador escribir métodos para realizar la limpieza que no involucre a la memoria ocupada por el objeto y ejecutarlos en el instante preciso.

Código:
Objeto = null;


El método finalize() y el recolector de memoria son útiles para liberar la memoria de la pila y debería restringirse su uso solamente a eso, y no depender de ellos para realizar ningún otro tipo de limpieza.

No obstante, Java dispone de dos métodos para asegurar que los métodos finalize se ejecuten. Los dos métodos habilitan la finalización a la salida de la aplicación, haciendo que los recolectores de todos los objetos que tengan un método finalizador y que todavía no hayan sido invocados automáticamente, se ejecuten antes de que la Máquina Virtual Java concluya la ejecución de la aplicación.

Estos métodos son:

Código:
runFinalizersOnExit( boolean ), método estático de java.lang.Runtime
runFinalizersOnExit( boolean ), método estático de java.lang.System
System.runFinalizersOnExit(true);


Una clase también hereda de su superclase el método finalize(), y en caso necesario, debe llamarse una vez que el método finalize() de la clase haya realizado las tareas que se le hayan encomendado, de la forma:

Código:
super.finalize();


En la construcción de un objeto, se desplaza uno por el árbol de jerarquía, de herencia, desde la raíz del árbol hacia las ramas, y en la finalización, es al revés, los desplazamientos por la herencia debe ser desde las ramas hacia las superclases hasta llegar a la clase raíz.


1.7 Ejercicios propuestos.
1. Crear una clase en la que no se pida ningún requisito para crear un objeto con la misma.
2. Crear una clase en la que no se pida ningún requisito, pero que disponga de una fase de inicialización para la primera vez que se instancie para las variables que se crea oportuno.
3. Crear una clase en la que al iniciar una instancia de la clase se tenga que introducir un valor entero, y comprobar que su valor es mayor que cero y menor que diez.
4. Con la clase del ejercicio anterior, añadir una variable interna que se llame Dato, dicha variable será inicializada a cinco, y que tome el valor de la inicialización del objeto en caso de ser válido.
5. Con la clase del ejercicio anterior, añadir un método llamado finalize, y colocar en el un texto que permita visualizar su ejecución. En el programa principal asignar al objeto una vez utilizado una línea que le asigne null, comprobar los mensajes utilizar los métodos que siguen para probar los distintos resultados.

Código:
runFinalizersOnExit( boolean ), método estático de java.lang.Runtime
runFinalizersOnExit( boolean ), método estático de java.lang.System


El método creado en la clase puede ser :

Código:
@Override
public void finalize() throws Throwable
{
   super.finalize();
   System.out.println("El objeto ha finalizado");
}



1.8 Solución a los ejercicios propuestos.
1. Crear una clase en la que no se pida ningún requisito para crear un objeto con la misma.

Código:
package ejemplos;
public class Ejemplo
{
   public Ejemplo()
   {
      System.out.println("Se ha generado una nueva instancia de la clase.");
   }
}


Principal del programa.

Código:
package ejemplos;
public class Main
{
   public static void main(String[] args)
   {
      Ejemplo Objeto = new Ejemplo();
   }
}


El resultado de la ejecución es

Código:
init:
deps-jar:
Compiling 1 source file to

compile:
run:
Se ha generado una nueva instancia de la clase.
BUILD SUCCESSFUL (total time: 0 seconds)


2. Crear una clase en la que no se pida ningún requisito, pero que disponga de una fase de inicialización para la primera vez que se instancie para las variables que se crea oportuno.

Código:
package ejemplos;
public class Ejemplo
{
   static
   {
      System.out.println("Creación del objeto");
      System.out.println("Solo la primera vez");
   }
   public Ejemplo()
   {
      System.out.println("Se ha generado una nueva instancia de la clase.");
   }
}


Principal del programa.

Código:
package ejemplos;
public class Main
{
   public static void main(String[] args)
   {
      Ejemplo Objeto = new Ejemplo();
      Ejemplo OtroObjeto = new Ejemplo();
   }
}


El resultado de la ejecución es

Código:
init:
deps-jar:
Compiling 1 source file to

compile:
run:
Creación del objeto
Solo la primera vez
Se ha generado una nueva instancia de la clase.
Se ha generado una nueva instancia de la clase.
BUILD SUCCESSFUL (total time: 0 seconds)


3. Crear una clase en la que al iniciar una instancia de la clase se tenga que introducir un valor entero, y comprobar que su valor es mayor que cero y menor que diez.

Código:
package ejemplos;
public class Ejemplo
{
   static
   {
      System.out.println("Creación del objeto");
      System.out.println("Solo la primera vez");
   }
   public Ejemplo(int Dato)
   {
      if ((Valor > 0) & (Valor < 10))
      {
         System.out.println("Se ha generado una nueva instancia de la clase con los datos correctos.");
      }
      else
      {
         System.out.println("Se ha generado una nueva instancia de la clase con datos erróneos.");
      }
   }
}


El programa principal es

Código:
package ejemplos;
public class Main
{
   public static void main(String[] args)
   {
      Ejemplo Objeto = new Ejemplo(12);
      Ejemplo OtroObjeto = new Ejemplo(8);
   }
}


El resultado de la ejecución es

Código:
init:
deps-jar:
Compiling 1 source file to

compile:
run:
Creación del objeto
Solo la primera vez
Se ha generado una nueva instancia de la clase con datos erróneos.
Se ha generado una nueva instancia de la clase con los datos correctos.
BUILD SUCCESSFUL (total time: 0 seconds)


4. Con la clase del ejercicio anterior, añadir una variable interna que se llame Dato, dicha variable será inicializada a cinco, y que tome el valor de la inicialización del objeto en caso de ser válido.

Código:
package ejemplos;
public class Ejemplo
{
   private int Dato = 5;
   static
   {
      System.out.println("Creación del objeto");
      System.out.println("Solo la primera vez");
   }
   public Ejemplo(int Valor)
   {
      if ((Valor > 0) & (Valor < 10))
      {
         Dato = Valor;
      }
      else
      {
         System.out.println("Se ha generado una nueva instancia de la clase con datos erroenos.");
      }
      System.out.println("El valor del dato " + Dato);
   }
}


El programa principal es

Código:
package ejemplos;
public class Main
{
   public static void main(String[] args)
   {
      Ejemplo Objeto = new Ejemplo(8);
      Ejemplo OtroObjeto = new Ejemplo(12);
   }
}


El resultado de la ejecución es

Código:
init:
deps-jar:
Compiling 1 source file to

compile:
run:
Creación del objeto
Solo la primera vez
El valor del dato 8
Se ha generado una nueva instancia de la clase con datos erróneos.
El valor del dato 5
BUILD SUCCESSFUL (total time: 0 seconds)


Hay que tener presente que la línea

Código:
System.out.println("El valor del dato " + Dato);


Se ejecuta siempre, y

Código:
System.out.println("Se ha generado una nueva instancia de la clase con datos erroenos.");


solo en caso de datos erróneos.

5. Con la clase del ejercicio anterior, añadir un método llamado finalize, y colocar en el un texto que permita visualizar su ejecución. En el programa principal asignar al objeto una vez utilizado una línea que le asigne null, comprobar los mensajes utilizar los métodos que siguen para probar los distintos resultados.

Código:
runFinalizersOnExit( boolean ), método estático de java.lang.Runtime
runFinalizersOnExit( boolean ), método estático de java.lang.System
System.runFinalizersOnExit(true);


El método creado en la clase puede ser :

Código:
@Override
public void finalize() throws Throwable
{
   super.finalize();
   System.out.println("El objeto ha finalizado");
}


El método finalize, ya existe en la clase principal de Java, por eso es que delante se coloca @override, para indicar que se sobre escribe, en próximo tema se verá el concepto.

Super.finalize, llama al método de la clase Super de la que se derivan todas las clases de Java.

Código:
public void finalize() throws Throwable


throws Throwable, viene motivado por la captura y gestión de errores, que también se verá más adelante y que también provoca que en el main la línea tenga éste contenido.

Código:
public static void main(String[] args) throws Throwable


El código de la clase.

Código:
package ejemplos;
public class Ejemplo
{
   private int Dato = 5;
   static
   {
      System.out.println("Creación del objeto");
      System.out.println("Solo la primera vez");
   }
   private Ejemplo()
   {
      System.out.println("Se ha generado una nueva instancia de la clase.");
   }
   public Ejemplo(int Valor)
   {
      if ((Valor > 0) & (Valor < 10))
      {
         Dato = Valor;
      }
      else
      {
         System.out.println("Se ha generado una nueva instancia de la clase con datos erróneos.");
      }
      System.out.println("El valor del dato " + Dato);
   }
   @Override
   public void finalize() throws Throwable
   {
      super.finalize();
      System.out.println("El objeto ha finalizado");
   }
}


El programa principal es

Código:
package ejemplos;
public class Main
{
   public static void main(String[] args) throws Throwable
   {
      Ejemplo Objeto = new Ejemplo(8);
      Objeto.finalize();
      Objeto = null;
   }
}


Conviene probar a cambiar de sitio las líneas de Objeto = null y Objeto.finalize, y comprobar los resultados.

El resultado adecuado es

Código:
init:
deps-jar:
Compiling 1 source file to

compile:
run:
Creación del objeto
Solo la primera vez
El valor del dato 8
El objeto ha finalizado
BUILD SUCCESSFUL (total time: 0 seconds)


Añadir en el principal la línea

Código:
System.runFinalizersOnExit(true);
package ejemplos;
public class Main
{
   public static void main(String[] args) throws Throwable
   {
      Ejemplo Objeto = new Ejemplo(8);
      Objeto.finalize();
      Objeto = null;
      System.runFinalizersOnExit(true);
   }
}


Comentar las líneas

Código:
Objeto.finalize();
Objeto = null;


Ejecutar el programa y observar los resultados obtenidos.


Autor del curso: casiopea


Normas del foro
Aprende a postear correctamente usando las etiquetas
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Ayuda con TestNG Parametrico en java netbeans

baltigo Java 0 Sábado 30 Jun 2018 01:37 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Dudas al instanciar clases heredadas

MMCA Java 0 Viernes 26 Ene 2018 21:34 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Publicar Aplicación web JAVA en tomcat

Irvin Java Web 1 Viernes 13 Oct 2017 17:54 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Imagen referencial De creación de jtable en apl...

Jensel S.G Java 6 Miércoles 13 Sep 2017 20:06 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Clases

angeljonh C, C#, Visual C++ 2 Miércoles 30 Ago 2017 06:20 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,