You are on page 1of 26

Curso intensivo de Java

(o en qu se diferencia C++ de
Java)

Jorge J. Gmez Sanz

Qu es JAVA
! Un lenguaje de POO
! Un lenguaje interpretado.
! C++ es compilado a instrucciones mquina
! Portable:
! C++ Ansi se supone que es portable. Al final no lo
es. Sistemas de ficheros
! Se basa en la definicin de una mquina virtual
genrica
! Esta mquina tiene implementaciones para
diferentes sistemas operativos
JSE y JEE
! Se trata de dos variantes de JAVA
! Antes se hablaba slo del JDK
! Ahora el JSE se denomina todo aquello
de uso cotidiano del JAVA (AWT,
SWING, Comunicacin de Red)
! JEE incluye libreras extras para
construir: servlet, applet, EJB, correo
electrnico

Versiones
! JBuilder 9
! J2SE 1.4.2
Compilando
! C++
! Compilar + enlazar = EXE
! JAVA
! No hay .exe
! Compilar " .class
! El compilador de JAVA funciona cuando
dice que hay un error, indica cul es. No
hay que adivinar

Ejecutando
! .EXE se ejecutan directamente
! algunos ejecutables necesitan que ciertas
librerias esten presentes: dll
! Cada DLL es dependiente del S.O.
! Linux: .so
! .class necesitan de un interprete: el JRE
o el JDK completo
! Los programas pueden distribuirse con
todo lo que necesitan en formato jar
Depurando
! El C++ tiene utilidades para depurar
! gdb, depurador del borland
! No est preparado per se para depuracin
! Java, al ser intepretado, permite depurar
mejor
! Se puede parar/reanudar la ejecucin de cualquier
programa
! Se pueden colocar breakpoints condicionales
! Muestra interbloqueos

Memoria
! No se pueden manipular directamente la
memoria
! No hay operador *
! todo lo que se maneja es puntero a excepcin de
los tipos simples
! Los objetos no se borran con delete
! Existe un recolector de basura (garbage collector)
encargado de liberar toda la memoria no utilizada
! objetos que no son referenciados por ninguna variable
! El GC se invoca por s solo
Fundamental
! Directorio de fuentes: aqu se alojan
todos los .java
! Directorio de clases: aqu se guarda
el resultado de compilar los .java
! Directorio de libreras: contiene los
.class y .jar extras requeridos por
nuestros programas

Cmo se ejecutan las clases


! Se espera que en la clase
mipaquete.miclase exista un mtodo
llamado main
! Este mtodo tiene una sintaxis concreta

public static void main (String args[]){


...
}
Cmo se ejecutan las clases
! Se puede ejecutar cada clase desde el
ms-dos
java cp DIRECTORIO_DE_CLASES
mipaquete.miclase
java cp DIRECTORIO_DE_CLASES
miclase

Cmo se ejecutan las clases


! Puede haber tantos main como clases
existan
! Al lanzar el java, se indica cul es la clase
principal y por lo tanto el main a seguir
! Esto es til para probar por separado
cada clase antes de ensamblarla con las
otras
SINTAXIS

Sintaxis
! Se mantienen los tipos simples: float,
int, double
! Clases java.lang.String y java.util.Vector
se manejan de forma parecida
Sintaxis
! Pocas diferencias:
! Se mantienen if, for, while, expresiones
condicionales, asignaciones
! Cambin la declaracin de clases, mtodos y
variables
! Aparecen los interfaces
! El operador de llamada: siempre el punto
! Se escribe this.X, nunca this -> X

Declaracin de clases
public class Pepe extends Manolo
implements Paco {
private void pepeillo(int juan){
....
}
}
Diferencias
! No hay secciones public ni private,
cada mtodo/atributo contiene un
modificador public/private/protected
! Los mtodos abstractos se declaran con
la palabra clave abstract. Si hay un
mtodo abstracto, entonces tambin
hay que declarar la clase con un
abstract antecediendo la palabra class

Declaracin de clases
! La primera letra de la clase en
mayscula siempre
! Cada clase debe de ir en un fichero del
mismo nombre
! Clase Pepe # fichero Pepe.java
! Una clase por fichero
! No hay include. En su lugar se usa la
palabra import. Se ver ms adelante
Paquetes (nuevo)
! Los paquetes son exclusivos de Java
! Un paquete contiene ms clases u otros
paquetes
! Se puede ver cada paquete como un
directorio de clases
! Para ubicar cada clase, se utiliza una especie
de path que equivale a los paquetes
recorridos hasta alcanzarla
! p1.p2.p3.Pepe
! Se utiliza para estructurar la aplicacin

Paquetes (nuevo)
! Una clase se declara como perteneciente a un
paquete concreto con el comando package
package mipaquete;
class A {
...
}
! La clase A est en el paquete mipaquete
! mipaquete.A
Paquetes (nuevo)
! Adems, hace falta meter el fuente
A.java en un directorio llamado
mipaquete
! Este directorio debe de estar por debajo
de mi directorio de fuentes
! Al compilar, se crea automticamente
un directorio similar en el directorio
de clases

Paquetes (nuevo)
! Cmo se usan las clases de un paquete
! Al principio del programa poner

import paquete1.paquete2.MiClase
! O bien

import paquete1.paquete2.*;
! Es el equivalente al #include
Interfaces (nuevo)
! Se trata del equivalente a clases que no
tienen ningn mtodo implementado
interface NOMBRE [extends Interfaz1,
Interfaz2, ...., InterfazN]{
metodo1;
metodo2;
}

Interfaces (nuevo)
! Una clase implementa una interfaz
cuando provee de un cuerpo a cada
mtodo declarado en la interfaz
interface A{ class C implements A{
public void B(); public void C(){...};
} public void B(){...};
}
Excepciones
! Captura: lo mismo que en C++. try/catch
! Para declarar una nuevo tipo de excepcin
! Se extiende java.lang.Exception
! e.g.: en un fichero aparte A.java
! class A extends java.lang.Exception {};
! Para declararla en el mtodo:throws
! Para lanzarla dentro del mtodo
! throw new NOMBREEXCEPCION();
! Ahora una excepcin no puede ser cualquier
cosa

Excepciones (nuevo)
! Hay excepciones que no hay que capturar
! RuntimeException: se trata de errores que
impiden continuar con la ejecucin
! La salida de nuestro programa, si se produce
una excepcin no capturada, indicar dnde
se dio el error (como en el debug stack
window del Borland C++)
! Debis buscar la primera entrada empezando por
arriba que os suene
Importante (nuevo)
! Cuando se capturen excepciones es
conveniente imprimir la traza de la
excepcin
! Esto se hace invocando al mtodo
printStackTrace de la excepcin

Ejemplo
import java.io.*;
import java.util.*;

public class Pruebas {


public void uno(){
try {
int d=0;
System.out.println(d/0);
}
catch (java.lang.ArithmeticException ai) {
ai.printStackTrace();
}

public static void main(String args[]) {


new Pruebas().uno();

}
Resultado
C:\otro2>java -cp classes Pruebas
java.lang.ArithmeticException: / by zero
at Pruebas.uno(Pruebas.java:12)
at Pruebas.main(Pruebas.java:21)

Herencia
! C++: mltiple
! Java
! Clases: simple
! Interfaces: mltiple
! Una clase java extiende slo otra clase java,
pero puede que mltiples interfaces
! Una interfaz java extiende mltiples
interfaces
Herencia

class A extends B implements C,D {

....

GRAFICOS

Todo nuevo
Interfaces grficas
! Desde el JBuilder podis construir las
que queris
! Se trata de cdigo java puro que no
necesita de libreras extras

Paneles
! Se trata de la construccin bsica de JAVA
para interfaces grficas
! Se basa en definir paneles cuyo contenido
son otros paneles o elementos bsicos
! Container/Component
! Cada panel determina cmo se colocan sus
constituyentes
! Layout: FlowLayout, BorderLayout, GridLayout
Aadiendo componentes
! A un panel se le aaden componentes
con las instrucciones add
! Se pueden especificar parmetros
adicionales
add(boton, BorderLayout.North)
! Estos parmetros vienen dados por el
layout que se este utilizando

Ejemplo
import java.io.*;
import java.util.*;
import javax.swing.*;
public class Pruebas extends javax.swing.JFrame{
public void construye(){
JPanel jp=new JPanel();
jp.add(new JLabel("hola"));
this.getContentPane().add(jp);
}
public static void main(String args[]) {
Pruebas p=new Pruebas();
p.construye();
p.pack();
p.show();
}
}
Ejemplo
import java.io.*;
import java.util.*;
import javax.swing.*;

public class Pruebas {


public JFrame construye(){
JFrame jf=new JFrame("Mi frame");

JPanel jp=new JPanel();


jp.add(new JLabel("hola"));
jf.getContentPane().add(jp);
return jf;
}

public static void main(String args[]) {


Pruebas p=new Pruebas();
JFrame jf=p.construye();
jf.pack();
jf.show();

}
}

Dibujando
! Se dibuja con el AWT
! Se emplea dentro del mtodo paint
! public void paint(Graphics g){
! // Codigo para pintar
! }
! El objeto Graphics contiene mtodos
para dibujar lneas, cuadrados, crculos,
etc
Paneles avanzados
! La definicin de paneles conoce dos
variantes: AWT y SWING
! AWT: se trata del modelo bsico. Se
encuentran en paquete java.awt
! SWING: paneles ms avanzados
construidos a partir del AWT. Se
encuentran en javax.swing

Acciones
! Las acciones se asocian a los botones
de forma ms explcita que en el
Borland
! A un objeto se le dice directamente: tu
tienes que ejecutar este cdigo cada
vez que ....
! Event handlers
Listas grficas
! Usarlas tiene la complicacin de decidir
qu datos hay que guardar
! Se inicializan con un array
! O bien se crea un DefaultComboModel,
DefaultTreeModel
! Pasando como parmetro un objeto de
este tipo a la lista correspondiente,
conseguimos poder modificar en ejecucin
su contenido

import java.io.*;
import java.util.*;
import javax.swing.*;

Ejemplo
public class Pruebas {

DefaultComboBoxModel dcb;
JComboBox jc;
int counter=0;

public JFrame construye(){


JFrame jf=new JFrame("Mi frame");
JPanel jp=new JPanel();
JButton jb=new JButton("agrega");
dcb=new DefaultComboBoxModel();
dcb.addElement("nada");
jc=new JComboBox(dcb);
jp.add(jc);
jp.add(jb);
jf.getContentPane().add(jp);
jb.addActionListener(new java.awt.event.ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent ae){
agrega();
}
});
return jf;
}
Ejemplo
public void agrega(){
counter++;
dcb.addElement(""+counter);
}

public static void main(String args[]) {


Pruebas p=new Pruebas();
JFrame jf=p.construye();
jf.pack();
jf.show();

FICHEROS

Muy parecido al de C++


(iostream)
Ficheros
! Se basa en el uso de flujos
! Flujos de entrada: teclado, fichero de
disco, lectura de una pgina web
! Flujos de salida: pantalla, un fichero, una
conexin ftp
! Estos tipos se corresponden con :
OutputStream e InputStream

OutputStream
! Mecnica bsica
! Abrir flujo (open). Esto no se hace
directamente " Qu estoy abriendo
! Escribir (write): Si escribo una cadena, hay
que convertirla antes a un array de bytes
con el mtodo getBytes
! Cerrar (close)
Ejemplo
import java.io.*;

public class Pruebas {


public static void main(String args[]) {
try {
OutputStream fos = new FileOutputStream("mifichero.txt");
fos.write("hola".getBytes());
fos.close();
}
catch (java.io.IOException ioe) {
ioe.printStackTrace();
}

InputStream
! Mecnica bsica
! Abrir flujo (open). Esto no se hace
directamente " Qu estoy abriendo
! Leer (read): Se leen bytes. Estos bytes hay
que convertirlos (cast) a char. Se aaden
uno a uno a la cadena hasta terminar
! Cerrar (close)
Ejemplo
import java.io.*;
import java.util.*;

public class Pruebas {


public static void main(String args[]) {
try {
InputStream is = new java.net.URL("http://grasia.fdi.ucm.es").openStream();
int read=0;
StringBuffer sb=new StringBuffer();
while (read!=-1){
read=is.read();
if (read!=-1)
sb.append((char)read);
}
is.close();
System.out.println(sb);
}
catch (java.io.IOException ioe) {
ioe.printStackTrace();
}
}
}

Referencias
Para saber ms
! Visitar
http://www.javasoft.com

! Las dudas que tengis las podis


resolver en el forum de desarrolladores