Está en la página 1de 39

Introducción a

Java
Jorge Juan Gómez Basanta
WebSphere IT Specialist
jgomezb@mx1.ibm.com

Abril 2005
Java: Plataforma y versiones
J2SE: Standard Edition, desarrollo Cliente-servidor
J2EE: Enterprise Edition, EJBs, Servlets, JSPs
J2ME: Mobile Edition
JDK: Java Developer Kit: compilador, librerías, ...
JRE: Java Runtime Environment: JVM, librerías, para ejecutar
aplicaciones
Introducción a Java
La mayoría de los programas son compilados o interpretados
para ser ejecutados en una computadora
Java es compilado e interpretado
Primero se traduce un programa en un lenguaje intermedio
conocido como Java bytecodes
El interprete parsea y ejecuta cada Java bytecode en la
computadora
Los programas Java se ejecutan dentro de una Java Virtual
Machine
Garbage collection
Cuando la memoria es asignada, debe ser liberada cuando no es
necesaria
En otros lenguajes esta tarea pertenece al desarrollador
Java tiene un sistema de rastreo de asignación de memoria
Verifica y libera la memoria cuando ya no es ocupada
El proceso es automático
Varía en diferentes implementaciones del JVM
JRE
Realiza tres tareas principales:
Carga el código: Classloader
Carga todas las clases requeridas
Verifica el código: Bytecode verifier
Se verifica si el código se apega a la especificación
Que no viole la integridad del sistema
Tipos de parámetros
Conversiones ilegales
Ejecuta el código: Runtime interpreter
Aplicación Java Básica
public class HelloWorld
{
public static void main(String args[])
{
System.out.println(“Hello World”);
}
}

main(): punto inicial de la ejecución

public: el método puede ser accesado por cualquiera

static: se ejecuta sin necesidad de tener una instancia

void: el método no regresa nada

String args[]: recibe un parámetro que es un arreglo de Strings

System.out.println: método estático aplicado al campo out de la clase System


Estructura de una clase
Declaración de package (opcional)
Package: grupo de clases relacionadas: package com.ibm.ejemplos;

Sentencias import (solo las necesarias): import java.io.*;

Definición de clase o interface: public class HelloWorld { ... }

La clase debe guardarse en un archivo con el nombre de la


clase, seguida de .java.
Es compilada con: javac -cp CLASSPATH HelloWorld.java

Al compilarse se genera un archivo .class, que puede ser


ejecutado por el JVM en cualquier plataforma.
Laboratorio 1:
Crear una aplicación Java similar a
HelloWorldApp que imprima un String en la
pantalla
Nociones básicas
Comentarios, tres tipos:
// una sola línea

/* múltiples líneas */

/** para javadoc */

Sentencia: es una línea de código terminada con ;


Bloque: es un conjunto de sentencias delimitadas por llaves {}
Identificadores: nombres dados a variables, clases o métodos
Pueden empezar con letra, guión bajo (_) o signo de pesos $

Son sensibles a las mayúsuculas y no tienen longitud máxima


Palabras reservadas
abstract 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
continue for new switch

Estas palabras no pueden ser utilizadas como nombres de


clases, métodos, variables. Tampoco se pueden usar true, false,
null.
(*) no utilizadas; (**) agregadas en 1.2; (***) agregadas en 5.0
Tipos Primitivos
Lógicos: boolean
true o false
Texto: char
caracter Unicode de 16 bits: ‘a’, ‘\t’, ‘\u????’
String: no es primitivo, es una clase: “hola”
Numéricos (todos son signados)
Enteros: byte (8 bits), short (16 bits), int (32 bits), long (64 bits)
considerados int, a menos de que sean seguidos por L (o l)
por ejemplo 2L, y serían long.
tres formas: decimal (1234), octal (077) y hexadecimal (0xBAAC)
Flotantes: double (64 bits), float (32 bits)
considerados double, a menos que sean seguidos por F (o f).
ejemplos: 3.14, 6.02E23, 2.718F, 123.4E+306D
Objetos
Una clase permite crear nuevos tipos, por ejemplo:
public class MiFecha {
int dia;
int mes;
int anio;
}

Es posible definir una variable de tipo MiFecha , por ejemplo:


MiFecha miCumpleanios, tuCumpleanios;
miCumpleanios.dia = 6;
tuCumplieanios.mes = 10;

Al declarar variables de tipos primitivos se asigna espacio en


memoria para ellas
Si se declara una variable no primitiva, como String o Date, no
se asigna memoria, es solo una referencia hacia el dato.
Creación de un objeto
Antes de utilizar un objeto, es necesario asignar memoria:
MiFecha cumpleanios; // asigna espacio para la referencia
cumpleanios = new MiFecha(); // asigna el espacio, el objeto

Es posible crear objetos sin tener una referencia a ellos, son


llamados objetos anónimos (anonymous)
Laboratorio 2:
Crear una clase MiPunto, con dos enteros x y y
Imprimir los valores de ambos miembros x y y de
los objetos te tipo MiPunto (inicio y fin)
Probar el programa

Agregar al método main:


Una nueva variable de tipo MiPunto llamada
medio. Asignar a esta variable la referencia de la
variable fin
Imprimir los valores de medio.
Asignar nuevos valores a medio
Imprimir los valores de fin y medio, verificar que
los valores de fin reflejen el cambio en medio, ya
que se refieren al mismo objeto.
Variables
Locales

Definidas dentro de un método

Creadas cuando el método es ejecutado, destruidas a la salida

Deben ser inicializadas antes de ser utilizadas

Variables de clase, 2 tipos:

static: existen mientras exista la clase

de instancia: existen mientras el objeto sea referenciado

De método

Definen argumentos o parámetros pasados a un método mediante una


llamada al método

Existen durante la llamada al método


Inicialización de variables
Las variables de instancia son inicializadas con estos valors al
momento de asignar espacio en memoria para ellas
tipo valor inicial
byte, short, int 0
long 0L
float 0.0F
double 0.0D
char ‘\u0000’ (NULL)
boolean false
Tipos por referencia null

Las variables locales deben ser inicializadas manualmente ants


de ser utilizadas
Operadores
++, --, +, -, ~, !
*, /, %
<<, >>, >>>
<, >, <=, >=, instanceof
==, !=
&, ^, |, &&, ||, ?:
=, *=, /=, %=, +=, -=, <<=, >>=, >>>=, &=, ^=, |=
&& y || son operadores de corto circuito
Casting
Cuando se perderá información durante una conversión, el
programador debe confirmar la asignación con un cast
long valorGrande = 99L;

int convertido = (int)valorGrande;

Las variables son promovidas automáticamente si se cambian de


a una forma más grande
long valorGrande = 6; // 6 es un int
Sentencias
Ramificación Ciclos
if (condicion) { for (init_expr; boolean test_expr, alter_expr) {
sentencias sentencias
} else { }
sentencias
} while (boolean) {
sentencias;
switch (expresion) { }
case constante1:
sentencias; do {
break; sentencias
case constante2: } while (boolean_test)
sentencias;
break;
default: Control de flujo
sentencias;
break; break [etiqueta];
} continue [etiqueta];
label: sentencia;
Métodos
<modificadores> <tipo_de_regreso> <nombre> ([lista_de_parametros])
[throws <excepcion>] { ... }

Ejemplo:
public Persona obtenerPersona(int idPersona) throws SQLException { ... }

Los parámetros son pasados “por valor”


No pueden ser cambiados por el método
Al pasar una instancia como parámetro, el valor del
parámetro es una referencia al objeto
El contenido del objeto puede ser cambiado por el método,
pero la referencia no.
Laboratorio 3:
El factorial de un número X (X!) es igual a:
X*(X-1)*(X-2)*...*1
Por ejemplo, 4! = 4 x 3 x 2 x 1 = 24
Crear una aplicación llamada Factorial que
immprima los factoriales de 2, 4, 6 y 10
Arreglos
Punto[] p; ó Punto p[];
Punto[] p = new Punto[100];
p[0] = new Punto(1,2);
p[1] = new Punto(3,4);

Al crear un arreglo, todos los elementos son inicializados


Para inicializar al declarar:
String nombres[] = {“Jorge”, “Juan”};

Arreglos multidimensionales
int dosDimensiones [][] = new int[4][]; // no rectangular
dosDimensiones[0] = new int[5];
dosDimensiones[1] = new int[8];

int dosDimensiones [][] = new int[4][5]; // rectangular

Los arreglos no pueden ser redimensionados.


Para copiar arreglos: System.arraycopy()
Programación Orientada a Objetos (1)
this, se refiere al objeto actual o instancia de la clase
En algunos casos su uso es redundante
Permite pasar una referencia del objeto actual como
parámetro
Overloading
Crear varios métodos en una misma clase que hacen el
mismo trabajo con diferentes parámetros:
public void setFecha(int anio, int mes, int dia) { ... }

public void setFecha(int anio, int mes, int dia, int hora, int minutos) { ... }
Programación Orientada a Objetos (2)
Constructores
Al crear una instancia con new Xxx() se ejecuta un constructor.

Un constructor proporciona una manera sencilla de inicializar los campos de un objeto.

El nombre del constructor debe coincidir con el nombre de la clase.

No deben tener un tipo de retorno.

Pueden ser recargados (overloaded)

Java proporciona un constructor por defecto

public class Xyz {


// variables

public Xyz() { ... }

public Xyz(int x) { ... }


}
Programación Orientada a Objetos (3)
Herencia
Posibilidad de extender una clase a partir de otra

public class Empleado {


String nombre;
int sueldo;
public class Gerente extends Empleado {
}
String departamento;
Empleado[] subordinados;
}
public class Gerente {
String nombre;
int sueldo;
String departamento;
Empleado[] subordinados;
}
Programación Orientada a Objetos (4)
Encapsulamiento
Forzar a un usuario a acceder a los datos mediante un método, por ejemplo
para validar un dato.
private int dia;
public int getDia() { return dia; }
public void setDia(int d) { if (d > 0 && d < 31) dia = d; }

Polimorfismo
Un objeto solo tiene una forma

Una variable puede ser polimórfica, ya que se puede referir a objetos de


diferentes tipos, por ejemplo, la clase Gerente tiene acceso a métodos de la
clase Empleado.

Todas las clases extienden a Object

La clase Object incluye métodos como toString()


Colecciones heterogéneas
Es posible crear colecciones de objetos con una clase común
Como Object es común a todas las clases se pueden construir
colecciones con objetos de cualquier tipo
Empleado[] unidadDeSoftware = new Empleado[50];
unidadDeSoftware[0] = new Gerente();
unidadDeSoftware[1] = new Empleado();

Se pueden tener parámetros polimórficos, es decir, que puedan


recibir objetos de diferentes tipos
public void calcularBeneficios(Empleado e) {
if (e instanceof Gerente)
// Obtener beneficios para gerentes
else if (e instanceof Director)
// Obtener beneficios para directores
else
// Obtener beneficios para empleados regulares
}
Manejo de Objetos
Casting: Permite restablecer todas las propiedades de un objeto.
if (e instanceof Gerente) Gerente g = (Gerente)e;

Overloading: Cambiar comportamiento de método heredado


Una subclase puede “sobreescribir” un método heredado
Debe mantener: nombre, tipo de retorno, parámetros,
excepciones lanzadas
No puede ser menos accesible que el método heredado
super, es una palabra clave para referirse a la clase padre
utilizada comúnmente para extender (no reemplazar) la
funcionalidad de un método heredado
Excepciones
El manejo de excepciones permite a un programa cachar excepciones,
manejarlas y continuar con la ejecución del programa.
try {
// código que puede mandar excepción, código protegido
} catch (MiExcepcion me) {
// codigo a ejecutar si se lanza MiExcepcion
} catch (Excepcion e) {
// código a ejecutar si se lanza una excepción genérica
} finally {
// código a ejecutar siempre, independientemente de
// si ocurrió una excepción o no
}

El único caso en que finally no sería ejecutado es cuando se


llama a System.exit() dentro del código protegido
Un método puede lanzar la excepción en vez de cacharla
public void llamadaProblematica() throws IOException, SQLException
Laboratorio 4
Crear una clase CuentaBancaria que tenga como datos:
nombreDeLaCuenta y balance; y como métodos depositar,

retirar e imprimirBalance.

Probar la clase realizando depósitos y retiros


Crear una subclase de CuentaBancaria llamada
CuentaDeCheques, que incluya una cantidad de reserva.

Debe sobreescribir el método retirar para utilizar la


reserva si el retiro excede al balance de la cuenta.

Probar la clase realizando depósitos y retiros


Crear una nueva clase que extienda a Exception
llamada CuentaSobregirada. Lanzar esta excepción
cuando se intenta retirar más de lo que se tiene.
Modificadores (1)
static
Una variable marcada static, puede ser compartida entre
varias instancias de una clase, por ejemplo para
comunicación entre las instancias
Un método marcado static puede ser accesado sin contar con
una instancia de un objeto en particular
Pueden ser accesados con el nombre de la clase:
Math.sin(90.0);

System.out.println(“Hola”);
Modificadores (2)
final
Una clase marcada como final no puede ser extendida
Un método marcado como final no puede ser “overloaded”
Una variable marcada como final es una constante
abstract
Una clase que declara la existencia de métodos pero no su
implementación es una clase abstracta
No se puede crear una instancia de una clase abstracta
Una clase abstracta puede ser extendida
Modificadores (3)
interface
variación de una clase abstracta
todos sus métodos son abstractos
solo puede tener variables static final
permite “darle la vuelta” a la herencia sencilla de Java
cuando una clase implementa una interface debe definir
todos los métodos de dicha interface
Es posible realizar llamadas a métodos de la interface en
cualquier objeto que la implemente.
Control de acceso avanzado
Las variables y métodos pueden tener cuatro niveles de acceso:

public, protected, default, private

Las clases pueden estar en el nivel de acceso public o default


default es utilizado cuando no se escribe un modificador de
acceso en su declaración. Solo permite el acceso a clases en el
mismo paquete.
Mismo
Modificador Misma clase Subclase Universo
package
public Si Si Si Si

protected Si Si Si

default Si Si

private Si
Diferencias entre == y equals()
== es verdadero cuando se comparan variables con la misma
referencia a un objeto
equals() por lo general compara a dos objetos en base a su
contenido. Esto solamente ocurre cuando el Objeto que se
compara ha sobreescrito este método.
Wrapper classes
Java no considera a los tipos primitivos como objetos.
Java proporciona clases para envolver a los tipos primitivos:
boolean → Boolean

byte → Byte

char → Character

short → Short

int → Integer

long → Long

float → Float

double → Double

int pInt = 500;


Integer wInt = new Integer(pInt);
int p2 = wInt.intValue();

int x = Integer.valueOf(str).intValue();
Colecciones
Una colección es un objeto que representa a un grupo de
objetos conocidos como sus elementos
ArrayList, Vector
HashSet, TreeSet
TreeMap, HashMap
Stack, LinkedList
...
Paquetes comunes
java.lang:contiene clases básicas del lenguaje, como String,
Math, Integer, Float, ...
java.net:contiene clases para realizar operaciones de red,
sockets y URLs
java.io:contiene clases que lidian con entrada y salida, por
ejemplo para escribir y leer archivos
java.util: clases para definir propiedades del sistema, manejo
de fechas, colecciones
java.text: clases para formato e internacionalización
Temas avanzados
Inner classes. Permiten agregar la definición de una clase
dentro de otra.
Threads. Un thread permite la ejecución concurrente de
diferentes tareas.
Reflection API: Permite conocer programáticamente la
estructura de una clase Java.
Archivo JAR: Permite empaquetar clases Java y otros archivos
en un solo archivo comprimido.

También podría gustarte