1. Java Developer Kit (JDK)
El lenguaje Java tiene cinco principios básicos:
1. Usar la metodología de la programación orientada a objetos.
2. Permitir ejecutar un mismo programa en múltiples sistemas operativos.
3. Incluir, por defecto, soporte para trabajo en red.
4. Estar diseñado para ejecutar código en sistemas remotos de forma segura.
5. Fácil de usar y tomar lo mejor de otros lenguajes orientados a objetos, como C++.
JDK se descarga desde:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2. Java Runtime Environment
El JRE (Java Runtime Environment) es un software Java que permite ejecutar todas las aplicaciones compiladas de Java, inclusive aquellas que tienen que mostrarse en Internet, en las páginas HTML.
La tecnología Java Plug-in, incluida como parte del Runtime Environment de Java 2, Standard Edition (JRE), establece una conexión entre los navegadores más populares y la plataforma Java. Por su parte, Java permite que las aplicaciones se descarguen en red y se ejecuten en un espacio reservado.
También, se puede establecer restricciones de seguridad de manera sencilla en dicho espacio. Muchas aplicaciones multiplataforma necesitan de Java para funcionar adecuadamente.
Se debe considerar que, gracias a este JRE, un programador puede desarrollar su aplicación en un sistema operativo Windows, para luego ejecutarlo sobre Linux, sin ningún cambio. Esto es posible porque las aplicaciones en Java no se ejecutan sobre los sistemas operativos, sino sobre el JRE, quien conversa con el sistema operativo. Por eso, Java es transportable a cualquier plataforma.
El producto es completamente gratuito y existe para diferentes sistemas operativos, como se puede apreciar navegando al siguiente URL de Oracle.
https://www.oracle.com/technetwork/java/javase/downloads/index.html
3. Archivos JAR, WAR y EAR
JAR - Java ARchive
Es un formato de archivo basado en el formato de archivo ZIP y se utiliza para agregar muchos archivos. El desarrollo de aplicaciones Java utiliza archivos JAR para muchos propósitos útiles, como empaquetar todos los archivos de clase, archivos de imágenes y otros archivos requeridos, de modo que la descarga de un solo archivo tendrá todos los componentes descargados en el equipo cliente.
JAR es independiente de la plataforma formato que ha sido completamente escrito en Java (es un estándar abierto y extensible completamente). Puede ser creado mediante el uso de "jar.exe" utilidad de línea de comandos. También, puede crear archivos JAR programáticamente, usando paquete de APIs java.util.jar.
WAR - Web ARchive
Este formato de archivo se utiliza para empaquetar todos los componentes de una aplicación web. Puede contener JAR, JSP, Servlets, HTMLs, GIF, etc. El objetivo de este formato de archivo es el mismo que el del JAR, es decir, para hacer el despliegue. Esto tendrá un archivo XML denominado web.xml como el descriptor de despliegue, el que es usado por el contenedor Web para desplegar la aplicación web, correctamente.
EAR - Enterprise ARchive
Una aplicación empresarial puede estar compuesta de varias aplicaciones web y otros JAR independientes. Este formato de archivo de almacenamiento se utiliza en aquellos casos en agrupar todos los componentes de una aplicación empresarial en un único archivo. Teniendo como propósito, el despliegue decisiones, envío, y por lo tanto, el mantenimiento más fácil. Puesto que, una aplicación de empresa puede tener varias aplicaciones Web como sus componentes. También contiene un descriptor de despliegue no basado en XML, que es utilizado por el servidor de aplicaciones para desplegar la aplicación de empresa correctamente
4. IDE Java
El IDE NetBeans es una herramienta para programadores, pensada para escribir, compilar, depurar y ejecutar programas. Está escrito en Java, pero puede servir para cualquier otro lenguaje de programación. Existe además un número importante de módulos para extenderlo. Además, NetBeans es un producto libre y gratuito sin restricciones de uso.
NetBeans soporta el desarrollo de todos los tipos de aplicación Java (J2SE, web, EJB y aplicaciones móviles). Entre sus características se encuentra un sistema de proyectos basado en ant, control de versiones y refactoring. Asimismo, extiende las características existentes del Java EE (incluyendo Soporte a persistencia, EJB 3 y JAX-WS). Adicionalmente, el NetBeans Enterprise Pack soporta el desarrollo de aplicaciones empresariales con Java EE 5, incluyendo herramientas de desarrollo visuales de SOA, herramientas de esquemas XML, orientación a web servicies (for BPEL) y modelado UML.
El NetBeans C/C++ Pack soporta proyectos de C/C++, mientras el PHP Pack, soporta PHP 5.
Todas las funciones del IDE son provistas por módulos. Cada módulo provee una función bien definida, tales como el soporte de Java, edición o soporte para el sistema de control de versiones. NetBeans contiene todos los módulos necesarios para el desarrollo de aplicaciones Java en una sola descarga permitiendo al usuario comenzar a trabajar inmediatamente. NetBeans se puede descargar del siguiente enlace:
https://netbeans.apache.org/
4.1 Instalación de NetBeans
Después de descargar al disco, solo debe dar doble clic sobre él y se podrá ver el siguiente diálogo. Acepte los siguientes diálogos por defecto.
5. Consola
Un programa básico en Java podría ser el siguiente:
Donde:
Donde:
- La línea 1 indica el paquete (carpeta) donde se guardará el archivo.
- La línea 3 define una clase pública (Hola) y será el nombre del archivo.
- La línea 5 declara el método main por donde empezará la ejecución del programa.
- La línea 7 imprimirá en consola: Hola mundo…
Este programa será guardado con el nombre Hola.java, el nombre del archivo debe ser completamente igual al nombre de la clase (Hola).
Una clase es un prototipo que define las variables y los métodos comunes a un cierto tipo de objetos. Las clases son las plantillas, de las que luego, se pueden crear múltiples objetos del mismo tipo.
La clase define las variables y los métodos comunes a los objetos de ese tipo, pero luego, cada objeto tendrá sus propios valores y compartirán las mismas funciones.
El método main es el punto de ejecución de una aplicación que puede constar de muchos archivos, pero solo uno de ellos tendrá al método main.
Para este ejemplo la sentencia System.out.println ("Hola a todos!"); imprimirá un mensaje en la consola.
Para ejecutar el programa, se deberá hacer clic derecho sobre el código y seleccionar Run File.
5.1 Ingreso de datos por consola
No existe instrucción directa en Java para el ingreso de datos, pues el lenguaje asume que el dispositivo lo proveerá. En este caso, para el ingreso de datos por consola, se tiene a partir del JDK 1.5 la clase Scanner.
5.2. Comentarios de línea, bloque y documentación
Los comentarios en el código de un programa son importantes para el mantenimiento futuro del mismo, así como, para interpretar más fácilmente una rutina compleja y, sobre todo, cuando trabaja un grupo de programadores para facilitar el entendimiento entre ellos.
Java tiene los siguientes 3 tipos de comentarios: Todo lo que esté a la derecha de // será considerado comentario por el compilador de Java y es eliminado en el archivo compilado (.class).
Todo lo que esté entre /* y */ será considerado comentario por el compilador de Java y es eliminado en el archivo compilado (.class).
Todo lo que esté entre /** y */ será considerado comentario por el compilador de Java, y permanece en el archivo compilado (.class). Usado normalmente, para describir al desarrollador y a la aplicación.
6. Depuración
La depuración es un aspecto importante en programación, pues con ella, se detecta fácilmente donde está el error o resultado no esperado. Para depurar, primero se agrega un break point a una línea del programa, esto se logra dando clic en el número de línea.
Luego, se hace clic derecho sobre el código de programa y del menú flotante que se muestra, seleccione Debug File. La ejecución del programa se detiene en la línea que contiene el break point, la cual se pinta de verde; además, se activan los siguientes toolbars:
Estos botones, según el orden en el que se muestran, ejecutarán las siguientes
acciones:
1. Step Over: permite avanzar a la siguiente línea.
2. Step Over Expression: avanza sobre partes de la línea.
3. Step Into: permite ingresar al código del método del cual se esté invocando.
4. Step Out: permite salir del código del método del cual se esté invocando.
5. Run to Cursor: hace un salto de ejecución hasta donde está el cursor.
También, se puede activar la ventana Variables (menú Window / Debugging / Variables) para poder apreciar el valor que van tomando las variables conforme se van ejecutando las líneas del programa.
7. Programas fuentes y compilados
La carpeta de instalación de Java (jre1.8.0_31/ bin) contiene todas las utilidades y bibliotecas del lenguaje Java. El IDE de NetBeans se comunica en todo momento con estas utilidades.
Por ejemplo:
- Para compilar el programa (Hola.java), NetBeans utiliza a javac.exe, el cual
- devuelve un archivo .class (Hola.class).
- Para interpretar un archivo .class, NetBeans utiliza a java.exe, el cual lo muestra
- en consola, solo si tiene el método main.
Asimismo, en la carpeta bin, se encuentran otras herramientas de Java, con las que se podrá compilar, ejecutar, documentar, empaquetar y muchas otras tareas, propias del entorno.
Con respecto al primer programa Hola.java, para llegar a ejecutarlo y verlo en consola, se deberá pasar por el proceso siguiente:
Programa fuente ---------Javac.exe-------> Programa compilado ---------Java.exe------------>
8. Tipo de datos en Java
Los primeros lenguajes de programación no usaban objetos, solo variables. Una variable podríamos decir que es un espacio de la memoria del ordenador a la que asignamos un contenido que puede ser un valor numérico (solo números, con su valor de cálculo) o de tipo carácter o cadena de caracteres
(valor alfanumérico que constará solo de texto o de texto mezclado con números).
Una variable es un espacio de memoria en el que podemos almacenar un valor o dato. En una variable podemos cambiar de valores durante la ejecución del algoritmo, es decir, una variable puede haber almacenado “n” valores distintos, pero del mismo tipo; es decir, si la variable es entera, podemos guardar en ella valores enteros, lo mismo sería para cadenas u otros tipos de datos.
Como ejemplo podemos definir una variable a que contenga 32 y esto lo escribimos como a = 32. Posteriormente podemos cambiar el valor de a y hacer a = 78. O hacer “a” equivalente al valor de otra variable “b” así: a = b. Dado que antes hemos dicho que un objeto también ocupa un espacio de
memoria: ¿en qué se parecen y en qué se diferencia un objeto de una variable? Consideraremos que las variables son entidades elementales: un número, un carácter, un valor verdadero o falso, mientras que los objetos son entidades complejas que pueden estar formadas por la agrupación de muchas variables y métodos. Pero ambas cosas ocupan lo mismo: un espacio de memoria (que puede ser más o menos grande).
En los programas en Java puede ser necesario tanto el uso de datos elementales como de datos complejos. Por eso en Java se usa el término “Tipos de datos” para englobar a cualquier cosa que ocupa un espacio de memoria y que puede ir tomando distintos valores o características durante la
ejecución del programa. Es decir, en vez de hablar de tipos de variables o de tipos de objetos, hablaremos simplemente de tipos de datos. Sin embargo, a veces “coloquialmente” no se utiliza la terminología de forma estricta: puedes encontrarte textos o páginas web donde se habla de una variable en alusión a un objeto.
En Java diferenciamos dos tipos de datos: por un lado, los tipos primitivos, que se corresponden con los tipos de variables en lenguajes como C y que son los datos elementales que hemos citado. Por otro lado, los tipos objeto (que normalmente incluyen métodos).
En resumen, un tipo de dato primitivo es:
Los tipos de datos básicos o primitivos no son objetos y se pueden utilizar directamente en un programa sin necesidad de crear objetos de este tipo, son aquellos que corresponden con los tipos de variables en lenguajes como C.
Y un tipo de dato objeto es:
Aquella variable que tiene métodos asociados y necesitan una invocación para ser creados.
Existe una excepción en el tipo de dato objeto String que se comporta como un tipo de dato primitivo, ya que no necesita un constructor para ser utilizado.
Preguntas comunes acerca de tipos de datos:
1. ¿Un objeto es una cosa distinta a un tipo primitivo, aunque “porten” la misma información?
Tener siempre presente que los objetos en Java tienen un tipo de tratamiento y los tipos primitivos, otro. Que en un momento dado contengan la misma información no significa en ningún caso que sea lo mismo.
2. ¿Para qué tener esa aparente duplicidad entre tipos primitivos y tipos objeto o envoltorio?
Esto es una cuestión que atañe a la concepción del lenguaje de programación. Tener en cuenta una cosa: un tipo primitivo es un dato elemental y carece de métodos, mientras que un objeto es una entidad compleja y dispone de métodos.
Por otro lado, de acuerdo con la especificación de Java, es posible que necesitemos utilizar dentro de un programa un objeto que “porte” como contenido un número entero. Desde el momento en que sea necesario un objeto habremos de pensar en un envoltorio, por ejemplo, Integer. Inicialmente nos puede costar un poco distinguir cuándo usar un tipo primitivo y cuándo un envoltorio en situaciones
en las que ambos sean válidos. Seguiremos esta regla: usaremos por norma general tipos primitivos. Cuando para la estructura de datos o el proceso a realizar sea necesario un objeto, usaremos un envoltorio.
3. Los nombres de tipos primitivos y envoltorio se parecen mucho.
En realidad, excepto entre int e Integer y char y Character, la diferencia se limita a que en un caso la inicial es minúscula (por ejemplo, double) y en el otro es mayúscula (Double). Esa similitud puede confundirnos inicialmente, pero hemos de tener muy claro qué es cada tipo y cuándo utilizar cada tipo.
4. Una cadena de caracteres es un objeto.
El tipo String en Java nos permite crear objetos que contienen texto (palabras, frases, etc.). El texto debe ir siempre entre comillas. Muchas veces se cree erróneamente que el tipo String es un tipo primitivo por analogía con otros lenguajes donde String funciona como una variable elemental. En Java no es así.
5. Hay distintos tipos primitivos enteros. ¿Cuál usar?
Por norma general usaremos el tipo int. Para casos en los que el entero pueda ser muy grande usaremos el tipo long.
6. ¿Un array es un objeto?
Los arrays los consideraremos objetos especiales, los únicos objetos en Java que carecen de métodos.
9. Paquetes (packages) e importaciones (import)
Cláusula package
Un package es una agrupación de clases afines. Equivale al concepto de librería existente en otros lenguajes o sistemas. Una clase puede definirse como perteneciente a un package y puede usar otras clases definidas en ese o en otros packages.
El nombre de una clase debe ser único dentro del package donde se define. Dos clases con el mismo nombre en dos packages distintos, pueden coexistir e incluso, pueden ser usadas en el mismo programa.
Una clase se declara perteneciente a un package con la cláusula package, cuya sintaxis es la siguiente:
package nombre_package;
La cláusula package debe ser la primera sentencia del archivo fuente. Cualquier clase declarada en ese archivo pertenece al package indicado. Por ejemplo, un archivo que contenga las sentencias siguientes declara que la clase MiClase pertenece al package mipackage.
Un package es una agrupación de clases afines. Equivale al concepto de librería existente en otros lenguajes o sistemas. Una clase puede definirse como perteneciente a un package y puede usar otras clases definidas en ese o en otros packages.
El nombre de una clase debe ser único dentro del package donde se define. Dos clases con el mismo nombre en dos packages distintos, pueden coexistir e incluso, pueden ser usadas en el mismo programa.
Una clase se declara perteneciente a un package con la cláusula package, cuya sintaxis es la siguiente:
package nombre_package;
La cláusula package debe ser la primera sentencia del archivo fuente. Cualquier clase declarada en ese archivo pertenece al package indicado. Por ejemplo, un archivo que contenga las sentencias siguientes declara que la clase MiClase pertenece al package mipackage.
La cláusula package es opcional. Si no se utiliza, las clases declaradas en el archivo fuente no pertenecen a ningún package concreto, sino que pertenecen a un package por defecto sin nombre. La agrupación de clases en packages es conveniente desde el punto de vista organizativo para mantener bajo una ubicación común, clases relacionadas que cooperan desde algún punto de vista. También, resulta importante por la implicación que los packages tienen en los modificadores de acceso.
Nombres de los packages
Los packages se pueden nombrar usando nombres compuestos separados por puntos, de forma similar a como se componen las direcciones URL de Internet.
Por ejemplo:
Se puede tener un package de nombre mispackages.parainfo.base. Cuando se utiliza esta estructura se habla de packages y subpackages. En el ejemplo mispackages este es el package base, parainfo es un subpackage de mispackages y base es un subpackage de parainfo.
De esta forma, se pueden tener los packages ordenados, según una jerarquía equivalente a un sistema de archivos jerárquico. El API de java está estructurado, de esta forma, con un primer calificador (java o javax) que indica la base; un segundo calificador (awt, util, swing, etc.) que indica el grupo
funcional de clases y opcionalmente, subpackages en un tercer nivel, dependiendo de la amplitud del grupo. Cuando se crean packages de usuario no es recomendable usar nombres de packages que empiecen por java o javax.
Cláusula import
Según la ubicación de las clases en el proyecto, existen diferentes modos de hacer referencia a ellas. Por ejemplo, para referenciar cualquier clase dentro de otra, se considera, que esta otra está declarada en el mismo package (carpeta).
package parainfo;
Nombres de los packages
Los packages se pueden nombrar usando nombres compuestos separados por puntos, de forma similar a como se componen las direcciones URL de Internet.
Por ejemplo:
Se puede tener un package de nombre mispackages.parainfo.base. Cuando se utiliza esta estructura se habla de packages y subpackages. En el ejemplo mispackages este es el package base, parainfo es un subpackage de mispackages y base es un subpackage de parainfo.
De esta forma, se pueden tener los packages ordenados, según una jerarquía equivalente a un sistema de archivos jerárquico. El API de java está estructurado, de esta forma, con un primer calificador (java o javax) que indica la base; un segundo calificador (awt, util, swing, etc.) que indica el grupo
funcional de clases y opcionalmente, subpackages en un tercer nivel, dependiendo de la amplitud del grupo. Cuando se crean packages de usuario no es recomendable usar nombres de packages que empiecen por java o javax.
Cláusula import
Según la ubicación de las clases en el proyecto, existen diferentes modos de hacer referencia a ellas. Por ejemplo, para referenciar cualquier clase dentro de otra, se considera, que esta otra está declarada en el mismo package (carpeta).
package parainfo;
. . .
class Circulo {
Punto centro;
. . .
}
En esta declaración, se define que la clase Círculo se encuentra en el package parainfo. Esta usa la clase Punto. El compilador y la JVM, asumen que Punto pertenece también al package parainfo, y así está hecha la definición, para que la clase Punto sea accesible por el compilador, no obstante, es necesario que esté definida en el mismo package.
Si esto no fuese así, es necesario hacer accesible el espacio de nombres donde está definida la clase Punto a la nueva clase. Esto se hace con la cláusula import.
class Circulo {
Punto centro;
. . .
}
En esta declaración, se define que la clase Círculo se encuentra en el package parainfo. Esta usa la clase Punto. El compilador y la JVM, asumen que Punto pertenece también al package parainfo, y así está hecha la definición, para que la clase Punto sea accesible por el compilador, no obstante, es necesario que esté definida en el mismo package.
Si esto no fuese así, es necesario hacer accesible el espacio de nombres donde está definida la clase Punto a la nueva clase. Esto se hace con la cláusula import.
Suponiendo que la clase Punto estuviera definida de la forma siguiente:
package parainfobase;
class Punto {
int x , y;
}
Entonces, para usar la clase Punto en la clase Círculo, se debe escribir lo siguiente:
package parainfoampliada;
import parainfobase.*;
class Circulo {
Punto centro;
. . .
}
Con la cláusula import parainfobase.*; se hacen accesibles todos los nombres (todas las clases) declaradas en el package parainfobase. Si solo se quisiera tener accesible la clase Punto, se podría declarar: import parainfobase.Punto. También es posible hacer accesibles el nombre de un package sin usar la cláusula import, calificando completamente los nombres de aquellas clases pertenecientes a otros packages.
Por ejemplo:
package parainfoampliada;
class Circulo {
parainfobase.Punto centro;
. . .
}
Sin embargo, si no se usa import es necesario especificar el nombre del package cada vez que se usa el nombre Punto. La cláusula import indica al compilador dónde se buscan clases adicionales, cuando no puedan ser encontradas en el package actual, y delimita los espacios de nombres y modificadores de acceso. En una clase puede haber tantas sentencias import como sean necesarias. Las cláusulas import se colocan después de la cláusula package (si es que existe) y antes de las definiciones de las clases.
package parainfobase;
class Punto {
int x , y;
}
Entonces, para usar la clase Punto en la clase Círculo, se debe escribir lo siguiente:
package parainfoampliada;
import parainfobase.*;
class Circulo {
Punto centro;
. . .
}
Con la cláusula import parainfobase.*; se hacen accesibles todos los nombres (todas las clases) declaradas en el package parainfobase. Si solo se quisiera tener accesible la clase Punto, se podría declarar: import parainfobase.Punto. También es posible hacer accesibles el nombre de un package sin usar la cláusula import, calificando completamente los nombres de aquellas clases pertenecientes a otros packages.
Por ejemplo:
package parainfoampliada;
class Circulo {
parainfobase.Punto centro;
. . .
}
Sin embargo, si no se usa import es necesario especificar el nombre del package cada vez que se usa el nombre Punto. La cláusula import indica al compilador dónde se buscan clases adicionales, cuando no puedan ser encontradas en el package actual, y delimita los espacios de nombres y modificadores de acceso. En una clase puede haber tantas sentencias import como sean necesarias. Las cláusulas import se colocan después de la cláusula package (si es que existe) y antes de las definiciones de las clases.
10. Alcances: público, protegido y privado
Modificadores de acceso: public, private, protected y default
Los modificadores de acceso determinan desde qué clases se puede acceder a un determinado elemento. En Java se tienen 4 tipos: public, private, protected y el tipo por defecto, que no tiene ninguna palabra clave asociada, pero se suele conocer como default.
- Si no se especifica ningún modificador de acceso, se utiliza el nivel de acceso por defecto, que consiste en que el elemento puede ser accedido, solo desde las clases que pertenezcan al mismo paquete. El nivel de acceso public permite acceder al elemento desde cualquier clase, independientemente de que esta pertenezca o no, al paquete en que se encuentra el elemento; es decir, puede estar en cualquier carpeta del proyecto.
- El nivel de acceso private, por otro lado, es el modificador más restrictivo y especifica que los elementos que lo utilizan solo pueden ser accedidos desde la clase en la que se encuentran. Este modificador únicamente puede utilizarse sobre los miembros de una clase, y sobre interfaces y clases internas, pero no sobre clases o interfaces de primer nivel, dado que esto no tendría sentido. Private convierte los elementos en privados para otras clases, no para otras instancias de la clase. Es decir, un objeto de una determinada clase puede acceder a los miembros privados de otro objeto de la misma clase.
El modificador protected, por último, indica que los elementos solo pueden ser accedidos desde su mismo paquete (como el acceso por defecto) y desde cualquier clase que extienda la clase en que se encuentra, independientemente de si esta se encuentra en el mismo paquete o no. Este modificador, como private, no tiene sentido a nivel de clases o interfaces no internas.
No hay comentarios:
Publicar un comentario