Historia Del Lenguaje Java
Historia Del Lenguaje Java
La idea inicial del lenguaje era aplicar una sintaxis similar a C++, pero que
permitiese la ejecución del código mediante una máquina virtual.
Con Java podemos hacer todo tipo de proyectos, desde aplicaciones web a
servicios web basados en SOAP o REST, aplicaciones de escritorio de
consola o interfaz gráfica. Además Java es el lenguaje de programación que
se usa para el desarrollo nativo para Android, lo que ha llevado a esta
tecnología a un nivel de popularidad todavía mayor y con alta demanda
profesional.
Máquina virtual
Java es pionero entre los lenguajes multiplataforma, llevando en la
práctica el lenguaje no solo a distintos sistemas operativos de escritorio,
como muchos lenguajes actuales, sino a cualquier tipo de máquina.
Para ello Java incorpora una importante innovación llamada JVM, Java
Virtual Machine. La máquina virtual de Java permite ejecutar el código
de este lenguaje, de modo que Java es soportado en cualquier sistema
que incorpore su propia máquina virtual.
JAVA VS C++
La sintaxis de Java se deriva en gran medida de C++. Pero a diferencia de
este, que combina la sintaxis para programación genérica, estructurada y
orientada a objetos, Java fue construido desde el principio para ser
completamente orientado a objetos. Todo en Java es un objeto (salvo
algunas excepciones), y todo en Java reside en alguna clase (recordemos
que una clase es un molde a partir del cual pueden crearse varios objetos).
A diferencia de C++, Java no tiene sobrecarga de operadores o herencia
múltiple para clases, aunque la herencia múltiple está disponible para
interfaces.
JAVA
-Es tanto un lenguaje de programación como una
plataforma de Software:
ORIENTADO A OBJETOS:
Java trabaja con sus datos como objetos y con interfaces a esos objetos.
Soporta las tres características propias del paradigma de la orientación a
objetos: encapsulación, herencia y polimorfismo. Las plantillas de objetos
son llamadas, como en C++, clases y sus copias, instancias. Estas
instancias, como en C++, necesitan ser construidas y destruidas en espacios
de memoria.
DISTRIBUIDO:
ROBUSTO
Java verifica su código al mismo tiempo que lo escribe, y una vez más
antes de ejecutarse, de manera que se consigue un alto margen de
codificación sin errores. Se realiza un descubrimiento de la mayor parte de
los errores durante el tiempo de compilación, ya que Java es estricto en
cuanto a tipos y declaraciones, y así lo que es rigidez y falta de flexibilidad
se convierte en eficacia. Respecto a la gestión de memoria, Java libera al
programador del compromiso de tener que controlar especialmente la
asignación que de ésta hace a sus necesidades específicas. Este lenguaje
posee una gestión avanzada de memoria llamada gestión de basura, y un
manejo de excepciones orientado a objetos integrados. Estos elementos
realizarán muchas tareas antes tediosas a la vez que obligadas para el
programador.
ARQUITECTURA NEUTRAL
Java está diseñado para que un programa escrito en este lenguaje sea
ejecutado correctamente independientemente de la plataforma en la que se
esté actuando (Macintosh, PC, UNIX...). Para conseguir esto utiliza una
compilación en una representación intermedia que recibe el nombre de
códigos de byte (bytecodes), que pueden interpretarse en cualquier sistema
operativo con un intérprete de Java. La desventaja de un sistema de este
tipo es el rendimiento; sin embargo, el hecho de que Java fuese diseñado
para funcionar razonablemente bien en microprocesadores de escasa
potencia, unido a la sencillez de traducción a código máquina hacen que
Java supere esa desventaja sin problemas.
SEGURO
Existe una preocupación lógica en Internet por el tema de la seguridad:
virus, caballos de Troya, y programas similares navegan de forma usual por
la red, constituyendo una amenaza palpable. Java ha sido diseñado
poniendo un énfasis especial en el tema de la seguridad, y se ha conseguido
lograr cierta inmunidad en el aspecto de que un programa realizado en Java
no puede realizar llamadas a funciones globales ni acceder a recursos
arbitrarios del sistema, por lo que el control sobre los programas
ejecutables no es equiparable a otros lenguajes.
Los niveles de seguridad que presenta son:
Fuertes restricciones al acceso a memoria, como son la eliminación
de punteros aritméticos y de operadores ilegales de transmisión.
Rutina de verificación de los códigos de byte que asegura que no se
viole ninguna construcción del lenguaje.
Verificación del nombre de clase y de restricciones de acceso
durante la carga.
Sistema de seguridad de la interfaz que refuerza las medidas de
seguridad en muchos niveles.
En futuras versiones se prevé contar también con encriptación y técnicas
similares.
PORTABLE
Más allá de la portabilidad básica por ser de arquitectura independiente,
Java implementa otros estándares de portabilidad para facilitar el
desarrollo. Los enteros son siempre enteros y además, enteros de 32 bits en
complemento a 2. Además, Java construye sus interfaces de usuario a
través de un sistema abstracto de ventanas de forma que las ventanas
puedan ser implantadas en entornos Unix, Pc o Mac.
INTERPRETADO:
MULTITHREADED
Java logra llevar a cabo varias tareas simultáneamente dentro del mismo
programa. Esto permite mejorar el rendimiento y la velocidad de ejecución.
DINAMICO
TIPIFICADO
Un lenguaje de programación es fuertemente tipado si no se permiten
violaciones de los tipos de datos, es decir, dado el valor de una variable de
un tipo concreto, no se puede usar como si fuera de otro tipo distinto a
menos que se haga una conversión.
JDK
El JDK es el Java Development Kit, que traducido al español
significa, Herramientas de desarrollo para Java, en cortas palabras es un
conjunto de herramientas (librerías y programas) que permiten desarrollar
en lenguaje Java. Cuando hablamos de desarrollar esto incluye compilar,
ejecutar, generar documentación, etc.
Las variables de entorno más importantes que se incluyen son:
o Javac: es el compilador de JAVA. Convierte nuestro código fuente
(.java) en bytecode (.class) el cual posteriormente sera interpretado y
ejecutado con la JVM, Java Virtual Machine por sus siglas en ingles,
que nuevamente al español es La Maquina Virtual de Java
o Java: es el intérprete de JAVA.
o Javadoc: genera la documentación de las clases java de un
programa.
o Appletviewer: es un visor de applet para generar sus vistas
previas,ya que un applet carece de método main y no se puede
ejecutar con el programa java.
o Jar: para manipular ficheros .jar(un fichero .jar es una colección de
clases Java y otros ficheros empaquetados en uno solo).
o Javah: que es un fichero de cabecera para escribir metodos nativos.
o Javap: para descompilar ficheros compilados.
o Extcheck: para detectar conflictos jar.
JRE
El JRE es el Java Runtime Environment, en español significa Entorno
de Ejecución de Java, en pocas palabras es la implementación de la
Máquina virtual de Java que realmente ejecuta los programas de
Java conocida como JVM, un conjunto de Java y otros componentes
innecesarios para que una aplicación escrita en lenguaje c++ pueda ser
ejecutada. El JRE actúa como un «intermediario» entre el sistema y Java.
Este ambiente de ejecución para aplicaciones Java (JRE) está compuesto
por dos importantes áreas, la primera son las clases que conforman el API
de java y la segunda es la JVM.
El API son todas las clases que componen el ambiente Java y que al
momento de ser utilizadas desde la aplicación podrán ser ejecutadas
y/o interpretadas por la JVM.
La JVM es un componente de software que actúa justamente como
una máquina virtual o un espacio virtual de memoria donde se
ejecutan las aplicaciones Java.
La JVM es el programa que interpreta el código Java mientras que las
librerías de clases estándar son las que implementan el API de Java. Ambas
JVM y API deben ser consistentes entre sí, de ahí que sean distribuidas de
modo conjunto.
Un usuario sólo necesita el JRE para ejecutar las aplicaciones desarrolladas
en lenguaje Java, mientras que para desarrollar nuevas aplicaciones en
dicho lenguaje es necesario un entorno de desarrollo, denominado JDK,
que además del JRE (mínimo imprescindible) incluye, entre otros, un
compilador para Java.
Así pues, podemos hablar de una API como una especificación formal
que establece cómo un módulo de un software se comunica o interactúa
con otro para cumplir una o muchas funciones. Todo dependiendo de las
aplicaciones que las vayan a utilizar, y de los permisos que les dé el
propietario de la API a los desarrolladores de terceros.
JVM
Los programas Java se compilan a un formato binario .class que contiene
instrucciones en un lenguaje de bajo nivel especial independiente de la
plataforma, llamado Byte Code. Existe un componente de Java que debe estar
instalado en cada sistema operativo que se llama Java Virtual Machine o JVM. La
JVM es capaz de entender el Byte Code y ejecutarlo con las instrucciones
equivalentes que haya en el sistema operativo y procesador actuales en el que
estemos ejecutándolo. Esto es una gran ventaja porque nos permite ejecutar
código Java en cualquier plataforma para la que exista una JVM (en la práctica,
casi cualquiera).
POO
La programación orientada a objetos (POO, u OOP según sus siglas
en inglés) es un paradigma (modelo) de programación que viene a innovar
la forma de obtener resultados. Los objetos manipulan los datos de entrada
para la obtención de datos de salida específicos, donde cada objeto ofrece
una funcionalidad especial.
OBJETO
ATRIBUTO
MÉTODOS
INSTANCIA
Se llama instancia a todo objeto que derive de algún otro. De esta forma,
todos los objetos son instancias de algún otro, menos la clase Object que es
la madre de todas.
El proceso de crear un objeto a partir de una clase se llama Instanciar y
cada objeto creado también se le puede llamar Instancia.Con una sola clase
podemos crear cientos de usuarios (Instancias) sin tener que escribir código
para cada uno de ellos.
El proceso de crear un objeto a partir de una clase se llama Instanciar y
cada objeto creado también se le puede llamar Instancia. Con una sola clase
podemos crear cientos de usuarios (Instancias) sin tener que escribir código
para cada uno de ellos.
HERENCIA
La herencia es específica de la programación orientada a objetos, donde
una clase nueva se crea a partir de una clase existente. La herencia (a la que
habitualmente se denomina subclase) proviene del hecho de que la subclase
(la nueva clase creada) contiene los atributos y métodos de la clase
primaria. La principal ventaja de la herencia es la capacidad para definir
atributos y métodos nuevos para la subclase, que luego se aplican a los
atributos y métodos heredados.
Es una propiedad que permite crear clases a partir de otras ya existentes,
obteniendo características (métodos y atributos) similares a los ya
existentes.En otras palabras la nueva clase (subclase o clase derivada)
puede utilizar la misma implementación de su superclase (clase base) o
especificar
una nueva implementación.
POLIMORFISMO
En POO, el concepto de polimorfismo se refiere al hecho de que varios
objetos de diferentes clases, pero con una base común, se pueden usar de
manera indistinta, sin tener que saber de qué clase exacta son para poder
hacerlo.
Supongamos que en nuestro juego tenemos un montón de personajes que
están juntos en un mismo escenario. Hay varios piratas, algunos estrategas
y un montón de otros tipos de personas. En un momento dado necesitamos
que todos se pongan a hablar. Cada uno lo hace de una forma diferente, ya
que son tipos de personajes distintos. Sería algo bastante tedioso tener que
localizar primero a los de un tipo y hacerlos hablar, lo luego a los de otro y
así sucesivamente. La idea es que puedas tratarlos a todos como personas,
independientemente del tipo específico de persona que sean y simplemente
decirles que hablen.
Al derivar todos de la clase Persona todos pueden hablar, y al llamar al
método Hablar() de cada uno de ellos se utilizará el proceso adecuado
según el tipo (los piratas meterán sus expresiones adicionales que hemos
visto, los pilotos dirán "Entrando en pista" o lo que sea, y los estrategas
añadirán a todo "Déjame que lo piense bien"). Todo esto de manera
transparente para el programador. Esto es el polimorfismo.
De hecho, el polimorfismo puede ser más complicado que eso ya que se
puede dar también mediante la sobrecarga de métodos y, sobre todo, a
través del uso de interfaces, pero el concepto es el que acabo de explicar.
El polimorfismo nos permite utilizar a los objetos de manera genérica,
aunque internamente se comporten según su variedad específica.
Ejemplo de Polimorfismo
Un ejemplo clásico de poliformismo es el siguiente. Podemos crear dos
clases distintas: Gato y Perro, que heredan de la superclase Animal. La
clase Animal tiene el método abstracto makesound() que se implementa de
forma distinta en cada una de las subclases (gatos y perros suenan de forma
distinta). Entonces, un tercer objeto puede enviar el mensaje de hacer
sonido a un grupo de objetos Gato y Perro por medio de una variable de
referencia de clase Animal, haciendo así un uso polimórfico de dichos
objetos respecto del mensaje mover.
ABSTRACCIÓN
La abstracción es un proceso de interpretación y diseño que implica
reconocer y enfocarse en las características importantes de una situación u
objeto, y filtrar o ignorar todas las particularidades no esenciales.
Dejar a un lado los detalles de un objeto y definir las características
específicas de éste, aquellas que lo distingan de los demás tipos de
objetos.
Hay que centrarse en lo que es y lo que hace un objeto, antes de
decidir cómo debería ser implementado.
Se hace énfasis en el qué hace más que en el cómo lo hace
Abstracción
ENCAPSULAMIENTO
Es la propiedad que permite asegurar que la información de un
objeto está oculta del mundo exterior.
El encapsulamiento consiste en agrupar en una Clase las
características (atributos) con un acceso privado y los
comportamientos (métodos) con un acceso público.
Acceder o modificar los miembros de una clase a través de sus
métodos.
Ya sabes que puedes utilizar clases para modelar entidades las cuales son
relevantes para tu aplicación, sabes además que puedes guardar datos
dentro de objetos, y también ejecutar funcionalidad. La pregunta que
debemos hacernos es, ¿Debe cualquiera poder modificar de manera directa
estos datos? ¿Debe cualquiera ejecutar cualquier funcionalidad de nuestros
objetos en cualquier momento? Normalmente esto no es algo que
queremos, nosotros queremos poder controlar la manera en que se asignen
los datos, queremos poder controlar quién ve la data interna de nuestros
objetos, e incluso quizás queramos controlar la ejecución de funcionalidad
de nuestros objetos. Para esto tenemos el concepto de encapsulamiento.
El encapsulamiento nos permite controlar quien puede ver y utilizar los
distintos módulos internos de nuestro sistema. En términos de clases, con el
encapsulamiento definimos el acceso a los miembros de la clase.
TIPOS DE DATOS EN JAVA
Los tipos de datos primitivos se usan para definir variables en Java- El tipo
de dato especificado junto con un identificador en el momento de la
declaración de la variable define el rango de valores que puede ser
almacenado en esta variable. Java provee ocho tipos de datos primitivos.
Tipo primitivo.
byte
short
int
long
float
double
boolean
char
Es importante saber que estos son tipos de datos del lenguaje y que
no representan objetos. Cosa que sí sucede con el resto de
elementos del lenguaje Java.
Tipos de datos primitivos en Java
Java cuenta con un pequeño conjunto de tipos de datos primitivos. Podríamos
considerarlos fundamentales, ya que la mayor parte de los demás tipos, los
tipos estructurados o complejos, son composiciones a partir de estos más
básicos. Estos tipos de datos primitivos sirven para gestionar los tipos de
información más básicos, como números de diversas clases o datos de tipo
verdadero/falso (también conocidos como "valores booleanos" o simplemente
"booleanos").
De estos tipos primitivos, ocho en total, seis de ellos están destinados a facilitar
el trabajo con números. Podemos agruparlos en dos categorías: tipos numéricos
enteros y tipos numéricos en punto flotante. Los primeros permiten operar
exclusivamente con números enteros, sin parte decimal, mientras que el
segundo grupo contempla también números racionales o con parte decima
Tipos Referencias
Los arreglos, las clases y las interfaces son del tipo referencia. El
valor de una variable del tipo referencia es una dirección de un
conjunto de valores representados por una variable.
Las referencias en Java no son como en C++, éstas son
identificadores de instancias de alguna clase en particular.