Historia Del Lenguaje Java
Historia Del Lenguaje Java
El lenguaje Java fue desarrollado en sus inicios por James Gosling, en el año
1991. Inicialmente Java era conocido como Oak o Green.
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:
¿Qué es un lenguaje de programación?: Es un lenguaje formal que,
mediante una serie de instrucciones, le permite a un programador
escribir un conjunto de órdenes, acciones consecutivas, datos
y algoritmos para, de esa forma, crear programas que controlen el
comportamiento físico y lógico de una máquina.
Las plataformas de software: Las plataformas de software puede ser
un sistema operativo o entorno de programación, aunque más
comúnmente se trata de una combinación de ambos. Una notable
excepción a esto es Java, que utiliza un sistema operativo
independiente de la máquina virtual para cada código compilado,
conocido en el mundo de Java como bytecode.
El código binario de Java para esta máquina virtual recibe el nombre
de Bytecode. Este código binario de Java es transformado
a código binario de la máquina real por la máquina virtua a través de
su compilador JIT (Just in Time) en el momento de la ejecución.
JVM bytecode es el formato binario de código ejecutable por la máquina
virtual de java. Algo así como el famoso lenguaje máquina "assembler", pero
para la VM de java.
Bytecode: Es un lenguaje intermedio. El programador, durante el
proceso de desarrollo escribe el código fuente en Java y lo pasa por un
compilador, que da lugar a los bytecodes.
Plataforma Java: Como ya se ha señalado, la plataforma Java es una
excepción a la regla general de que un sistema operativo es una
plataforma de software. El lenguaje Java requiere de una máquina
virtual, o un "CPU virtual" en el que se ejecuta todo el código que se
escribe en el lenguaje. Esto permite que el mismo ejecutable binario
pueda ejecutarse en todos los sistemas, apoyado por el software Java,
a través del uso de una máquina virtual Java (JVM). Ejecutables de
Java no se ejecutan de forma nativa en el sistema operativo, es decir,
ni de Windows, ni Linux ejecutan programas Java directamente.
CARACTERISTICAS DE JAVA
SIMPLE:
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.
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.
CLASE
Descripción de objeto. Consta de una serie de métodos y datos que resumen las
características de este objeto. Definir clases permite trabajar con código
reutilizable. Puesto que desde una clase se puede crear una instancia y así
reutilizar el código escrito para esta si tener que volver a escribir el código para
la instancia. La instancia toma el patrón de la clase padre. Sin embargo, las
variables son idependientes. Una clase es una plantilla. Define de manera
genérica cómo van a ser los objetos de determinado tipo. Por ejemplo, en un
juego, una clase para representar a personas puede llamarse Persona y tener
una serie de atributos como Nombre, Apellidos o Edad (que normalmente
son propiedades), y una serie de comportamientos que pueden tener,
como Hablar(), Caminar() o Comer() y que se implementan
como métodos de la clase (funciones).
Una clase por sí sola no sirve de nada, pues no es más que un concepto, sin
entidad real. Para poder utilizar una clase en un programa lo que hay que hacer
es instanciarla. Instanciar una clase consiste en crear un nuevo objeto concreto
de la misma. Es decir, un objeto es ya una entidad concreta que se crea a partir
de la plantilla que es la clase. Este nuevo objeto tiene ya "existencia" real, puesto
que ocupa memoria y se puede utilizar en el programa. Así un objeto puede ser
una persona que se llama Cristina López, de 37 años y que en nuestro
programa podría hablar, caminar o comer, que son los comportamientos que
están definidos en la clase.
Podemos definir informalmente una clase como una plantilla (o
esqueleto o plano) a partir de la cual se crean los objetos.
OBJETO
Cada objeto, de igual modo que la entidad de la vida real a la que representa,
tiene un estado (es decir, unos atributos con unos valores concretos) y un
comportamiento (es decir, tiene funcionalidades o sabe hacer unas acciones
concretas). Informalmente, podemos decir que un objeto es cualquier
elemento único del mundo real con el que se pueda interactuar.
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
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
Numéricos enteros: Son los tipos byte, short, int y long. Los 4 representan
números enteros con signo.
Carácter: El tipo char representa un carácter codificado en el sistema unicode.
Numérico decimal: Los tipos float y double representan números decimales en
coma flotante.
Lógicos: El tipo boolean es el tipo de dato lógico; los dos únicos posibles valores
que puede representar un dato lógico son true y false. true y false son palabras
reservadas de Java.
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.