Capitulo 4 - Certificacion Java

CN Camilo Nova Camilo Nova

Camilo Nova

CEO
7 min read.

Cuando se compila una clase por consola con el comando 'javac' es necesario poner la extensión .java a la clase, cuando se ejecuta solo se hace con la nombre, sin extensión, usando el comando 'java'

El parámetro para el método main(...) puede tener cualquier nombre, pero debe ser de tipo String[]

El nombre de la clase publica declarada en el archivo .java debe coincidir con el nombre del archivo.

Solo puede haber UNA clase publica en un archivo .java

Se genera un archivo .class para cada clase declarada en el archivo que es compilado.

Se puede importar paquetes completos usando el comodin '*' para todas las clases comprendidas en el paquete, por ejemplo casa.*, pero no se puede usar para generalizar nombres de clases, por ejemplo casa.ap*, solamente es valido usar para importar todo el contenido de un paquete, de lo contrario se genera un error de compilacion.

Al momento de importar paquetes, se importa el nombre del paquete que se especifica en casa clase con 'package'

La declaracion del paquete precede las de importacion de paquetes, las que a su vez preceden la declaracion de la clase.

Cada componente en el paquete corresponde a un directorio en el sistema de archivos.

El 'classpath' es una variable de ambiente del sistema operativo que contiene un listado de directorios o archivos JAR en los cuales el compilador y el interprete buscan por los archivos de clases. Son separados por ';'

JAR (Java ARchive) es un archivo con extension .jar, que contiene el conjunto de archivos .class de toda la aplicacion, incluyendo o no el codigo fuente, este archivo se crea con el comando 'jar cf myApp.jar topDir'.

Este comando comprime en el archivo myApp.jar todo lo que se encuentre dentro de topDir.

Se puede listar el contenido de un archivo .jar con el siguiente comando: 'jar -tf myApp.jar' y se puede ejecutar de la siguiente manera: 'java -jar myApp.jar'

Cuando se especifica un archivo .jar en el classpath se necesita que el nombre del archivo este al final de la linea 'c:\myDev\myApp.jar'

La clase que contiene el metodo main(...) debe ser especificada en el archivo MANIFEST.MF con la siguiente linea 'Main-Class: MyClass'

La importacion estatica introducida en J2SE 5.0 hace referencia a la capacidad de utilizar metodos y atributos estaticos de una clase, por lo general se accede a un atributo estatico de una clase A de la siguiente manera 'A.comp', si se hace la importacion estatica en la clase permite que se pueda llamar al atributo directamente como 'comp'. La importacion se hace con la siguiente linea: 'import static java.lang,Math.PI'.

Si luego de hacer la importacion estatica se llama algun atributo estatico haciendo uso del nombre de su clase 'A.comp' se genera un error de compilacion.

Si se pasa una variable primitiva como argumento para un metodo, dicha variable es pasada por-valor al metodo, con lo cual se hace una COPIA del valor para el metodo que la recibe, luego los cambios que se hagan sobre dicha variable dentro del metodo no afectan la variable con la cual fue pasada.

***Al parecer cuando se pasan parametros a los metodos, todos se pasan por-valor, osea se hace una copia de la variable en el parametro, tanto para tipos abstractos como primitivos, existe alguna forma de pasar parametros por referencia???

Los tipos de datos declarados dentro de un metodo NO pueden utilizar modificadores de acceso, los metodos y las variables de instancia SI

Si no se especifica uno de estos modificadores 'public', 'protected' y 'private' se utiliza el modificador por defecto.

Un metodo, clase o variable declarado como publico es accesible desde cualquier parte de la aplicacion.

*No se recomienda que las variables de instancia sean publicas, ya que estas deben ser modificadas solamente por los metodos de la clase.

El modificador 'private' no puede ser aplicado a una clase de alta jerarquia (la que tiene el mismo nombre que el archivo .java), una clase 'top-level' es aquella que no esta definida dentro de otra. Un miembro de una clase declarado privado solo puede ser accesado dentro de la misma clase que lo declaro, no desde otra clase ni de una subclase de la cual es declarado.

El modificador 'protected' solo puede ser aplicado a miembros de la clase, es decir a variables, metodos y subclases (inner class). Es accesible para las clases del mismo paquete y para subclases, asi esta no este en el mismo paquete.

El modificador default es usando cuando no se especifica otro tipo de modificador en la clase, metodo o atributo. La palabra reservada 'default' hace referencia a la sentencia 'switch' y no a este modificador de acceso, el cual, por supuesto, no tiene palabra reservada.

Un miembro declarado como default es accesible desde cualquier clase o subclase del mismo paquete. La diferencia con el modificador de acceso 'protected' es que ambos pueden acceder desde el mismo paquete, pero el protected adicionalmente puede ser accesado por una subclase que herede de la clase protected de otro paquete. En default una subclase no tiene acceso al miembro declarado.

Un método no puede ser sobrecargado con un acceso menor al que fue definido, se puede otorgar un acceso mayor, digamos pasar de protected a public y similar.

El modificador 'final' puede ser aplicado a un atributo, un metodo y una clase. Se se aplica a un atributo el modificador 'final' quiere decir que su valor es constante y que debe ser declarado en su inicializacion. Si el metodo es 'final' quiere decir que no puede ser sobrecargado (es decir, cambiado su comportamiento en una clase que lo herede). Si la clase es 'final' quiere decir que nadie puede heredar de ella.

Los atributos (variables) declarados 'final' NO pueden ser modificados posteriormente, esto genera un error de compilación.

Los elementos estaticos 'static' son visibles para todas las instancias de la clase, comparten la misma referencia sin importar la cantidad de instancias distintas que se puedan crear.

El modificador 'static' puede ser utilizado para variables, métodos y a bloques de código dentro de una clase. NO para clases.

Si una de las instancias hace un cambio en un atributo estático, todas las instancias pueden ver dicho cambio.

Los atributos estaticos son inicializados al momento de cargar la clase en la VM, antes de que sea instanciada la clase que los contiene.

Un método estático SOLAMENTE puede acceder a atributos estaticos. Porque los métodos y atributos estaticos no pertenecen a una instancia especifica de la clase que los declara, sino que, a todas las instancias por igual.

Un método declarado estático no puede ser sobrecargado como no-estático y viceversa.

Un bloque de código declarado estático,

static {

..algo por aca...

}

se ejecuta ANTES de que la clase sea instanciada, se ejecuta al momento de ser cargada la clase en la VM, se ejecuta UNA sola vez y no vuelve a ser ejecutado durante la duración de la aplicación, se debe recordar que se ejecuta en el orden que son declarados en la clase desde arriba hacia abajo.

Recordar:

-Los elementos estaticos pertenecen a la clase y no a una instancia especifica de la clase.

-Un cambio en una variable estatica es visible para todas las instancias de la clase.

-Las variables estaticas son inicializadas al igual que los bloques de código estaticos en el momento de carga de la aplicación.

-Un método estatico de una clase NO puede acceder atributos no-estaticos de la clase.

-No se puede declarar como estatico: el constructor, una clase de primer nivel (top-level class), interfaz, clases internas junto con sus métodos y atributos, y variables locales.

-Se puede declarar como estaticos: miembros de primer nivel de una clase, una subclase de primer nivel y fragmentos de código.

El modificador 'abstract' se puede aplicar solamente a una clase o método.

Una clase abstracta no puede ser instanciada, porque por definición no se encuentra completamente implementada.

Si una clase tiene uno o mas métodos abstractos, dicha clase debe ser declarada abstracta también.

Cuando una clase hereda de una clase abstracta esta debe implementar todos los métodos abstractos que tenga dicha clase.

Debe ser una clase abstracta si:

1)Contiene uno o mas métodos abstractos.

2)Si hereda de una clase abstracta y no implementa los metodos abstractos.

3)Si implementa una interfaz y no provee implementacion para los metodos de la interfaz.

Con los métodos abstractos se puede lograr el efecto de polimorfismo, ya que el método se comporta de diferentes maneras dependiendo la implementacion.

Tambien se puede hacer polimorfismo implementando un método no abstracto de la clase que hereda, pero el modificador 'abstract' para el método hace obligatoria la implementacion.

Una clase o método abstracto significa que no ha terminado de ser implementado.

'abstract' y 'final' son totalmente opuestos, uno obliga la herencia y el otro no la permite.

El modificador 'native' implica que la implementacion del método puede que no se encuentre en el código fuente de la aplicación, sino que exista en alguna libreria que se carga dinamicamente. No es obligatorio implementarlo, pero se puede en dado caso. Se usa cuando se hace implementaciones en otros lenguajes de programación que deben ser cargadas externamente. Solamente es aplicable a métodos

El modificador aplicable únicamente a atributos (variables) de instancia 'trasient' se usa para indicar a la maquina virtual que en caso de que dicha clase sea "serializada", es decir, que sea almacenada físicamente, omita la variable en cuestión y no la serialize, esto por cuestiones de seguridad respecto a algunos datos que son muy importantes para ser almacenados en disco.

El modificador 'volatile' también aplica solamente a atributos de instancia se utiliza para indicarle a la maquina virtual que dicho atributo puede ser cambiado en cualquier momento (asincronicamente) por otros procesos que accedan a la misma información. Solamente es utilizada en entornos de multiproceso y/0 multihilado para evitar la des-sincronizacion de la información contenida en la variable.

La gestion de memoria en java es automatica y la ejecuta el GarbageCollector que puede ser llamado System.gc(), el recolector de basura recoje aquellos objetos que tengan valor null o que no estén referenciados a ninguna parte. Para optimizar el uso de la memoria se recomienda asignar a null aquellos objetos que terminemos de utilizar.

Una manera de ejecutar código antes de que el recolector de basura haga su trabajo en un objeto se puede implementar el método finalize() el cual se ejecuta justo antes de que el recolector de basura elimine el objeto de la memoria.

A diferencia de los constructores, el método finalize() no llama al respectivo método de la super clase, asi que de querer hacerlo se debe hacer explicitamente como super.finalize().

Hay tres puntos finales por recordar:

1)La ruta completa de una clase se compone del classpath seguido del paquete y el nombre de la clase.

2)Se utilizan modificadores de acceso buscando una buen balance entre seguridad y acceso.

3)Se puede hacer elegible un objeto para el recolector de basura eliminando cualquier referencia al mismo, pero no se puede asegurar que el recolector de basura elimine el objeto sin referencia.


Written by Camilo Nova

CN Camilo Nova Camilo Nova

As the Axiacore CEO, Camilo writes about the intersection of technology, design, and business. With a strategic mindset and a deep understanding of the industry, he is dedicated to helping companies grow.

Newsletter

Subscribe to our newsletter:

Read more

Capitulo 3 - Certificacion Java

Para nombrar un metodo aplican las mismas reglas que para nombrar una variable.Recordemos que por convencion las clases deben...

5 min read.

Capitulo 2 - Certificacion Java

Un programa de computador básicamente se compone de datos, operaciones con los datos y lógica que determina las operaciones.E...

4 min read.

Liberacion Digital 2008

Tecnoparque amablemente nos ha hecho llegar una invitación que quiero compartir con ustedes, se trata de la charla "Liberació...

1 min read.

Build Once. Own Forever.