Java es un lenguaje de programación de
propósito general orientado a objetos desarrollado por Sun Microsystems.
También se puede decir que Java es una tecnología que no sólo se reduce al
lenguaje sino que además provee de una máquina virtual Java que permite
ejecutar código compilado Java, sea cual sea la plataforma que exista por
debajo; plataforma tanto hardware, como software (el sistema operativo que
soporte ese hardware). El apoyo a esta tecnología viene dado por la gran
cantidad de fabricantes que apoyan esta especificación de máquina virtual.
Aprender el lenguaje de programación Java
requiere tiempo y esfuerzo, pero en este curso trataremos de sentar las bases
para el conocimiento general del lenguaje. El lenguaje se inspira en otros
lenguajes:
- sentencias
comunes de C y C++ (sintaxis parecida a dichos lenguajes)
- concurrencia
parecida a la de Mesa (un lenguaje de investigación de Xerox)
- interrupciones
parecidas a las de Modula-3
- tratamiento
de enlace dinámico de código nuevo parecido al de Lisp
- definiciones
de interfaces parecidas a las de Objective C
- gestión
de almacenamiento automático parecida a la de Lisp
Sun describe al lenguaje Java de la siguiente
manera:
- Simple
- Orientado
a Objetos
- Tipado
estáticamente
- Distribuido
- Interpretado
- Robusto
- Seguro
- de
Arquitectura Neutral
- Multihilo
- con
Recolector de basura (Garbage Collector)
- Portable
- de
Alto Rendimiento: sobre todo con la aparición de hardware especializado y
mejor software
- Dinámico
Sun admite que lo dicho anteriormente son un
montón de halagos por su parte, pero el hecho es que todas esas características
pueden servir para describir el lenguaje. Todas ellas son importantes, sin
embargo cabe destacar tres, que son las que han proporcionado tanto interés por
el lenguaje: la portabilidad, el hecho de que sea de arquitectura neutral y su
simplicidad. Java ofrece toda la funcionalidad de los lenguajes potentes, pero
sin las características menos usadas y más confusas de éstos.
Java elimina muchas de las características de
otros lenguajes como C++, para mantener reducidas especificaciones del lenguaje
y añadir características muy útiles como el recolector de basura. No es
necesario preocuparse de liberar memoria, el recolector se encarga de eliminar
la memoria asignada. Gracias al recolector, sólo te tienes que preocupar de
crear los objetos relevantes de tu sistema ya que él se encarga de destruirlos
en caso de no ser reutilizados.
Java reduce en un 50% los errores más comunes
de programación con lenguajes como C y C++. Entre las características más
"indeseables" de C++ que se han evitado en el diseño de Java
destacan: ficheros de cabecera, aritmética de punteros, sobrecarga de
operadores, estructuras, uniones, conversión implícita de tipos, clases base
virtual, pre-procesador, etc.
Java es interpretado.
Estrictamente hablando, Java es interpretado,
aunque en realidad Java es tanto interpretado como compilado. De hecho, sólo
cerca del 20% del código Java es interpretado por la JVM (Java Virtual
Machine), pero es un 20% muy importante. Tanto la seguridad de Java como su
habilidad para ser ejecutado en múltiples plataformas se deben a que los pasos
finales de la compilación se manejan localmente.
Existen ciertos entornos que para mejorar el
rendimiento usan un pequeño compilador para la última fase de compilación, de
forma que una vez que se tenga el bytecode, en vez de interpretarlo se compila
generando código nativo para esa plataforma y se ejecuta, pero esta compilación
se realiza cada vez que se quiera ejecutar el programa. El único código
realmente independiente es el bytecode. Este tipo de compiladores se conocen
como 'Just In Time' o JIT. Sin embargo, el bytecode no se completa hasta que se
junta con un entorno de ejecución, que en este caso será la máquina virtual
Java de la plataforma en la que estemos. Un browser puede proveer dicha
plataforma desde el punto de vista del sistema operativo.
Inconvenientes.
El browser tiene que interpretar los ficheros
de clases antes de que se ejecuten. Utilizando un lenguaje de programación
tradicional como puede ser el C++, el ordenador puede ejecutar directamente el
código generado. Sin embargo, debido a la interpretación que el browser tiene
que hacer de los ficheros, los programas escritos en Java tienden a ejecutarse
bastante más lentos que con otros lenguajes de programación (p.e. C++).
¿Por qué se considera un rasgo positivo el
hecho de combinar la compilación y la interpretación?
- Facilita
la seguridad y la estabilidad.
- Reduce
los problemas de versiones.
El hecho de que la última fase de la
compilación se lleve a cabo por un dispositivo de una determinada plataforma,
releva al programador de la responsabilidad del mantenimiento de varios fuentes
en varias plataformas. La interpretación también admite que los datos se
incorporen en tiempo de ejecución, de ahí el comportamiento dinámico que
también caracteriza a Java.
Para establecer Java como parte integral de la
red, el compilador Java compila su código a un fichero objeto de formato
independiente de la arquitectura de la máquina en que se ejecutará. Cualquier
máquina que tenga el sistema de ejecución (runtime) puede ejecutar ese código
objeto, sin importar en modo alguno la máquina en que ha sido generado.
El código fuente Java se "compila" a
un código de bytes de alto nivel independiente de la máquina. Este código
(bytecode) está diseñado para ejecutarse en una máquina hipotética que es
implementada por un sistema runtime, que sí es dependiente de la máquina. Por
lo tanto, lo que verdaderamente es dependiente del sistema es la Máquina
Virtual Java (JVM) y las librerías fundamentales, que también nos permitirían
acceder directamente al hardware de la máquina. El compilador Java genera
bytecode que serán ejecutables dondequiera que exista una JVM.
Java implementa la tecnología básica de C++
con algunas mejoras y elimina algunas cosas para mantener el objetivo de la
simplicidad del lenguaje. 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, enlace dinámico y
polimorfismo. Los modelos de objetos son llamados, como en C++, clases y sus
copias, instancias. Estas instancias, como en C++, necesitan ser construidas y
destruidas en espacios de memoria.
Java incorpora funcionalidades inexistentes en
C++ como por ejemplo, la resolución dinámica de métodos. Esta característica
deriva del lenguaje ObjectiveC. En C++ se suele trabajar con librerías
dinámicas (DLLs) que obligan a recompilar la aplicación cuando se retocan las
funciones que se encuentran en su interior. Java resuelve este inconveniente
mediante una interfaz específica llamada RTTI (Run Time Type Identification)
que define la interacción entre objetos excluyendo variables de instancias o
implementación de métodos. Las clases en Java tienen una representación en el
runtime que permite a los programadores interrogar por el tipo de clase y
enlazar dinámicamente la clase con el resultado de la búsqueda.
En Java casi todo son objetos. La mayoría de
los lenguajes orientados a objetos permiten la herencia múltiple, lo que puede
llevar a confusiones y/o complicaciones innecesarias. Java no permite herencia
múltiple, sólo soporta "Herencia simple" en una estructura cósmica
(todas las clases Java derivan jerárquicamente de la clase "Object").
La herencia simple significa que en cada momento cada clase sólo hereda de otra
clase. Este tipo de herencia evita problemas del tipo de herencias múltiples
contradictorias o exclusivas entre sí.
Java también permite la creación de clases
totalmente abstractas, a las que llama interfaces con características similares
a los interfaces IDL de CORBA. Las interfaces permiten definir métodos que
pueden compartir con varias clases, sin tener en cuenta cómo las otras manejan los métodos.
pueden compartir con varias clases, sin tener en cuenta cómo las otras manejan los métodos.
El código Java pasa muchos tests antes de
ejecutarse en una máquina. El código se pasa a través de un verificador de
bytecodes que comprueba el formato de los fragmentos de código y aplica un
probador de teoremas para detectar fragmentos de código ilegal -código que falsea
punteros, viola derechos de acceso sobre objetos o intenta cambiar el tipo o
clase de un objeto-.
Si los bytecode pasan la verificación sin
generar ningún mensaje de error, entonces sabemos que:
- El
código no produce desbordamiento de operandos en la pila
- El
tipo de los parámetres de todos los códigos de operación son conocidos y
correctos
- No
ha ocurrido ninguna conversión ilegal de datos, tal como convertir enteros
en puntero
- El
acceso a los campos de un objeto se sabe que es legal: public, private, protected
- No
hay nungún intento de violar las reglas de acceso y seguridad establecidas
- Evitamos
saltos a mitad de una instrucción, o direccionamientos de memoria de un
objeto fuera de los límites del mismo.
El cargador de clases también ayuda a Java a
mantener su seguridad, separando el espacio de nombres del sistema de ficheros
local, del de los recursos procedentes de la red. Esto limita cualquier
aplicación del tipo Caballo de Troya, ya que las clases se buscan primero entre
las locales y luego entre las procedentes del exterior.
API son las iniciales de Application
Programmer Interface. Pensemoslo siguiente. Por muy completo que sea un
lenguaje en cuanto a estructuras, tipos de datos y operadores, para que sea
funcional necesita hacer E/S (procesar ficheros, pedir datos por teclado, leer
el ratón o visualizar ventanas). La E/S es dependiente del Sistema Operativo.
La API es una capa de abstracción que se pone encima del S.O. para permitir
hacer entradas y salidas de una manera estandarizada. Se trata de una
especificación de una librería software, detallando las llamadas a funciones,
los argumentos, y los resultados que obtienes al utilizarlas. Una API sólo
existe en papel y no es más que diseño. De hecho, para usar una API necesitas una
librería que exista y que implemente esa API.
Clasificación de las APIs
Las APIs
están clasificadas como API Core (Núcleo) o como Standard Extension
(Extensiones estándar). Una API Core es aquélla que viene incluida en el
sistema JDK, es parte de la implementación estándar de Sun y cualquier sistema
Java tiene que ser capaz de soportarlas. Una extensión estándar es una librería
que los sistemas Java no tienen por qué soportar, pero de hacerlo, lo tiene que
hacer siguiendo exactamente la forma estándar.
Sintaxis de Java
Sintaxis de Java
Reglas que debes seguir al escribir en Java y seguir una sintaxis
correcta sin cometer errores y escribir de la manera correcta.
-Todas las instrucciones(OJO una instrucción no es lo mismo que una línea, ya que en Java puedes dejar espacios entre líneas y no haber terminado la instrucción) de código en Java deben terminar con un signo punto y coma ” ; “
ej:
System.out.println(
-Todas las instrucciones(OJO una instrucción no es lo mismo que una línea, ya que en Java puedes dejar espacios entre líneas y no haber terminado la instrucción) de código en Java deben terminar con un signo punto y coma ” ; “
ej:
System.out.println(
“Hola mundo”
); //notese que la
instrucción se divide en dos líneas pero al terminar se utiliza “;”
-Todas las variables al igual que en otros lenguajes deben iniciar con
una letra mas no con un numero o caracter especial, pueden iniciar con una
letra y posteriormente usar numeros para nombrarlas.
ej:
String hola; //correcto
Integer Numero1; //correcto
Double 23numero; //incorrecto
ej:
String hola; //correcto
Integer Numero1; //correcto
Double 23numero; //incorrecto
-Otra regla importante es que para llevar una estructura correcta, todo
programa en Java debe tener minimo una clase, las cuales deben tener metodos,
las clases se crean de la siguiente manera:
public class Nombredeclase /*aqui se declara una
clase, notese que comienza con mayusculas la cual es la forma correcta de
nombrar una clase*/
{
public static void main(String args[ ]){}/* este es el metodo principal de la clase, dentro de este se escriben instrucciones*/
}
{
public static void main(String args[ ]){}/* este es el metodo principal de la clase, dentro de este se escriben instrucciones*/
}
Comprender la estructura de un programa en Java puede ser dificil si no
se tiene mucha experiencia, pero la mejor manera de comprender como funciona es
programando, puedes utilizar programas ya hechos , ejecutarlos y asi mismo
estudiar su codigo fuente para que comprendas su funcionamiento.
Operadores numericos:
Continuemos con los operadores numericos, los operadores numericos basicos son los siguientes:
* multiplicación
+ suma
- resta
/ division
% modulo o residuo(regresa el residuo de una division)
Continuemos con los operadores numericos, los operadores numericos basicos son los siguientes:
* multiplicación
+ suma
- resta
/ division
% modulo o residuo(regresa el residuo de una division)
Operadores condicionales
> mayor que
< menor que
>= mayor o igual
<= menor o igual
== igual //para comparar igualdad se puede utilizar el metodo .equals() para comparar objetos, asi como cadenas String y otras clases de objetos
! diferente
!= diferente de
> mayor que
< menor que
>= mayor o igual
<= menor o igual
== igual //para comparar igualdad se puede utilizar el metodo .equals() para comparar objetos, asi como cadenas String y otras clases de objetos
! diferente
!= diferente de
Asignación
= el simbolo ” = ” igual se utiliza para asignar un valor a una variable, es por esto que no debe ser utilizado como condición.
Ej:
Variablenumerica = 25; //uso correcto ya que se asigna un valor numerico a un numero
if(variable1=variable2) //uso incorrecto
= el simbolo ” = ” igual se utiliza para asignar un valor a una variable, es por esto que no debe ser utilizado como condición.
Ej:
Variablenumerica = 25; //uso correcto ya que se asigna un valor numerico a un numero
if(variable1=variable2) //uso incorrecto
Tipos
de datos de java
TIPOS DE DATOS
(VARIABLES) 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 (sólo números,
con su valor de cálculo) o de tipo carácter o cadena de caracteres (valor
alfanumérico que constará sólo de texto o de texto mezclado con números).
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).
Operadores de java
En Java disponemos
de los operadores lógicos habituales en lenguajes de programación como son
“es igual”, “es distinto”, menor, menor o igual, mayor, mayor o igual, and (y),
or (o) y not (no). La sintaxis se basa en símbolos como veremos a continuación
y cabe destacar que hay que prestar atención a no confundir == con = porque
implican distintas cosas.
OPERADOR
|
DESCRIPCIÓN
|
==
|
Es
igual
|
!=
|
Es
distinto
|
<,
<=, >, >=
|
Menor, menor
o igual, mayor, mayor o igual
|
&&
|
Operador
and (y)
|
||
|
Operador
or (o)
|
!
|
Operador
not (no)
|
Operadores principales
en Java
El operador
|| se obtiene en la mayoría de los teclados pulsando ALT GR + 1, es decir, la
tecla ALT GR y el número 1 simultáneamente.
Los operadores
&& y || se llaman operadores en cortocircuito porque
si no se cumple la condición de un término no se evalúa el resto de la
operación. Por ejemplo: (a == b && c != d && h >= k) tiene
tres evaluaciones: la primera comprueba si la variable a es igual a b. Si no se
cumple esta condición, el resultado de la expresión es falso y no se evalúan
las otras dos condiciones posteriores.
En un caso como ( a
< b || c != d || h <= k) se evalúa si a es menor que b. Si se cumple esta
condición el resultado de la expresión es verdadero y no se evalúan las otras
dos condiciones posteriores.
El operador !
recomendamos no usarlo hasta que se tenga una cierta destreza en programación.
Una expresión como (!esVisible) devuelve false si (esVisible == true), o true
si (esVisible == false). En general existen expresiones equivalentes que
permiten evitar el uso de este operador cuando se desea.
Declaración
de variables y constantes
Constantes
def: Una constante es un dato cuyo valor no puede cambiar
durante la ejecución del programa. Recibe un valor en el momento de la
compilación y este permanece inalterado durante todo el programa. Las
constantes se declaran en una sección que comienza con la palabra reservada const. Después de declarar una
constante ya puedes usarla en el cuerpo
principal del programa. Tienen varios usos: ser
miembro en una expresion, en una comparación, asignar su
valor a una variable, etc.
En el siguiente
ejemplo se contemplan varios casos:
const Min = 0;
Max = 100;
Sep = 10;
var
i : integer;
begin
i := Min;
while i < Max do begin
writeln(i);
i := i + Sep
end
end.
|
Se puede hacer una división de las constantes en tres clases:
- constantes literales (sin nombre)
- constantes declaradas (con nombre)
- constantes expresión
Son valores de cualquier tipo que se utilizan directamente, no se declaran ya que no tienen nombre. En el siguiente ejemplo tienes un par de constantes literales (el 3, el 4, y el 3.1416):
VolumenEsfera
:= 4/3 * 3.1416 * Radio * Radio * Radio;
|
También llamadas constantes con nombre, son las que se declaran en la sección const asignándoles un valor directamente. Por ejemplo:
const
Pi = 3.141592; (* valor real *)
Min = 0; (* entero *) Max = 99; (* entero *) Saludo = 'Hola'; (* cadena caract. *) |
También se declaran en la sección const, pero a estas no se les asigna un valor directamente, sino que se les asigna una expresión. Esta expresión se evalúa en tiempo de compilación y el resultado se le asigna a la constante. Ejemplo:
const
Min = 0;
Max = 100; Intervalo = 10; N = (Max - Min) div Intervalo; Centro = (Max - Min) div 2; |
Variables
def: Una variable es un nombre asociado a un elemento de
datos que está situado en posiciones contiguas de la memoria principal, y su
valor puede cambiar durante la ejecución de un programa.
Toda variable
pertenece a un tipo de dato concreto. En la declaración de una variable se debe indicar el
tipo al que pertenece. Así tendremos variables enteras, reales, booleanas, etc.
Por otro lado, distinguimos tres partes fundamentales en la vida de una
variable:Declaración de variables
Esta es la primera fase en la vida de cualquier variable. La declaración se realiza en la sección que comienza con la palabra var. Si quieres más información, puedes ir al apartado que trata sobre la declaración de variables en el tema Estructura de un programa.
Nota: Toda variable que vaya a ser utilizada en Pascal
tiene que ser previamente declarada.
Iniciación de variablesEsto no es más que darle un valor inicial a una variable. Así como lo primero que se hace con una variable es declararla, lo siguiente tiene que ser iniciarla. Esto se hace para evitar posibles errores en tiempo de ejecución, pues una variable tiene un valor indeterminado después de declararla. Principalmente, existen dos maneras de otorgar valores iniciales a variables:
- Mediante una
sentencia de asignación
- Mediante uno de
los procedimientos de entrada de datos (read o readln)
Veamos un ejemplo que reúne los dos casos:
begin ...
i:=1;
readln(n);
while i < n do begin
(* cuerpo del bucle *) i := i + 1
end;
...
end.
|
Utilización de variables
Una vez declarada e iniciada una variable, es el momento de utilizarla. Esta es la parte que presenta un mayor abanico de posibilidades. A continuación tienes unas cuantas:
- Incrementar
su valor:
i := i + 1
- Controlar
un bucle:
for i:=1 to 10 do ...
- Chequear
una condición:
if i<10 then ...
- Participar
en una expresión:
n := (Max - Min)
div i
- Y otras que ya
irás descubriendo
Expresiones, declaraciones y bloques de
java
Expresiones
Una expresión es una construcción
compuesta de variables, operadores y llamadas a métodos, que se construyen de
acuerdo a la sintaxis de la lengua, que se evalúa como un valor único. Ya
hemos visto ejemplos de expresiones, se muestra en negrita a
continuación:
int cadence = 0 ;
anArray[0]
= 100 ;
System.out.println( "Element 1 at index 0: " + anArray[0]
);
int result
= 1 + 2 ; // result is now 3
if( value1 == value2 ) System.out.println( "value1
== value2" );
El tipo de datos del valor devuelto por una
expresión depende de los elementos utilizados en la expresión. La
expresión cadence = 0 devuelve un int porque el operador de
asignación devuelve un valor del tipo de datos que su mano izquierda operando,
en este caso, cadence es un int . Como se puede ver en
las otras expresiones, una expresión puede devolver otros tipos de valores, así
como boolean o String .
El lenguaje de programación Java permite construir expresiones compuestas de varias expresiones más pequeñas, siempre y cuando el tipo de datos requeridos por una parte de la expresión coincide con el tipo de datos de la otra.
El lenguaje de programación Java permite construir expresiones compuestas de varias expresiones más pequeñas, siempre y cuando el tipo de datos requeridos por una parte de la expresión coincide con el tipo de datos de la otra.
Declaraciones
Las declaraciones son aproximadamente equivalentes
a las sentencias en los lenguajes naturales. Una declaración
constituye una unidad completa de la ejecución. Los siguientes tipos
de expresiones se puede convertir en un comunicado poniendo fin a la expresión
con un punto y coma ( ; ).
·
Expresiones de asignación
·
Cualquier uso de ++ o --
·
Invocaciones de métodos
·
Las expresiones de creación de objetos
Estas declaraciones se llaman declaraciones
de expresión. Estos son algunos ejemplos de declaraciones de
expresión.
aValue = 8933.234; // assignment statement
aValue++; // increment
statement
System.out.println("Hello World!"); // method invocation statement
Bicycle myBike = new Bicycle(); // object creation
statement
Además de las declaraciones de expresión, hay dos
tipos de declaraciones: sentencias de declaración y las declaraciones
de control de flujo. Una instrucción de declaración declara una variable.
ya ha visto muchos ejemplos de sentencias de declaración:
double aValue = 8933.234 / / declaración
de declaración
Finalmente, las declaraciones de control de flujo regular el orden en el que se ejecuta. Usted aprenderá acerca de las declaraciones de control de flujo en la siguiente sección, Control de Estados de Flujos de
Bloques
Un bloque es un grupo de cero o
más declaraciones entre llaves equilibrada y puede ser utilizado en cualquier
lugar de una única sentencia está permitido. El siguiente ejemplo, BlockDemo , ilustra el uso de bloques:
class BlockDemo {
public static void main(String[] args) {
boolean condition = true;
if
(condition) { // begin block 1
System.out.println("Condition is true.");
} //
end block one
else { // begin block 2
System.out.println("Condition is false.");
} // end block 2
}
}
No hay comentarios:
Publicar un comentario