Вы находитесь на странице: 1из 67

CONCEPTOS BÁSICOS

Lenguaje de Programación
Un lenguaje de programación es una técnica estándar de comunicación que permite expresar
las instrucciones que han de ser ejecutadas en una computadora. Consiste en un conjunto
de reglas sintácticas y semánticas que definen un programa informático.
Software
• Software es el conjunto de programas que puede ejecutar el hardware para la
realización de las tareas de computación a las que se destina.
• Se trata del conjunto de instrucciones que permite la utilización del computador. El
software es la parte intangible de la computadora, es decir: programas, aplicaciones
etc.

Formas
El software adopta varias formas en distintos momentos de su ciclo de vida:
· Código fuente: Escrito por programadores. Contiene el conjunto de instrucciones,
inteligibles por el ser humano, destinadas a la computadora.
· Código objeto: Resultado del uso de un compilador sobre el código fuente. El código
objeto no es directamente inteligible por el ser humano, pero tampoco es directamente
entendible por la computadora. Se trata de una representación intermedia del código fuente.
En Java se llama bytecode.
· Código ejecutable: Resultado de linkeditar uno o varios fragmentos de código objeto.
Constituye un archivo binario con un formato tal que el sistema operativo es capaz de
cargarlo en la memoria de un computador, y proceder a su ejecución. El código ejecutable es
directamente inteligible por la computadora.
Licencia
Una Licencia de Software es la autorización o permiso concedida por el autor para utilizar su
obra de una forma convenida habiendo marcado unos límites y derechos respecto a su uso.
La Licencia puede, restringir el territorio de aplicación del programa, su plazo de duración o
cualquier otra cláusula que el autor decida incluir.
El autor del software puede autorizar o limitar el uso, modificación y/o redistribución de su
obra adscribiéndose a un determinado tipo de licencia.
El software propietario (también llamado software no libre, software privativo, software
privado, software con propietario o software de propiedad) se refiere a cualquier programa
informático en el que los usuarios tienen limitadas las posibilidades de usarlo, modificarlo o
redistribuirlo (con o sin modificaciones), o cuyo código fuente no está disponible o el acceso
a éste se encuentra restringido.
Freeware
Es un software de computadora que se distribuye sin cargo. A veces se incluye el código
fuente, pero no es lo usual.
El freeware suele incluir una licencia de uso, que permite su redistribución pero con algunas
restricciones, como no modificar la aplicación en sí, ni venderla.
Shareware
Es una modalidad de distribución de software (juegos o programas) para que el mismo pueda
ser evaluado de forma gratuita, pero generalmente por un tiempo especificado, aunque
también las limitaciones pueden estar en algunas de las formas de uso o las capacidades
finales. Para adquirir una licencia de software que permite el uso del software de manera
completa se requiere de un pago
Software Libre
Software libre es el aquel que, una vez obtenido, puede ser usado, copiado, estudiado,
modificado y redistribuido libremente.
El software libre suele estar disponible gratuitamente en Internet, o a precio de la distribución
a través de otros medios; sin embargo no es obligatorio que sea así y, aunque conserve su
carácter de libre, puede ser vendido comercialmente.
Programación Estructurada
· La programación estructurada es una teoría de programación que consiste en construir
programas de fácil comprensión.
· La programación estructurada es especialmente útil, cuando se necesitan realizar
correcciones o modificaciones después de haber concluido un programa o aplicación.
· La programación estructurada se basa en una metodología de desarrollo de programas
llamada refinamiento sucesivo.
HISTORIA DE JAVA
Java fue diseñado en 1990 por James Gosling, de Sun Microsystems, como software para
dispositivos electrónicos de consumo.
Curiosamente, todo este lenguaje fue diseñado antes de que diese comienzo la era World
Wide Web, puesto que fue diseñado para dispositivos electrónicos como calculadoras,
microondas y la televisión interactiva.
En los primeros años de la década de los noventa, Sun Microsystems decidió intentar
introducirse en el mercado de la electrónica de consumo y desarrollar programas para
pequeños dispositivos electrónicos. Tras unos comienzos dudosos, Sun decidió crear una
filial, denominada FirstPerson Inc., para dar margen de maniobra al equipo responsable del
proyecto.
Inicialmente Java se llamó Oak (roble en inglés), aunque tuvo que cambiar de denominación,
debido a que dicho nombre ya estaba registrado por otra empresa. Se dice este nombre se le
puso debido a la existencia de tal árbol en los alrededores del lugar de trabajo de los
promotores del lenguaje.
Tres de las principales razones que llevaron a crear Java son:
1. Creciente necesidad de interfaces mucho más cómodas e intuitivas que los
sistemas de ventanas que proliferaban hasta el momento.
2. Fiabilidad del código y facilidad de desarrollo. Gosling observó que muchas de las
características que ofrecían C o C++ aumentaban de forma alarmante el gran coste de
pruebas y depuración. Por ello en los sus ratos libres creó un lenguaje de
programación donde intentaba solucionar los fallos que encontraba en C++.
3. Enorme diversidad de controladores electrónicos. Los dispositivos electrónicos se
controlan mediante la utilización de microprocesadores de bajo precio y reducidas
prestaciones, que varían cada poco tiempo y que utilizan diversos conjuntos de
instrucciones. Java permite escribir un código común para todos los dispositivos.
Para poder presentarlo en sociedad se tuvo que modificar el nombre de este lenguaje de
programación y se tuvo que realizar una serie de modificaciones de diseño para poderlo
adaptar al propósito mencionado. Así Java fue presentado en sociedad en agosto de 1995.
Algunas de las razones que llevaron a Bill Joy a pensar que Java podría llegar a ser rentable
son:
● Java es un lenguaje orientado a objetos: Esto es lo que facilita abordar la resolución de
cualquier tipo de problema.
● Es un lenguaje sencillo, aunque sin duda potente.
● La ejecución del código Java es segura y fiable: Los programas no acceden directamente a
la memoria del computador, siendo imposible que un programa escrito en Java pueda
acceder a los recursos del computador sin que esta operación le sea permitida de
forma explícita. De este modo, los datos del usuario quedan a salvo de la existencia de
virus escritos en Java. La ejecución segura y controlada del código Java es una
característica única, que no puede encontrarse en ninguna otra tecnología.
● Es totalmente multiplataforma: Es un lenguaje sencillo, por lo que el entorno necesario para
su ejecución es de pequeño tamaño y puede adaptarse incluso al interior de un navegador.
El problema fundamental de Java es que utiliza una representación intermedia denominada
código de byte para solventar los problemas de portabilidad. Los códigos de byte
posteriormente se tendrán que transformar en código máquina en cada máquina en que son
utilizados, lo que enlentece considerablemente el proceso de ejecución.
CARACTERÍSTICAS DE JAVA
A continuación haremos una pequeña redacción de las características del lenguaje, que nos
ayudarán a ver para que tipo de problemas está pensado Java:
Simple
Es un lenguaje sencillo de aprender. Su sintaxis es la de C++ “simplificada”. Los creadores
de Java partieron de la sintaxis de C++ y trataron de eliminar de este todo lo que resultase
complicado o fuente de errores en este lenguaje. La herencia múltiple, la aritmética de
punteros, por la gestión de memoria dinámica (que en Java se elimina de modo transparente
para el programador gracias al recogedor basura) son ejemplos de "tareas complicadas" de
C++ y en Java se han eliminado poco simplificado.
Orientado a Objetos
Posiblemente sea el lenguaje más orientado a objetos de todos los existentes; en Java todo,
a excepción de los tipos fundamentales de variables (int, char, long...) es un objeto.
Distribuido
Java está muy orientado al trabajo en red, soportando protocolos como TCP/IP, UDP, HTTP
y FTP. Por otro lado el uso de estos protocolos es bastante sencillo comparándolo con otros
lenguajes que los soportan.
Robusto
El compilador Java detecta muchos errores que otros compiladores solo detectarían en
tiempo de ejecución o incluso nunca. 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
Seguro
Sobre todo un tipo de desarrollo: los Applet. Estos son programas diseñados para ser
ejecutados en una página web. Java garantiza que ningún Applet puede escribir o leer de
nuestro disco o mandar información del usuario que accede a la página a través de la red
(como, por ejemplo, la dirección de correo electrónico). En general no permite realizar
cualquier acción que pudiera dañar la máquina o violar la intimidad del que visita la página
web.
Portable
En Java no hay aspectos dependientes de la implementación, todas las implementaciones de
Java siguen los mismos estándares en cuanto a tamaño y almacenamiento de los datos.
Arquitectura Neutral
El código generado por el compilador Java es independiente de la arquitectura: podría
ejecutarse en un entorno UNIX, Mac o Windows. El motivo de esto es que el que realmente
ejecuta el código generado por el compilador no es el procesador del ordenador
directamente, sino que este se ejecuta mediante una máquina virtual. Esto permite que los
Applets de una web pueda ejecutarlos cualquier máquina que se conecte a ella
independientemente de que sistema operativo emplee (siempre y cuando el ordenador en
cuestión tenga instalada una máquina virtual de Java).
Rendimiento medio
Actualmente la velocidad de procesado del código Java es semejante a la de C++, hay
ciertos pruebas estándares de comparación (benchmarks) en las que Java gana a C++ y
viceversa.
Esto es así gracias al uso de compiladores just in time, compiladores que traduce los
bytecodes de Java en código para una determinada CPU, que no precisa de la máquina
virtual para ser ejecutado, y guardan el resultado de dicha conversión, volviéndolo a llamar
en caso de volverlo a necesitar, con lo que se evita la sobrecarga de trabajo asociada a la
interpretación del bytecode.
No obstante por norma general el programa Java consume bastante más memoria que el
programa C++, ya que no sólo ha de cargar en memoria los recursos necesario para la
ejecución del programa, sino que además debe simular un sistema operativo y hardware
virtuales (la máquina virtual). Por otro lado la programación gráfica empleando las librerías
Swing es más lenta que el uso de componentes nativos en las interfaces de usuario.
En general en Java se ha sacrificado el rendimiento para facilitar la programación y sobre
todo para conseguir la característica de neutralidad arquitectural, si bien es cierto que los
avances en las máquinas virtuales remedian cada vez más estas decisiones de diseño.
Applets
Una applet (miniaplicación) es un pequeño programa en Java transferido dinámicamente a
través de Internet. Presentan un comportamiento inteligente, pudiendo reaccionar a la
entrada de un usuario y cambiar de forma dinámica. Sin embargo, la verdadera novedad es
el gran potencial que Java proporciona en este aspecto, haciendo posible que los
programadores ejerzan un control sobre los programas ejecutables de Java que no es
posible encontrar en otros lenguajes.
Multithread
Soporta de modo nativo los threads, sin necesidad del uso de librerías específicas (como es
el caso de C++). Esto le permite además que cada Thread de una aplicación java pueda
correr en una CPU distinta, si la aplicación se ejecuta en una máquina que posee varias
CPU. Las aplicaciones de C++ no son capaces de distribuir, de modo transparente para el
programador, la carga entre varias CPU.

Diferentes tipos de aplicaciones


En Java podemos crear los siguientes tipos de aplicaciones:
● Aplicaciones: Se ejecutan sin necesidad de un navegador.
● Applets: Se pueden descargar de Internet y se observan en un navegador.
● JavaBeans: Componentes software Java, que se puedan incorporar gráficamente a otros
componentes.
● JavaScript: Conjunto del lenguaje Java que puede codificarse directamente sobre cualquier
documento HTML
● Servlets: Módulos que permiten sustituir o utilizar el lenguaje Java en lugar de programas
CGI (Common Gateway Interface) a la hora de dotar de interactividad a las páginas Web.

LA MÁQUINA VIRTUAL JAVA


La Máquina Virtual Java (JVM) es el entorno en el que se ejecutan los programas Java, su
misión principal es la de garantizar la portabilidad de las aplicaciones Java. Define
esencialmente un computador abstracto y especifica las instrucciones (bytecodes) que este
computador puede ejecutar. El intérprete Java específico ejecuta las instrucciones que se
guardan en los archivos cuya extensión es .class.
Las tareas principales de la JVM son las siguientes:

• Reservar espacio en memoria para los objetos creados


• Liberar la memoria no usada (garbage collection).
• Asignar variables a registros y pilas
• Llamar al sistema huésped para ciertas funciones, como los accesos a los dispositivos
• Vigilar el cumplimiento de las normas de seguridad de las aplicaciones Java

Por ejemplo, cuando el navegador encuentra una página web con un applet, pone en
marcha la JVM y proporciona la información necesaria. El cargador de clases dentro de la
JVM ve que clases necesita el applet. Dentro del proceso de carga, las clases se examinan
mediante un verificador que asegura que las clases contienen código válido y no malicioso.
Finalmente, se ejecuta el applet.
El lenguaje Java no está diseñado solamente para crear applets que corren en la ventana
del navegador. Java es un lenguaje de propósito general, de alto nivel, y orientado a objetos.
Java es un lenguaje de programación orientado a objetos puro, en el sentido de que no hay
ninguna variable, función o constante que no esté dentro de una clase. Se accede a los
miembros dato y las funciones miembro a través de los objetos y de las clases. Por razones
de eficiencia, se han conservado los tipos básicos de datos, int, float, double, char, etc,
similares a los del lenguaje C/C++.
Los tipos de programas más comunes que se pueden hacer con Java son los applets (se
ejecutan en el navegador de la máquina cliente) y las aplicaciones (programas que se
ejecutan directamente en la JVM). Otro tipo especial de programa se denomina servlet que
es similar a los applets pero se ejecutan en los servidores Java.
La API de Java es muy rica, está formada un conjunto de paquetes de clases que le
proporcionan una gran funcionalidad. El núcleo de la API viene con cada una de las
implementaciones de la JVM
Lo esencial: tipos de datos, clases y objetos, arrays, cadenas de caracteres (strings),
subprocesos (threads), entrada/salida, propiedades del sistema, etc.
Java proporciona también extensiones, por ejemplo define un API para 3D, para los
servidores, telefonía, reconocimiento de voz, etc.

CONCEPTOS BÁSICOS DE OBJETOS


Entender que es un objeto es la clave para entender cualquier lenguaje orientado a objetos.
Existen muchas definiciones que se le ha dado al Objeto. Primero empecemos entendiendo
que es un objeto del mundo real.
Un objeto del mundo real es cualquier cosa que vemos a nuestro alrededor. Digamos que
para leer este artículo lo hacemos a través del monitor y una computadora, ambos son
objetos, al igual que nuestro teléfono celular, un árbol o un automóvil.
No necesitamos ser expertos en hardware para saber que una computadora está compuesta
internamente por varios componentes: la tarjeta madre, el chip del procesador, un disco duro,
una tarjeta de video, y otras partes más.
El trabajo en conjunto de todos estos componentes hace operar a una computadora.
Internamente, cada uno de estos componentes puede ser sumamente complicado y puede
ser fabricado por diversas compañías con diversos métodos de diseño. Pero nosotros no
necesitamos saber cómo trabajan cada uno de estos componentes, como saber qué hace
cada uno de los chips de la tarjeta madre, o cómo funciona internamente el procesador.
Cada componente es una unidad autónoma, y todo lo que necesitamos saber de adentro es
cómo interactúan entre sí los componentes, saber por ejemplo si el procesador y las
memorias son compatibles con la tarjeta madre, o conocer donde se coloca la tarjeta de
video. Cuando conocemos como interaccionan los componentes entre sí, podremos armar
fácilmente una computadora.
¿Qué tiene que ver esto con la programación? La programación orientada a objetos
trabaja de esta manera. Todo el programa está construido en base a diferentes componentes
(Objetos), cada uno tiene un rol específico en el programa y todos los componentes pueden
comunicarse entre ellos de formas predefinidas.
Todo objeto del mundo real tiene 2 componentes: características y comportamiento.
Por ejemplo, los automóviles tienen características (marca, modelo,
color, velocidad máxima, etc.) y comportamiento (frenar, acelerar,
retroceder, llenar combustible, cambiar llantas, etc.).
Los Objetos de Software, al igual que los objetos del mundo real,
también tienen características y comportamientos. Un objeto de
software mantiene sus
características en una o más "variables", e implementa su
comportamiento con "métodos". Un método es una función o subrutina
asociada a un objeto.
Para redondear estas ideas, imaginemos que hay estacionado AUDI
A4 color negro que corre hasta 260 km/h. Si pasamos ese objeto del
mundo real al mundo del software, tendremos un
objeto Automóvil con sus características
predeterminadas:
Marca = Audi
Modelo = A4
Color = Negro
Velocidad Máxima = 260 km/h

Cuando a las características del objeto le


ponemos valores decimos que el objeto tiene estados.
Las variables almacenan los estados de un objeto en un determinado momento.
Definición teórica: Un objeto es una unidad de código compuesto de variables y
métodos relacionados.
Las Clases
En el mundo real, normalmente tenemos muchos objetos del mismo tipo. Por ejemplo,
nuestro teléfono celular es sólo uno de los miles que hay en el mundo. Si hablamos en
términos de la programación orientada a objetos, podemos decir que nuestro objeto celular
es una instancia de una clase conocida como "celular". Los celulares tienen características
(marca, modelo, sistema operativo, pantalla, teclado, etc.) y comportamientos (hacer y recibir
llamadas, enviar mensajes multimedia, transmisión de datos, etc.).
Cuando se fabrican los celulares, los
fabricantes aprovechan el hecho de
que los celulares comparten esas
características comunes y construyen
modelos o plantillas comunes, para
que a partir de esas se puedan crear
muchos equipos celulares del mismo
modelo. A ese modelo o plantilla le
llamamos CLASE, y a los equipos
que sacamos a partir de ella la
llamamos OBJETOS .

Esto mismo se aplica a los objetos de software, se puede tener muchos objetos del mismo
tipo y mismas características.
Definición teórica: La clase es un modelo o prototipo que define las variables y métodos
comunes a todos los objetos de cierta clase. También se puede decir que una clase es
una plantilla genérica para un conjunto de objetos de similares características.
Por otro lado, una instancia de una clase es otra forma de llamar a un objeto. En realidad
no existe diferencia entre un objeto y una instancia. Sólo que el objeto es un término más
general, pero los objetos y las instancias son ambas representación de una clase.
Definición Teórica: Una instancia es un objeto de una clase en particular.
INSTALACIÓN DE JAVA

Descarga
Para poder hacer este curso debemos instalar el compilador de Java y la máquina virtual de
Java. Estas herramientas las podemos descargar de:
Java SE Development Kit (JDK).
Una vez que tenemos el JDK (Java Development Kit) procedemos a instalarlo:

La versión a instalar conviene que sea la última (en este momento disponemos la versión 6)
Aceptamos los términos:

Haremos la instalación por defecto por lo que presionamos el botón next:

Esperamos unos minutos mientras se procede a la instalación de Java:


Luego aparece un diálogo donde debemos especificar el directorio donde almacenar el JRE y
también procedemos a efectuar la instalación por defecto presionando el botón "next":
Una vez finalizado el proceso de instalación debe aparecer un diálogo similar a este:

INSTALACIÓN DE NETBEANS
PASOS PARA CREAR UN PROGRAMA CON ECLIPSE

Más adelante veremos los archivos que se crean en un proyecto, ahora nos dedicaremos a
codificar nuestro primer programa. En la ventana de edición ya tenemos el esqueleto de una
clase de Java que el entorno Netbeans nos creó automáticamente.
public class Clase1 {

}
Todo programa en Java debe definir la función main. Esta función la debemos codificar
dentro de la clase: "Clase1".

Procedemos a teclear lo siguiente:

public class Clase1 {

public static void main(String[] parametro) {


System.out.println("Hola Mundo Java");
}

}
PRIMER PROGRAMA EN JAVA
El Eclipse es un entorno de trabajo profesional, por lo que en un principio puede parecer
complejo el desarrollo de nuestros primeros programas.
Todo programa en Eclipse requiere la creación de un "Proyecto", para esto debemos
seleccionar desde el menú de opciones:
Ahora aparece el diálogo donde debemos definir el nombre de nuestro proyecto:

En el campo de texto "Project Name" ingresamos como nombre: Proyecto1 y dejamos todas
las otras opciones del diálogo con los valores por defecto. Presionamos el botón "Finish".
Ahora en la ventana de "Package Explorer" aparece el proyecto que acabamos de crear:
Como segundo paso veremos que todo programa en Java requiere como mínimo una clase.
Para crear una clase debemos seleccionar desde el menú de opciones:

O desde la barra de íconos del Eclipse:

En el diálogo que aparece debemos definir el nombre de la clase (en nuestro primer ejemplo
la llamaremos Clase1 (con mayúscula la letra C), luego veremos que es importante definir un
nombre que represente al objetivo de la misma), los otros datos del diálogo los dejamos con
los valores por defecto:
Luego de presionar el botón "Finish" tenemos el archivo donde podemos codificar nuestro
primer programa:

Más adelante veremos los archivos que se crean en un proyecto, ahora nos dedicaremos a
codificar nuestro primer programa. En la ventana de edición ya tenemos el esqueleto de una
clase de Java que el entorno Eclipse nos creó automáticamente.
public class Clase1 {

}
Todo programa en Java debe definir la función main. Esta función la debemos codificar
dentro de la clase: "Clase1".
Procedemos a tipear lo siguiente:

public class Clase1 {

public static void main(String[] parametro) {


System.out.println("Hola Mundo Java");
}

}
Es decir tenemos codificado en el entorno del Eclipse nuestro primer programa:

Como último paso debemos compilar y ejecutar el programa, esto lo podemos hacer desde el
menú de opciones:
O desde la barra de íconos del Eclipse:

Si no hay errores de codificación debemos ver el resultado de la ejecución en una ventana


del Eclipse llamada "Console" que aparece en la parte inferior (puede aparecer un diálogo
pidiendo que grabemos el archivo, el cual confirmamos):
Lo más importante es que quede claro los pasos que debemos dar para crear un proyecto en
Java. El objetivo de una clase, la función main etc. los veremos a lo largo de este curso.

Este programa mostrará aspectos básicos de la programación en Java como son la creación
de una clase, el método main, y la salida por consola.

1. // primer programa en java


2. public class GuiaJava {

3. public static void main(String args []){


4. System.out.println("Hola Mundo desde Java");
5. }
6. }
La línea 1 de este ejemplo muestra el uso de comentarios de una sola línea. Los comentarios
no se compilan, y su función consiste en documentar lo que se está haciendo para futuras
consultas.
También es posible el uso de comentarios que abarquen más de una línea, la forma de
realizarlo es la siguiente:

/* esto es un comentario
de mas de una línea*/

La línea 2: public class GuiaJava


Comienza la declaración de la clase GuiaJava. Todo programa en Java contiene al menos
una declaración de clases.
La palabra reservada class es utilizada para indicar la creación de la clase con el nombre que
se indique a continuación. En este caso el nombre de la clase será GuiaJava.
La palabra public también es reservada e indica que la clase podrá ser accedida e
instanciada desde cualquier otra clase. Más adelante se analizará con mayor profundidad.
El carácter “{” indica el comienzo de la implementación de la clase.

La línea 3: public static void main(String args [])

Los paréntesis luego de la palabra main indican la declaración de un método. Una clase
puede contener uno o más métodos. Por otra parte una aplicación Java debería de contener
un único método denominado main y su declaración se realiza como se indica en la línea 3.
Al igual que en la implementación de una clase el carácter utilizado para indicar el comienzo
de la misma es “{”

La línea 4: System.out.println("Hola Mundo desde java");


Acá se está invocando el método necesario para mostrar un mensaje por consola. El texto
entre paréntesis es el parámetro del método, y se mostrará tal cual se especifique entre
comillas.
Al igual que en C se puede indicar un salto de línea con el carácter de escape “\n”.

Las líneas 5 y 6:
Con el carácter “}” se indica el fin de la implementación de la clase y del método.

Ejercicio 5
Escriba y pruebe el programa Hola Mundo

Ejercicio 6
Modifique el ejercicio anterior usando el salto de línea, para mostrar el nombre del alumno en
una línea y el apellido en otra.

Recuerde:
1. Use System.out.println() para escribir un texto en pantalla
2. Todo método de Java lleva paréntesis
3. Toda sentencia termina en punto y coma
4. \n hace que el cursor salte al siguiente renglón.
5. Java es CASE SENSITIVE. Distingue mayúsculas de minúsculas.

Solución al Ejercicio 7:
public class Guia_Java {
public static void main(String args []){
System.out.println("Juan \nPérez");
}
}

Ejercicio 8
Modifique el programa anterior para que escriba el nombre de 2 personas en dos líneas
diferentes de la pantalla.

CARACTERES Y SECUENCIAS DE ESCAPE DE JAVA

Los caracteres que pueden aparecer en un programa Java para formar las constantes,
variables, expresiones, etc., son:

Las letras mayúsculas y minúsculas de la A(a) a la Z(z) de los alfabetos internacionales (la
ñ y Ñ son válidas)
Dígitos (0, 1, 2, ...)

Los caracteres ' _ ' '$' y cualquier carácter unicode por encima del 00C0.
Los caracteres especiales y signos de puntuación siguientes:
+-*/=%&#!?^“‘~\|<>()[]{}:;.,

Espacios en blanco: se llaman espacios en blanco a los siguientes caracteres: espacio,


tabulador, salto de línea. Su labor es la misma que la de un espacio en blanco: separar entre
elementos de un programa.

Por ejemplo, podemos escribir el método main sin utilizar espacios en blanco, de la forma:

public static void main(String [] args){System.out.println("Hola Mundo!!!");}

Aunque queda mucho más claro si introducimos espacios:

public static void main(String [] args){


System.out.println("Hola Mundo!!!");
}

Secuencias de escape: Una secuencia de escape está formada por una barra inversa
seguida de una letra o de una combinación de dígitos.
Una secuencia de escape siempre representa un solo carácter aunque se escriba con dos o
más caracteres.

Se utilizan para realizar acciones como salto de línea o para usar caracteres no imprimibles.

Algunas secuencias de escape definidas en Java son:

IDENTIFICADORES Y PALABRAS RESERVADAS


IDENTIFICADORES JAVA

Los identificadores son los nombres que el programador asigna a variables, constantes,
clases, métodos, paquetes, etc. de un programa.

Características de un identificador Java:

✓ Están formados por letras y dígitos.


✓ No pueden empezar por un dígito.
✓ No pueden contener ninguno de los caracteres especiales vistos en una entrada
anterior.
✓ No puede ser una palabra reservada de Java.

Ejemplo de identificadores válidos:

Edad nombre _Precio

$cantidad PrecioVentaPublico
Ejemplo de identificadores no válidos:
4num z# “Edad”

Java difiere de los identificadores en mayúsculas y minúsculas, por lo tanto, nombre y


Nombre son identificadores diferentes.

PALABRAS RESERVADAS DE JAVA


Las palabras reservadas son identificadores predefinidos que tienen un significado para el
compilador y por tanto no pueden usarse como identificadores creados por el usuario en los
programas.

Las palabras reservadas en Java son las siguientes:

abstract continue for new switch

assert default goto package synchronized

boolean do if private this

break double implements protected throw

byte else import public throws

case enum instanceof return transient

catch extends int short try

char final interface static void

class finally long strictfp volatile

const float native super while

COMENTARIOS EN JAVA

Los comentarios se utilizan para explicar y documentar el código fuente.


En Java se pueden utilizar tres tipos de comentarios:

Comentario tradicional estilo C/C++.

Empieza con los caracteres /* y acaba con */.


Pueden ocupar más de una línea y pueden aparecer en cualquier lugar donde se quiera
comentar.
No pueden anidarse.

Ejemplos de comentarios estilo C/C++:

/* Programa Ecuación segundo grado


Calcula las soluciones de una ecuación de segundo grado */
/* Lectura de datos por teclado */

Comentarios de una sola línea.

Comienzan con una doble barra ( // ) y se pueden extender hasta el final de la línea.
No tienen carácter de terminación.

Ejemplos de comentarios de una sola línea:

// Programa Ecuación segundo grado

// Calcula las soluciones de una ecuación de segundo grado

int p; // precio del producto

Comentarios de documentación Javadoc.

Son comentarios especiales para generar documentación del programa.

Comienza con /** y termina con */

Ejemplo de comentario de documentación Javadoc:

/**
*
* @author Roberto Erukh
* @version 1.0
*
*/

TIPOS DE DATOS PRIMITIVOS EN JAVA


En Java toda variable declarada ha de tener su tipo, y además antes de poder emplearla
hemos de inicializarla a un valor, si no es compilador se quejará y no generará los archivos
.class. Esto por ejemplo en C no es necesario, siendo fuente de muchos errores al
emplearse en operaciones variables que nos hemos olvidado de inicializar. A continuación
pasamos a describir los tipos de datos:
Enteros
Almacenan como su propio nombre indica números enteros, sin parte decimal. Cabe
destacar, como ya se indicó en el primer tema, que por razones de portabilidad todos los
datos en Java tienen el mismo tamaño y formato. En Java hay cuatro tipos de enteros:
Tabla 1: Tipo de datos enteros en Java

Ejemplo de declaración de variables enteras:


int a;
byte n1, n2;
short x;
Reales
Almacenan número reales, es decir números con parte fraccionaria. Hay dos tipos:

Ejemplo de declaración de variables reales:


float peso;
double longitud;
float altura = 2.5F;
double area = 1.7E4; // equivale a 1.7 * 104
double z = .123; //si la parte entera es 0 se puede omitir

Si queremos indicar que una constante es flotante: ej: 2.3 hemos de escribir: 2.3F, sino por
defecto será double.
Caracteres
En Java hay un único tipo de carácter: char. Cada carácter en Java esta codificado en un
formato denominado Unicode, en este formato cada carácter ocupa dos bytes, frente a la
codificación en ASCII, dónde cada carácter ocupaba un solo byte.
Unicode es una extensión de ASCII, ya que éste último al emplear un byte por carácter sólo
daba acogida a 256 símbolos distintos. Para poder aceptar todos los alfabetos (chino,
japonés, ruso...) y una mayor cantidad de símbolos se creó el formato Unicode.
En Java al igual que en C se distingue la representación de los datos char frente a las
cadenas de caracteres. Los char van entre comillas simples: char ch = ‘a’, mientras que las
cadenas de caracteres usan comillas dobles.
Ejemplo de declaración de variables de tipo carácter:
char car;
char letra1 = 'z';
char letra = '\u0061'; //código unicode del carácter ‘a’

Boolean (Lógicos)
Se trata de un tipo de dato que solo puede tomar dos valores: “true” y “false”. Es un tipo de
dato bastante útil a la hora de realizar chequeos sobre condiciones. En C no hay un dato
equivalente y para suplir su ausencia muchas veces se emplean enteros con valor 1 si “true”
y 0 si “false”. Otros lenguajes como Pascal sí tiene este tipo de dato.
Ejemplo de declaración de variables lógicas:
boolean primero;
boolean par = false;
DEFINICIÓN DE VARIABLES Y CONSTANTES

Una variable es una posición de memoria que se referencia con un identificador, conocido
como nombre de la variable, donde se almacena el valor de un dato que puede cambiar
durante la ejecución del programa.

Una variable tiene tres características básicas:

✓ Nombre o identificador de la variable.


✓ Tipo. Conjunto de valores que puede tomar la variable (numérico, carácter, etc.).
✓ Valor. Información que almacena.
Al igual que C, Java requiere que se declaren los tipos de todas las variables empleadas. La
sintaxis de iniciación es la misma que C:
int i;
Sin embargo, y a diferencia que en C, se requiere inicializar todas las variables antes de
usarlas, si no el compilador genera un error y aborta la compilación. Se puede inicializar y
asignar valor a una variable en una misma línea:
int i = 0;
Asignación e inicialización pueden hacerse en líneas diferentes:
int i;
i = 0;
Es posible iniciar varias variables en una línea:
int i, j, k;
Después de cada línea de código, bien sea de iniciación o de código, al igual que en C va un
;.
En Java, al igual que en todo lenguaje de programación hay una serie de palabras
reservadas que no pueden ser empleadas como nombres de variables (if, int, char, else,
goto....); alguna de estas se emplean en la sintaxis del lenguaje, otras, como goto no se
emplean en la actualidad pero se han reservado por motivos de compatibilidad por si se
emplean en el futuro.
Los caracteres aceptados en el nombre de una variable son los comprendidos entre “A-Z”,
“az”, _, $ y cualquier carácter que sea una letra en algún idioma.

Un identificador es el nombre que se le da a un componente dentro de un programa (una


variable, una constante, un método, una clase, etc.).

Ejemplo de identificadores: nombre, matriculaAlumno, $suma5, año, etc.

Toda variable tiene un ámbito. Esto es la parte del código en la que una variable se puede
utilizar. De hecho las variables tienen un ciclo de vida:

(1) En la declaración se reserva el espacio necesario para que se puedan comenzar a utilizar
(digamos que se avisa de su futura existencia)
(2) Se la asigna su primer valor (la variable nace)
(3) Se la utiliza en diversas sentencias
(4) Cuando finaliza el bloque en el que fue declarada, la variable muere. Es decir, se libera el
espacio que ocupa esa variable en memoria. No se la podrá volver a utilizar.
CONSTANTES

Los programas de ordenador contienen ciertos valores que no deben cambiar durante su
ejecución. Estos valores se llaman constantes.

Podemos decir que una constante es una posición de memoria que se referencia con un
identificador, conocido como nombre de la constante, donde se almacena el valor de un dato
que no puede cambiar durante la ejecución del programa.

Una constante en Java se declara de forma similar a una variable, anteponiendo la palabra
final

Ejemplo:

final double PI = 3.141591;


final int diasSemana = 7;
CONVERSIÓN ENTRE TIPOS NUMÉRICOS
Las normas de conversión entre tipos numéricos son las habituales en un lenguaje de
programación: si en una operación se involucran varios datos numéricos de distintos tipos
todos ellos se convierten al tipo de dato que permite una mayor precisión y rango de
representación numérica; así, por ejemplo:
-Si cualquier operando es double todos se convertirán en double.
-Si cualquier operando es float y no hay ningún double todos se convertirán a float.
-Si cualquier operando es long y no hay datos reales todos se convertirán en long.
-Si cualquier operando es int y no hay datos reales todos ni long se convertirán en int.
-En cualquier otro caso el resultado será también un int.

Java solo tiene dos tipos de operadores enteros: uno que aplica para operar datos de tipo
long, y otro que emplea para operar datos de tipo int. De este modo cuando operemos un
byte con un byte, un short con un short o un short con un byte Java empleará para dicha
operación el operador de los datos tipo int, por lo que el resultado de dicha operación será un
int siempre.
La “jerarquía” en las conversiones de mayor a menor es:
double <- float <- long <- int <- short <- byte
Estas conversiones sólo nos preocuparán a la hora de mirar en qué tipo de variable
guardamos el resultado de la operación; esta ha de ser de una jerarquía mayor o igual a la
jerarquía de la máxima variable involucrada en la operación. Si es de rango superior no
habrá problemas.
Es posible convertir un dato de jerarquía “superior” a uno con jerarquía “inferior”,
arriesgándonos a perder información en el cambio. Este tipo de operación (almacenar el
contenido de una variable de jerarquía superior en una de jerarquía inferior) se denomina
cast. Veamos una ejemplo para comprender su sintaxis:
public class Ejemplo1 {
public static void main(String[] args) {
int i = 9,k;
float j = 47.9F;
System.out.println(“i: “+i + “ j: “ +j);
k = (int) j; //empleo de un cast
System.out.println(“j: “ + j + “ k: “ +k);
j = k;//no necesita cast
System.out.println(“j: “ + j + “ k: “ +k);
float m = 2.3F;
//float m = 2.3; daría error al compilar.
System.out.println(“m: “+m);
}
} ///:~
LECTURA Y ESCRITURA POR TECLADO
ESCRITURA
Ya hemos visto que hay una función para escribir que es System.out.println. Dicha función
puede recibir como parámetro cualquier tipo básico de datos: es decir puede recibir un texto
literal (siempre entre comillas), pero también puede escribir expresiones enteras, booleanas,
decimales y caracteres simples.
Ejemplo:
int a=5, b=9;

double c=5.5;

System.out.println("Este es un texto literal");


System.out.println(a+b); //Escribe 14
System.out.println(c*c); //Escribe 30.25
System.out.println(a<c);//Escribe true

Esta función tras escribir añade un salto de línea, de modo que lo siguiente que se escriba saldrá
en otra línea. Existe una variante de esta función que no inserta el salto de línea es

System.out.print:
System.out.print("todo en la ");
System.out.print("misma línea ");
Si deseamos que el mismo println o print escriba varios valores en la misma instrucción,
podemos usar el operador de encadenar textos, ejemplo:

int a=5, b=9;


System.out.println("La suma es " + (a+b));

Es necesario usar paréntesis ya que se utiliza en la expresión el operador + con dos significados.
Este operador concatena cuando al menos hay un texto a la izquierda o derecha del operador; y
suma cuando tenemos dos números (del tipo que sea).

LECTURA

La palabra reservada import


Para importar clases de un paquete se usa el comando import. Se puede importar una clase
individual
import java.awt.Font;
o bien, se puede importar las clases declaradas públicas de un paquete completo, utilizando un
arterisco (*) para reemplazar los nombres de clase individuales.

import java.awt.*;
Para crear un objeto fuente de la clase Font podemos seguir dos alternativas

import java.awt.Font;
Font fuente=new Font("Monospaced", Font.BOLD, 36);
O bien, sin poner la sentencia import

java.awt.Font fuente=new java.awt.Font("Monospaced", Font.BOLD, 36);


Normalmente, usaremos la primera alternativa, ya que es la más económica en código, si
tenemos que crear varias fuentes de texto. Se pueden combinar ambas formas, por ejemplo, en
la definición de la clase BarTexto

import java.awt.*;
public class BarTexto extends Panel implements java.io.Serializable{
//...
}
Panel es una clase que está en el paquete java.awt, y Serializable es una interface que está en el
paquete java.io
La lectura en Java es mucho más complicada. Leer de la consola de salida requiere manejar
muchos conocimientos que pertenecen a temas más avanzados que el actual.

Una forma no tan complicada (aunque desde luego no es tan sencilla como la escritura) es
utilizar la clase JOptionPane. Dicha clase pertenece al paquete javax.swing, por lo que para
utilizarla sin tener que escribir el nombre completo conviene usar la instrucción:
import javax.swing.JOptionPane;

Esta es una clase pensada para manejar cuadros de diálogo de tipo Swing.

Uno de estos cuadros permite introducir datos y que una variable les almacene. El problema es
que todos los datos les devuelve en forma de String (texto), lo que implica almacenarles en una
variable de ese tipo y luego convertirlos al tipo apropiado (int, double, char,…).

Ejemplo: String texto=JOptionPane.s howInputDialog("Escriba un número entero");

Int n=Integer.parse Int(texto);

Evidentemente este código no es fácil. Para explicar vamos línea a línea:


♦ En la primera línea, la variabletextoalmacenalo que el usuario escriba en el cuadro de
mensaje.JOptionPane.showInputDialoges la función que permite sacar el cuadro de
mensaje."Escriba un número entero" es el texto que presenta el mensaje. Es decir el
resultado de esta instrucción es:

♦ En cuanto el usuario o usuaria escriba el número y lo acepten (botón Aceptar), lo escrito se


almacena en la variable texto.

♦ En la segunda línea, la función Integer.parseInt sirve para convertir el número escrito a


forma de entero int. Sin esta conversión no podemos manipularlo escrito como número, ya
que se considera un texto (un String).

♦ Si el usuario cancela el cuadro o bien no escribe un número entero, ocurre un error que
provocará que el programa finalice la ejecución. Arreglar estos errores será algo que
veremos más adelante

Aunque el código es un tanto críptico a estas alturas, merece la pena aprenderle ya que
permite más posibilidades de hacer programas para practicar. De otro modo no tendremos
manera de leer datos por teclado y eso supone una tara importante para nuestros
programas.

Hay que señalar que hay más funciones


de conversión, se pueden apreciaren Convierte a
esta tabla: Función
Integer.parseInt int
Short.parseShort short
Byte.parseByte byte
Long.parseLong long
Se echan de menos operadores matemáticos más potentes en Java. Por ello se ha incluido una
clase especial llamada Math dentro del paquete java.lang. Para poder utilizar esta clase, se debe
incluir esta instrucción (aunque normalmente no es necesario porque todo el paquete java.lang
ya estará incluido en nuestro código):
import java.lang.Math;
Esta clase posee métodos muy interesantes para realizar cálculos matemáticos complejos. Por
ejemplo:
double x= Math.pow(3,3); //x es 33, es decir 27
Math posee dos constantes, que son:
constante
significado
double E
El número e (2, 7182818245...)
double PI
El número Π (3,14159265...)
Por otro lado posee numerosos métodos que son:
operador
significado
double ceil(double x)
Redondea x al entero mayor siguiente:
♦ Math.ceil(2.8) vale 3
♦ Math.ceil(2.4) vale 3
♦ Math.ceil(-2.8) vale -2
double floor(double x)
Redondea x al entero menor siguiente:
♦ Math.floor(2.8) vale 2
♦ Math. floor (2.4) vale 2
♦ Math. floor (-2.8) vale -3
int round(double x)
Redondea x de forma clásica:
♦ Math.round(2.8) vale 3
♦ Math. round (2.4) vale 2
♦ Math. round (-2.8) vale -3

OPERADORES
Los operadores aritméticos en java son:
+ Suma. Los operandos pueden ser enteros o reales.
- Resta. Los operandos pueden ser enteros o reales.
* Multiplicación. Los operandos pueden ser enteros o reales.
/ División. Los operandos pueden ser enteros o reales. Si ambos son enteros el
resultado es entero. En cualquier otro caso el resultado es real.
% Resto de la división. Los operandos pueden ser de tipo entero o real.

Ejemplo de operaciones aritméticas:

int a = 10, b = 3;
double v1 = 12.5, v2 = 2.0;
char c1='P', c2='T';

Operación Valor Operación Valor Operación Valor


a+b 13 v1+v2 14.5 c1 80
a-b 7 v1-v2 10.5 c1 + c2 164
a*b 30 v1*v2 25.0 c1 + c2 + 5 169
a/b 3 v1/v2 6.25 c1 + c2 + 217
‘5’
a%b 1 v1%v2 0.5

En aquellas operaciones en las que aparecen operandos de distinto tipo, java convierte los
valores al tipo de dato de mayor precisión de todos los datos que intervienen. Esta
conversión es de forma temporal, solamente para realizar la operación. Los tipos de datos
originales permanecen igual después de la operación.

Los tipos short y byte se convierten automáticamente a int.

Por ejemplo:
int i = 7;
double f = 5.5;
char c = 'w';
Operación Valor Tipo
i+f 12.5 double
i+c 126 int
i + c – ‘0’ 78 int
(i + c) – (2 * f / 5) 123.8 double

Además existen los operadores decremento e incremento: -- y ++ respectivamente. La


operación que realizan son incrementar y decrementar en una unidad a la variable a la que
se aplican. Su acción es distinta según se apliquen antes (++a) o después (a++) de la
variable.

Operador de Asignación

Se utilizan para asignar el valor de una expresión a una variable.


Los operandos deben ser de tipo primitivo.

Los operadores de asignación en java son:


= Asignación
+= Suma y asignación
–= Resta y asignación
*= Producto y asignación
/= División y asignación
%= Resto de la división entera y asignación
<<= Desplazamiento a la izquierda y asignación
>>= Desplazamiento a la derecha y asignación
>>>= Desplazamiento a la derecha y asignación rellenando con ceros
&= and sobre bits y asignación
|= or sobre bits y asignación
^= xor sobre bits y asignación

Si los dos operandos de una expresión de asignación (el de la izquierda y el de la derecha)


son de distinto tipo de datos, el valor de la expresión de la derecha se convertirá al tipo del
operando de la izquierda.

Por ejemplo, una expresión de tipo real (float, double) se truncará si se asigna a un entero, o
una expresión en de tipo double se redondeará si se asigna a una variable de tipo float.

En Java están permitidas las asignaciones múltiples.


Ejemplo: x = y = z = 3; equivale a x = 3; y = 3; z = 3;
Ejemplo de asignaciones en Java:

a += 3; equivale a a = a + 3;
a *= 3; equivale a a = a * 3;

En general:

variable op= expresión equivale a: variable = variable op expresión

En la siguiente tabla vemos más ejemplos de asignaciones:

int i = 5, j = 7, x = 2, y = 2, z = 2;
float f = 5.5F, g = -3.25F;

Expresión Expresión Valor final


equivalente
i += 5 i=i+5 10
f –= g f=f–g 8.75
j *= (i – 3) j = j * (i – 3) 14
f /= 3 f=f/3 1.833333
i %= (j - 2) i = i % (j – 2) 0
x *= -2 * (y + z) / 3 x = x * (-2 * (y + z) -4
/ 3)

La siguiente tabla muestra todos los operadores Java ordenados de mayor a menor
prioridad.

La primera línea de la tabla contiene los operadores de mayor prioridad y la última los de
menor prioridad. Los operadores que aparecen en la misma línea tienen la misma prioridad.

Una expresión entre paréntesis siempre se evalúa primero y si están anidados se evalúan de
más internos a más externos.

Operador Asociatividad
() [] . Izquierda a derecha
++ -- ~ ! Derecha a izquierda
new Derecha a izquierda
*/% Izquierda a derecha
+- Izquierda a derecha
>> >>> << Izquierda a derecha
> >= < <= Izquierda a derecha
== != Izquierda a derecha
& Izquierda a derecha
^ Izquierda a derecha
| Izquierda a derecha
&& Izquierda a derecha
|| Izquierda a derecha
?: Derecha a izquierda
= += -= *= ... Derecha a izquierda

EXPONENCIACIÓN

En Java a diferencia que en otros lenguajes no existe el operador exponenciación. Tampoco


existen los operadores Seno o Coseno. Si se desea realizar una operación de
exponenciación se deberá invocar el método correspondiente de la clase Math de Java.lang.
Estos métodos son estáticos, por lo que no es necesario crear un objeto de dicha clase. Su
sintaxis general es:
Math.metodo(argumentos);
En el siguiente código aparecen ejemplos. Si alguna vez deseamos realizar algún otro tipo de
operación y queremos ver si la soporta Java podemos hacerlo consultando la ayuda on-line
de la clase Math, o bien la documentación que podemos descargar los desde la misma
página que él jdk.

OPERADORES RELACIONALES
En la tabla a continuación recogemos los operadores lógicos disponibles en Java:
&& AND. El resultado es verdadero si los dos operandos son verdaderos. El
resultado es falso en caso contrario. Si el primer operando es falso no se evalúa el segundo,
ya que el resultado será falso.

|| OR. El resultado es falso si los dos operandos son falsos. Si uno es


verdadero el resultado es verdadero. Si el primer operando es verdadero no se evalúa el
segundo.

! NOT. Se aplica sobre un solo operando. Cambia el valor del operando de


verdadero a falso y viceversa.

Los operandos tienen que ser de tipo primitivo.


Por ejemplo:
int a = 7, b = 9, c = 7;

Operación Resultado
a==b false
a >=c true
b<c false
a != c false

OPERADORES JAVA LÓGICOS


Los operadores lógicos se utilizan con operandos de tipo boolean. Se utilizan para construir
expresiones lógicas, cuyo resultado es de tipo true o false.
Los operadores lógicos en Java son:
&& AND. El resultado es verdadero si los dos operandos son verdaderos. El resultado es
falso en caso contrario. Si el primer operando es falso no se evalúa el segundo, ya que el
resultado será falso.
|| OR. El resultado es falso si los dos operandos son falsos. Si uno es verdadero el
resultado es verdadero. Si el primer operando es verdadero no se evalúa el segundo.
! NOT. Se aplica sobre un solo operando. Cambia el valor del operando de verdadero a
falso y viceversa.
Las definiciones de las operaciones OR, AND y NOT se recogen en unas tablas conocidas
como tablas de verdad.

A B A OR B A B A AND B A NOT A
F F F F F F F V
F V V F V F V F
V F V V F F
V V V V V V

F: Falso.
V: Verdadero

Como ejemplo, en la siguiente tabla vemos una serie de expresiones lógicas y su valor:

int i = 7;
float f = 5.5F;
char c = ‘w’;

Expresión Resultado
(i >= 6) && (c == ‘w’) true
(i >= 6) || (c == 119) true
(f < 11) && (i > 100) false
(c != ‘p’) || ((i + f) <= 10) true
i + f <= 10 false
i >= 6 && c == ‘w’ true
c != ‘p’ || i + f <= 10 true

Las expresiones lógicas en java se evalúan sólo hasta que se ha establecido el valor
cierto o falso del conjunto. Cuando, por ejemplo, una expresión va a ser seguro falsa por el
valor que ha tomado uno de sus operandos, no se evalúa el resto de expresión.
OPERADORES JAVA UNITARIOS.

Los operadores unitarios en java son:


– + signos negativo y positivo
++ -- incremento y decremento
~ complemento a 1
! NOT. Negación

Estos operadores afectan a un solo operando.

El operador ++ (operador incremento) incrementa en 1 el valor de la variable.

Ejemplo de operador incremento:

int i = 1;
i++; // Esta instrucción incrementa en 1 la variable i.
// Es lo mismo que hacer i = i + 1; i toma el valor 2

El operador –- (operador decremento) decrementa en 1 el valor de la variable.

Ejemplo de operador decremento:

int i = 1;
i--; // decrementa en 1 la variable i.
// Es lo mismo que hacer i = i - 1; i toma el valor 0

Los operadores incremento y decremento pueden utilizarse como prefijo o sufijo, es decir,
pueden aparecer antes o después de la variable.

Por ejemplo:

i = 5;
i++; // i vale ahora 6
++i; // i vale ahora 7
Cuando estos operadores intervienen en una expresión, si preceden al operando (++i), el
valor se modificará antes de que se evalúe la expresión a la que pertenece.

En cambio, si el operador sigue al operando (i++), entonces el valor del operando se


modificará después de evaluar la expresión a la que pertenece.

Por ejemplo:

int x, i = 3;
x = i++;

En esta asignación a x se le asigna el valor 3 y a continuación i se incrementa, por lo tanto,


después de ejecutarla:

x contiene 3, i contiene 4.

Si las instrucciones son:

int x, i = 3;
x = ++i;

En esta instrucción primero se incrementa i y el resultado se asigna a x. Por lo tanto,


después de ejecutarla:

x contiene 4, i contiene 4.

Otro ejemplo:

int i = 1;
System.out.println(i);
System.out.println (++i);
System.out.println (i);

Estas instrucciones mostrarían por pantalla:

1
2
2

En cambio, si se cambia la posición del operador:

int i = 1;
System.out.println(i);
System.out.println (i++);
System.out.println (i);
Estas instrucciones mostrarían por pantalla:

1
1
2

El operador complemento a 1 ~ cambia de valor todos los bits del operando (cambia unos
por ceros y ceros por unos). Solo puede usarse con datos de tipo entero. El carácter ~ es el
ASCII 126.

Por ejemplo:

int a = 1, b = 0, c = 0;
c = ~a;

CADENAS DE CARACTERES

En Java no hay un tipo predefinido para cadenas de caracteres, en su lugar hay una clase,
String, que es la que soporta las distintas operaciones con cadenas de caracteres. La
definición de un String es:
String e ; //no inicializado
String e =””; //cadena vacía
String e = “Hola”; //inicialización y asignación juntas.
Concatenación
La concatenación en Java es increíblemente sencilla: se realiza con el operador +, es decir
“sumando” cadenas de caracteres obtenemos la concatenación de estas. Lo ilustraremos con
un ejemplo:
String saludo = “hola”;
String nombre = “Pepe”;
String saluda_pepe = “”;
saluda_pepe = saludo + nombre;// saluda_pepe toma el valor
holaPepe

La sencillez de Java en el manejo de cadenas de caracteres llega incluso más allá: si una
cadena la intentamos encadenar con otro tipo de variable automáticamente se convierte la
otra variable a String, de tal modo que es perfectamente correcto:
String saludo = “hola”;
int n = 5;
saludo = saludo + “ “ + n;// saludo toma el valor “hola 5”

Subcadenas

En la clase String hay un método que permite la extracción de una subcadena de caracteres
de otra. Su sintaxis es:
Nombre_String.substring((int)posición_inicial,(int)posición_final);

Donde posición_inicial y posición_final son respectivamente la posición del primer carácter


que se desea extraer y del primer carácter que ya no se desea extraer.
String saludo = “hola”;
String subsaludo = “”;
Subsaludo = saludo.substring(0,2);// subsaludo toma el
valor “ho”

Puede extraerse un char de una cadena, para ello se emplea el método charAt(posición),
siendo posición la posición del carácter que se desea extraer.
Comparación de cadenas
Se empleó otro método de String: equals. Su sintaxis es:
cadena1.equals(cadena2);
Devuelve true si son iguales y false si son distintos.
El siguiente ejemplo permitirá ilustrar estas operaciones con Strings:
public class Ejemplo5 {
public static void main(String[] args) {
String saludo = "Hola";
String saludo2 ="hola";
int n = 5;

//Imprime por consola la subcadena formada por los caracteres


//comprendidos entre el caractero 0 de saludo y hasta el
//carácter 2, sin incluir el último
prt(saludo.substring(0,2));
//Concatena saludo con un espacio en blanco y con el valor de
//la variable n
prt(saludo +" " + n);
//Imprime el resultado del test de igualdad entre saludo y
//saludo2. Son distintos, en Java se distingue entre
//mayúsculas y minúsculas.
prt("saludo == saludo2 "+ saludo.equals(saludo2));
}
static void prt(String s) {
System.out.println(s);
}
}

ÁMBITO DE LAS VARIABLES


En este apartado vamos a tratar de ver cuál es el ámbito de validez de una variable. Éste en
Java viene dado por los corchetes: {}; una vez definida una variable en un código dejará de
existir cuando se acabe el bloque de código en el que se definió. Los bloques de código
empiezan con “{“ y acaban en “}”, por lo que la variable dejará de existir cuando se cierre el
corchete que esté justo antes que ella en el código. Veámoslo con un ejemplo:
{
int x = 12;
/* solo x disponible */
{
int q = 96;
/* x y q disponible */
}
/* solo x disponible */
/* q “fuera de ámbito” */
}
Por otro lado si intentamos hacer lo siguiente:
{
int x = 12;
{
int x = 96; /* ilegal en Java, no en C++ */
}
}
El compilador se nos quejará diciendo que la variable x ya ha sido definida. En C++ esto si es
posible, pero los diseñadores de Java decidieron no permitir este tipo de construcciones a
para lograr más claridad en el código.
ARRAYS
En Java los arrays son un objeto. Como tales se crean mediante el comando new (se verá su
uso en el tema 5). La sintaxis en la definición de un array es la siguiente:
Tipo_datos[] nombre_array = new
Tipo_datos[tamaño_array];
Tipo_datos es el tipo de los datos que se almacenarán en el array (int, char, String... o
cualquier objeto). Tamaño_array es tamaño que le queremos dar a este array. Veamos un
ejemplo:
int[] edades = new int[10];
En este ejemplo hemos definido un array llamado edades, en el que podremos almacenar 10
datos tipo entero. El primer elemento de un array se sitúa en la posición 0, exactamente igual
que en C. Si quisiésemos realizar un bucle que recorriese los elementos de este array
escribiríamos un código del tipo:
public class Ejemplo5b {
public static void main(String[] args) {
int[] edades = new int[10];
for(int i= 0; i< 10; i++){
edades[i] = i;
System.out.println(“Elemento “ + i + edades[i]);
}
int sum = 0;
for(int i= 0; i< 10; i++){
sum = sum + edades[i];
}
System.out.println(“Suma “ + sum);
}
}

TIPOS ENUMERADOS

Los tipos de datos enumerados son un tipo de dato definido por el programador (no como
ocurre con los tipos de datos primitivos). En su definición el programador debe indicar un
conjunto de valores finitos sobre los cuales las variables de tipo enumeración deberán tomar
valores. La principal funcionalidad de los tipos de datos enumerados es incrementar la
legibilidad del programa. La mejor forma de comprender lo qué son es viéndolo; para definir
un tipo de dato enumerado se emplea la sintaxis:
modificadores enum NombreTipoEnumerado{ VALOR1,VALOR2,.. }
Los posibles valores de "modificadores" serán vistos en el tema 5. El caso más habitual es
que modificadores tome el valor "public". El nombre puede ser cualquier nombre válido
dentro de Java. Entre las llaves se ponen los posibles valores que podrán tomar las variables
de tipo enumeración, valores que habitualmente se escriben en letras mayúsculas. Un
ejemplo de enumeración podría ser:
public enum Semana {LUNES, MARTES, MIÉRCOLES, JUEVES,
VIERNES, SÁBADO, DOMINGO}
Las definiciones de los tipos enumerados deben realizarse fuera del método main y, en
general, fuera de cualquier método; es decir, deben realizarse directamente dentro del
cuerpo de la clase. En el tema 5 se explicará detalladamente qué es una clase y qué es un
método.
Para definir una variable de la anterior enumeración se emplearía la siguiente sintaxis:
Semana variable;
Java2, tutorial de javahispano (http://javahispano.org). Página 26 de 148
y para darle un valor a las variables de tipo enumeración éstas deben asignarse a uno de los
valores creados en su definición. El nombre del valor debe ir precedido del nombre de la
propia enumeración:
variable = Semana.DOMINGO;
Veamos un ejemplo de programa que emplea enumeraciones:
public class Ejemplo5c {
//definimos un tipo enumerado
//los tipos enumerados deben definirse siempre fuera
//del main y, más en general, fuera de cualquier método
public enum Semana {LUNES, MARTES, MIERCOLES, JUEVES,
VIERNES, SABADO, DOMINGO};
public static void main(String[] args) {
//definimos una variable que pertenece al tipo enumeradoSemana
//y le damos el valor que representa el día martes
Semana hoy = Semana.MARTES;
//si el día se cayese en el fin de semana no hay que trabajar
//obsérvese como gracias a la numeración del programa es fácil del entender
if(hoy == Semana.DOMINGO || hoy == Semana.SABADO){
System.out.println("Hoy toca descansar");
} else{
System.out.println("Hoy toca trabajar");
}
}
}
JAVA NO ES PERFECTO
Ya hemos hecho hincapié en que Java esta diseñado para facilitar la labor del programador,
disminuyendo los tiempos de aprendizaje y de programación gracias a su sencillez y a su
capacidad de detectar errores; sin embargo, Java también tiene sus defectos: Java deja
hacer
overflow sin dar error ni en tiempo de compilación ni tan siquiera en tiempo de ejecución.

Ejemplo:
public class ejemplo6 {
public static void main(String[] args) {
//0x significa que el número está en formato hexadecimal.
// 0x7 = 0111 en binario
// 0xf = 1111 en binario
//El numero representado abajo será “0” + 31 “1”. El primer
//bit es el signo, al ser 0 indica que es un número
//positivo. Es por lo tanto el numero entero (un int son 32
//bits) más grande que podemos representar en Java
int gran = 0x7fffffff; // maximo valor int
prt("gran = " + gran);
//Forzamos un overflow:
int mas_grande = gran * 4;
//No se produce una excepción y se ejecuta la siguiente línea prt("mas_grande = " +
mas_grande);
}
static void prt(String s) {
System.out.println(s);
}
}

CONTROL DE FLUJO EN JAVA

IF

If then Else
Su modo más simple de empleo es:
If(condición) {
Grupo de sentencias;
}

Condición es una valor tipo boolean. El grupo de sentencias se ejecuta solo si la condición
toma un valor true. En caso contrario se sigue ejecutando ignorando el Grupo de sentencias.

If(condición) {
Grupo de sentencias;
}
Else
{
Grupo2 de sentencias;
}

Si condición toma el valor true se ejecuta Grupo de sentencias, en caso contrario se ejecuta
Grupo2 de sentencias. En ambos casos se continúa ejecutando el resto del código.

If(condición) {
Grupo de sentencias;
}
else if (condición){
Grupo2 de sentencias;
}
else if (condición){
Grupo3 de sentencias;
}
.
.
.
else{
Grupo_n de sentencias;
}

Si condición toma el valor true se ejecuta Grupo de sentencias, si condicion2 toma el valor
true se ejecuta Grupo2 de sentencias... y así sucesivamente hasta acabarse todas las
condiciones. Si no se cumple ninguna se ejecuta Grupo_n de sentencias. Este último else es
opcional. En ambos casos se continúa ejecutando el resto del código.

Ejemplo:

public class Ejemplo {


// Método que podremos invocar como test(int a, int b) y que
// devolverá -1 si a < b, +1 si a > b y 0 si a == b.
static int test(int val, int val2) {
int result = 0;
if(val > val2)
result = +1;
else if(val < val2)
result = -1;
else
result = 0;
return result;
}
public static void main(String[] args) {
//Imprimimos por consola el resultado de realizar unos
//cuantos test.
System.out.println(test(10, 5));
System.out.println(test(5, 10));
System.out.println(test(5, 5));
}
}

SWITCH
Los creadores de Java trataron de hacer de este lenguaje una versión simplificada y
mejorada
del lenguaje de C++. Su trabajo fue bastante bueno, pero no perfecto. Prueba de ello es esta
sentencia: está tan poco flexible como en C++.

switch(selector) {
case valor1 :
Grupo de sentencias1;
break;
case valor2 :
Grupo de sentencias2;
break;
case valor3 :
Grupo de sentencias3;
break;
case valor4 :
Grupo de sentencias4;
break;
case valor5 :
Grupo de sentencias5;
break;
// ...
default: statement;
}

Se compara el valor de selector con sentencias_n. Si el valor coincide se ejecuta su


respectivo grupo de secuencias. Si no se encuentra ninguna coincidencia se ejecutan las
sentencias de default. Si no se pusieran los break una vez que se encontrase un valor que
coincida con el selector se ejecutarían todos los grupos de sentencias, incluida la del default.
Ha llegado el momento de justificar la crítica hecha a los creadores de Java. Este tipo de
estructura tiene sus posibilidades muy limitadas, ya que en las condiciones sólo se admite la
igualdad, no ningún otro tipo de condición (sería fácil pensar ejemplos dónde, por poner un
caso, se le sacaría partido a esta sentencia si aceptase desigualdades). Además para colmo
esta comparación de igualdad sólo admite valores tipo char o cualquier tipo de valores
enteros menos long (si estás empleando Java 5 o posterior también se puede emplear un
tipo enumerado). No podemos comparar contra reales, Strings....
También se le podría criticar el hecho de que una vez cumplidas una condición se ejecuten
todas las sentencias si no hay instrucciones break que lo impidan. Esto es en muchas
ocasiones fuente de errores, aunque también hay que reconocer que a veces se le puede
sacar partido, de hecho en el ejemplo que empleamos para ilustrar esta sentencia
aprovechamos esta característica:
public class Ejemplo{
public static void main(String[] args) {
//Bucle for. Ejecutará 100 veces el código que tiene dentro.
for(int i = 0; i < 100; i++) {
//Math.random() es un método estático que genera un número real
//aleatorio entre 0 y 1.
//Math.random()*26 será un número real aleatorio entre 0 y
//26. Al sumarle un carácter, ‘a’ el carácter se transforma a
//un entero y se le suma. ‘a’ = 97.
//Se transforma el número aleatorio entre 97 y 97 + 26 en el
//carácter correspondiente a su parte entera. Será un carácter
//aleatorio, que por la disposición de los caracteres Unicode
//será un letra del abecedario.
char c = (char)(Math.random() * 26 + 'a');
System.out.print(c + ": ");
switch(c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
//Si el carácter es ‘a’, ‘e’, ‘i’, ‘o’ o ‘u’ imprimimos
//vocal.
System.out.println("vocal");
break;
default:
//Si no era ninguna de las anteriores imprimos consonante.
System.out.println("consonante");
}
}
}
}

BUCLES
Son instrucciones que nos permiten repetir un bloque de código mientras se cumpla una
determinada condición. Pasemos a ver sus tipos.

Bucle while
Cuando en la ejecución de un código se llega a un bucle while se comprueba si se verifica su
condición, si se verifica se continua ejecutando el código del bucle hasta que esta deje de
verificarse. Su sintaxis es:

while(condición){
Grupo de sentencias
}

ejemplo:
public class Ejemplo{
public static void main(String[] args) {
double r = 0;
//Mientras que r < 0.99 sigue ejecutando el cuerpo del bucle.
//La d significa double. No es necesaria
while(r < 0.99d) {
//Genera un nuevo r aleatorio entre 0 y 1.
r = Math.random();
//Lo imprime por consola.
System.out.println(r);
}
}
}

Bucle do while
Su comportamiento es semejante al bucle while, sólo que aquí la condición va al final del
código del bucle, por lo que tenemos garantizado que el código se va a ejecutar al menos
una vez. Dependerá del caso concreto si es más conveniente emplear un bucle while o do
while. La sintaxis de do while es:

do {
Grupo de sentencias;
}while(condición);

Obsérvese como el siguiente ejemplo implementado mediante un bucle do while


independientemente del valor de r ejecutará al menos una vez el código de su cuerpo:

public class Ejemplo10 {


public static void main(String[] args) {
double r;
//Idéntico al ejemplo anterior, solo que aahora la condición
//está al final del bucle.
do {
r = Math.random();
System.out.println(r);
} while(r < 0.99d);
}
}

Bucle for
Su formato es el siguiente:
for(expresion1;expresion2;expresion3){
Grupo de sentecias;
}

Expresion1 es una asignación de un valor a una variable, la variable-condición del bucle.


Expresion2 es la condición que se le impone a la variable del bucle y expresion3 indica una
operación que se realiza en cada iteración a partir de la primera (en la primera iteración el
valor de la variable del bucle es el que se le asigna en expresion1) sobre la variable del
bucle.

public class Ejemplo11 {


public static void main(String[] args) {
for( char c = 0; c < 128; c++)
Java2, tutorial de javahispano (http://javahispano.org). Página 34 de 148
//Imprime los caracteres correspondientes a los números
//enteros comprendidos entre 0 y 128. (int)c es el entero
//correspondiente al carácter c.
System.out.println("valor: " + (int)c +
" caracter: " + c);
}
}

Bucle for-each
Esta característica sólo está disponible en Java 5 y versiones posteriores. Se trata de un
bucle diseñado con el propósito de recorrer un conjunto de objetos. Dado lo básico de este
tutorial la única estructura que hemos visto que permite almacenar un conjunto de objetos
son los arrays; por lo que para nosotros será el único caso en la cual tenga sentido
emplearlo. Su sintaxis es:
for(Tipo elemento: colecciónElementos){
Grupo de sentecias;
}
Tipo es el tipo de dato de los elemento del conjunto; elemento es una variable a auxiliar que
la primera vez que se ejecute el bucle tomará el valor del primer elemento del conjunto, la
segunda vez tomará el valor del segundo elemento del conjunto y así sucesivamente. La
colecciónElementos es el conjunto de elementos sobre los cuales queremos iterar (un array
para nosotros). El bucle se repetirá una vez para cada elemento de la colección. Veamos un
ejemplo:
public class Ejemplo11{
public static void main(String[] args) {
//Este arrays será la colección de elementos por la
que iteraremos
int array[] = new int[10];
int suma = 0, contador = 0;
//con este bucle damos valores a los elementos del array
for (int i = 0; i < array.length; i++) {
array[i]= 2*i;
}
//este es el nuevo tipo de bucle. Va acumulando de la variable
//suma los valores de todo los elementos del array; el bucle
//se repetirá a una vez por cada elemento del array y la variable e
//ir a tomando como valores cada uno de los contenidos de éste
for (int e : array){ //para cada elemento del array
suma = suma + e;
}
System.out.println(suma);
}
}

Break y continue
No se tratan de un bucle, pero sí de una sentencia íntimamente relacionada con estos. El
encontrarse una sentencia break en el cuerpo de cualquier bucle detiene la ejecución del
cuerpo del bucle y sale de este, continuándose ejecutando el código que hay tras el bucle.
Esta sentencia también se puede usar para forzar la salida del bloque de ejecución de una
instrucción condicional (esto ya se vio con switch).
Continue también detiene la ejecución del cuerpo del bucle, pero en esta ocasión no se sale
del bucle, sino que se pasa a la siguiente iteración de este.
Observaremos el funcionamiento de ambos en un mismo ejemplo:
public class Ejemplo12 {
public static void main(String[] args) {
for(int i = 0; i < 100; i++) {
if(i == 74) break; // teminamos aqui el bucle
//Salto a la siguiente iteración si i no es divisible entre 9
if(i % 9 != 0) continue;
//Si I es divisible entre 9 se imprime
System.out.println(i);
}
int i = 0;
// Lazo infinito del cual se sale con break:
while(true) {
i++;
if(j == 120) break; // Salimos del lazo
Java2, tutorial de javahispano (http://javahispano.org). Página 36 de 148
System.out.println(i);
}
}
}

RETURN
Sus funciones son las mismas que en C++. Cuando se llama a un procedimiento ( que en
OOP se denominó método) al encontrarse con una sentencia return se pasa el valor
especificado al código que llamó a dicho método y se devuelve el control al código invocador.
Su misión tiene que ver con el control de flujo: se deja de ejecutar código secuencialmente y
se pasa al código que invocó al método.
Esta sentencia también está profundamente relacionada con los métodos, ya que es la
sentencia que le permite devolver al método un valor. Podíamos haber esperado hablar de
métodos para introducir esta sentencia, pero hemos decidido introducirla aquí por tener una
función relacionada, entre otras cosas, con control de flujo. En el ejemplo 7 ya se ha
ejemplificado su uso.
CLASES Y HERENCIA
Una clase es la “plantilla” que usamos para crear los objetos. Todos los objetos pertenecen a
una determinada clase. Un objeto que se crea a partir de una clase se dice que es una
instancia de esa clase. Las distintas clases tienen distintas relaciones de herencia entre si:
una clase puede derivarse de otra, en ese caso la clase derivada o clase hija hereda los
métodos y variables de la clase de la que se deriva o clase padre. En Java todas las clases
tienen como primer padre una misma clase: la clase Object.
Por motivos de simplicidad y dada la corta duración de este curso ignoraremos la existencia
del concepto de package en la explicación de los siguientes conceptos, o haremos breves
referencias a este concepto sin dar demasiadas explicaciones. En general en lo que al
alumno respecta se recomienda ignorar, al menos durante este curso, toda referencia al
término “package”.
Vamos a continuación a profundizar en todos estos conceptos y a explicar su sintaxis en
Java.

Definición de una clase


La forma más general de definición de una clase en Java es:

[Modificador] class nombreClase [extends nombreClasePadre]


[implements interface] {
Declaración de variables;
Declaración de métodos;
}

Los campos que van entre corchetes son optativos. nombreClase es el nombre que le
queramos dar a nuestra clase, nombreClasePadre es el nombre de la clase padre, de la cual
hereda los métodos y variables. En cuanto al contenido del último corchete ya se explicará
más adelante su significado.
Los modificadores indican las posibles propiedades de la clase. Veamos que opciones
tenemos:

Modificadores de clases
public: La clase es pública y por lo tanto accesible para todo el mundo. Sólo podemos tener
una clase public por unidad de compilación, aunque es posible no tener ninguna.
Ninguno: La clase es “amistosa”. Será accesible para las demás clases del package. Sin
embargo mientras todas las clases con las que estemos trabajando estén en el mismo
directorio pertenecerán al mismo package y por ello serán como si fuesen públicas. Como
por lo de ahora trabajaremos en un solo directorio asumiremos que la ausencia de
modificador es equivalente a que la clase sea pública.
final: Indicará que esta clase no puede “tener hijo”, no se puede derivar ninguna clase de
ella.
abstract: Se trata de una clase de la cual no se puede instanciar ningún objeto.
Veamos un ejemplo de clase en Java:
class Animal{
int edad;
String nombre;
public void nace(){
System.out.println("Hola mundo");
}
public void getNombre(){
System.out.println(nombre);
}
public void getEdad(){
System.out.println(edad);
}
}

Sobrecarga de métodos
Java admite lo que se llama sobrecarga de métodos: puede haber varios métodos con el
mismo nombre pero a los cuales se les pasan distintos parámetros. Según los parámetros
que se le pasen se invocará a uno u otro método:
class Animal{
int edad;
String nombre;
public void nace(){
System.out.println("Hola mundo");
}
public void getNombre(){
System.out.println(nombre);
}
public void getNombre(int i){
System.out.println(nombre +" " +edad);
Java2, tutorial de javahispano (http://javahispano.org). Página 41 de 148
}
public void getEdad(){
System.out.println(edad);
}
}

Constructores
Constructores son métodos cuyo nombre coincide con el nombre de la clase y que nunca
devuelven ningún tipo de dato, no siendo necesario indicar que el tipo de dato devuelto es
void. Los constructores se emplean para inicializar los valores de los objetos y realizar las
operaciones que sean necesarias para la generación de este objeto (crear otros objetos que
puedan estar contenidos dentro de este objeto, abrir un archivo o una conexión de
internet.....).
Como cualquier método, un constructor admite sobrecarga. Cuando creamos un objeto (ya
se verá más adelante como se hace) podemos invocar al constructor que más nos convenga.
class Animal{
int edad;
String nombre;
public Animal(){
}
public Animal(int _edad, String _nombre){
edad = _edad;
nombre = _nombre;
}
public void nace(){
System.out.println("Hola mundo");
}
public void getNombre(){
System.out.println(nombre);
}
public void getNombre(int i){
System.out.println(nombre +" " +edad);
}
public void getEdad(){
System.out.println(edad);
}
}

Modificadores de variables
public: Pública, puede acceder todo el mundo a esa variable.

Ninguno: Es “amistosa”, puede ser accedida por cualquier miembro del package, pero no
por otras clases que pertenezcan a otro package distinto.

protected: Protegida, sólo pueden acceder a ella las clases hijas de la clase que posee la
variable y las que estén en el mismo package. private: Privada, nadie salvo la clase misma
puede acceder a estas variables. Pueden acceder a ella todas las instancias de la clase
(cuando decimos clase nos estamos refiriendo a todas sus posibles instancias).
static: Estática, esta variable es la misma para todas las instancias de una clase, todas
comparten ese dato. Si una instancia lo modifica todas ven dicha modificación.

final: Final, se emplea para definir constantes, un dato tipo final no puede variar nunca su
valor. La variable no tiene por qué inicializarse en el momento de definirse, pero cuando se
inicializa ya no puede cambiar su valor.

class Marciano {
boolean vivo;
private static int numero_marcianos = 0;
final String Soy = "marciano";
void quienEres(){
System.out.println("Soy un " + Soy);
}

Marciano(){
vivo = true;
numero_marcianos++;
}

void muerto(){
if(vivo){
vivo = false;
numero_marcianos--;
}
}
}

HERENCIA
Cuando en Java indicamos que una clase “extends” otra clase estamos indicando que es una
clase hija de esta y que, por lo tanto, hereda todos sus métodos y variables. Este es un
poderoso mecanismo para la reusabilidad del código. Podemos heredar de una clase, por lo
cual partimos de su estructura de variables y métodos, y luego añadir lo que necesitemos o
modificar lo que no se adapte a nuestros requerimientos. Veamos un ejemplo:

class Animal{
protected int edad;
String nombre;
public Animal(){
}
public Animal(int _edad, String _nombre){
edad = _edad;
nombre = _nombre;
}
public void nace(){
System.out.println("Hola mundo");
}
public void getNombre(){
System.out.println(nombre);
}
public void getNombre(int i){
System.out.println(nombre +" " +edad);
}
public void getEdad(){
System.out.println(edad);
}
}

//La clase Perro extiende a Animal, heredando sus métodos y


//variables
public class Perro extends Animal{
Perro(){
edad = 0;
nombre ="Tobi";
}
Perro(int edad, String nombre){
//Esta sentencia invoca a un constructor de la clase padre.
super(edad,nombre);
}
//Método estático que recibe un objeto de tipo Perro e
//invoca a su método getEdad()
static void get1(Perro dog){
//El métod getEdad() no está definido en Perro, lo ha
//heredado de Animal.
dog.getEdad();
}
public static void main (String[] args){
//Creamos un objeto de tipo Perro
Perro dog = new Perro(8,"Bambi");
//Invocamos al método estátioco get1 pasándole el objeto //
de tipo Perro creado.
Perro.get1(dog);
}
}

Creación y referencia a objetos


Aunque ya hemos visto como se crea un objeto vamos a formalizarlo un poco. Un objeto en
el ordenador es esencialmente un bloque de memoria con espacio para guardar las variables
de dicho objeto. Crear el objeto es sinónimo de reservar espacio para sus variables,
inicializarlo es darle un valor a estas variables. Para crear un objeto se utiliza el comando
new. Veámoslo sobre un ejemplo:
class Fecha{
int dia,mes,ano;
Fecha(){
dia=1;
mes = 1;
ano = 1900;
}
Fecha (int _dia, int _mes, int _ano){
dia= _dia;
mes = _mes;
ano = _ano;
}
}

Fecha hoy;
hoy = new Fecha();

Con el primer comando hemos creado un puntero que apunta a una variable tipo fecha, como
está sin inicializar apuntara a null. Con el segundo inicializamos el objeto al que apunta hoy,
reservando espacio para sus variables. El constructor las inicializará, tomando el objeto hoy
el valor 1-1-1900.

Fecha un_dia = new Fecha(8,12,1999);

Con esta sentencia creamos una variable que se llama un_dia con valor 8-12-1999.

Una vez creado un objeto será posible acceder a todas sus variables y métodos públicos, así
por ejemplo en el ejemplo anterior un_dia.dia = 8. Si la variable fuese privada solo podrían
acceder a ella sus instancias:

class Fecha{
private int dia,mes,ano;
Fecha(){
dia=1;
mes = 1;
ano = 1900;
}
Fecha (int ndia, nmes, nano){
dia= ndia;
mes = nmes;
ano = nano;
}
}
De este modo no podríamos acceder a las variables de la clase fecha, para acceder a ella
tendríamos que hacerlo mediante métodos que nos devolviesen su valor. A esto se le
denomina encapsulación. Esta es la forma correcta de programar OOP: no debemos dejar
acceder a las variables de los objetos por otro procedimiento que no sea paso de mensajes
entre métodos.

this
Es una variable especial de sólo lectura que proporciona Java. Contiene una referencia al
objeto en el que se usa dicha variable. A veces es útil que un objeto pueda referenciarse a sí
mismo:
class Cliente{
public Cliente(String n){
//Llamamos al otro constructor. El empleo de this ha de ser
//siempre en la primera línea dentro del constructor.
this(n, Cuenta.nuevo_numero());
.....
}
public Cliente (String n, int a){
nombre = n;
numero_cuenta = a;
}
.....
}

Otro posible uso de this, que ya se ha visto en ejemplos anteriores es diferenciar entre
variables locales de un método o constructor y variables del objeto. En los códigos del cd
correspondientes a los ejemplos Perro.java y Perro2.java el constructor de la clases Animal
aunque realiza la misma función que los que se recogen en estos apuntes son ligeramente
diferentes:
public Animal(int edad, String nombre){
//this.edad = varaible del objeto Perro
//edad = variable definida sólo dentro del constructor
this.edad =edad;
this.nombre=nombre;
}

MÉTODOS GRÁFICOS

Java proporciona la clase Graphics, que permite dibujar elipses, cuadrados, líneas, mostrar
texto y también tiene muchos otros métodos de dibujo. Para cualquier programador, es
esencial el entendimiento de la clase Graphics, antes de adentrarse en el dibujo en Java.
La clase Graphics proporciona el entorno de trabajo para cualquier operación gráfica que se
realice dentro del AWT.
Para poder pintar, un programa necesita un contexto gráfico válido, representado por una
instancia de la clase Graphics. Pero esta clase no se puede instanciar directamente; así que
debemos crear un componente y pasarlo al programa como un argumento al método paint().
El único argumento del método paint() es un objeto de esta clase. La clase Graphics dispone
de métodos para soportar tres categorías de operaciones gráficas:
1) Dibujo de primitivas gráficas,
2) Dibujo de texto,
3) Presentación de imágenes en formatos *.gif y *.jpeg.

Además, la clase Graphics mantiene un contexto gráfico: un área de dibujo actual, un color
de dibujo del Background y otro del Foreground, un Font con todas sus propiedades, etc.Los
ejes están situados en la esquina superior izquierda. Las coordenadas se miden siempre en
pixels.

Problema 1
Crear una aplicación que utilice las primitivas gráficas principales que provee la clase
Graphics:

Вам также может понравиться