p1 intro java2h

47
Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java F. de Sande 2014–2015 F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java 2014–2015 1 / 47

Upload: german-mendez

Post on 21-Nov-2015

239 views

Category:

Documents


0 download

DESCRIPTION

kjlñ´ñ

TRANSCRIPT

  • Aprende a programar en Java en 2 horas:las diferencias esenciales entre C++ y Java

    F. de Sande

    20142015

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 1 / 47

  • Java

    Java es un lenguaje interpretado, orientado a objetos y especialmenteseguro para la programacion de servicios en Internet.

    Se puede compilar como un codigo intermedio (el llamado bytecode)que se ejecutara en cualquier sistema que disponga de una maquinavirtual de Java.

    Este documento, basado en un curso de R. Carrasco, U. de Alicante,pretende conducirte desde el C++ al Java en muy poco tiempo atraves de una serie de ejercicios muy simples que destacan lasdiferencias mas importantes entre ambos lenguajes.

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 2 / 47

  • Los ejercicios estan disenados para ser realizados consecutivamente

    Solo despues de haber programado una respuesta, debes pinchar enel numero de ejercicio para compararla con la esperada

    Crea un directorio diferente para cada uno de los ejercicios

    Mantenga abierto una visualizacion de estas transparencias(disponibles en el aula virtual de PAI)

    Mantener abierto un navegador para consultar referencias externas

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 3 / 47

  • Ficheros

    Cada fichero de Java contiene una clase (cuyo nombre coincide con el delfichero sin su extension) y todas las funciones de la clase.No se separan, por tanto, las cabeceras.

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 4 / 47

  • Ejercicio 1

    Escribe un fichero llamado Pr1.java que contenga unicamente losiguiente:

    c l a s s Pr1 {}

    A continuacion compila con: javac Pr1.java(observaras que se crea el fichero Pr1.class)

    y despues ejecuta el codigo: java Pr1(recuerda que Java es un lenguaje interpretado).

    Que ocurre?

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 5 / 47

  • La funcion main

    La funcion main debe pertenecer a una clase y ser del tipopublic static void main (String args[])

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 6 / 47

  • Ejercicio 2

    Modica el programa anterior para que escriba en la pantalla elmensaje: Mi primer programa en Java.

    Usa para ello la funcion siguiente:System.out.println("texto").

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 7 / 47

  • Compilacion

    El compilador de Java compila todas las clases que necesita el programa

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 8 / 47

  • Ejercicio 3

    Escribe un fichero Pr2.java como este:

    c l a s s Pr2 {p u b l i c s t a t i c void main ( String [ ] args ) {

    Pair p ;System . out . print ( E l par e s ) ;System . out . println (p ) ;

    }}y otro fichero Pair.java en el que se defina la clase Pixel de puntoscaracterizados por su posicion horizontal y vertical.

    p u b l i c c l a s s Pair { i n t first , second ; }Por que falla la compilacion?

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 9 / 47

  • Tipos de datos

    En Java hay dos tipos de datos:

    primitivos (boolean, char, double, float, int y long) y

    objetos pertenecientes a las clases definidas por el programador o alas clases predefinidas (Boolean, Character, Double, Float, Integer,Long y String)

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 10 / 47

  • Inicializacion

    Mientras que los tipos primitivos como int reservan la memoriaautomaticamente y se inicializan a cero, la memoria asignada a losobjetos es siempre dinamica y la inicializacion se hace mediante unconstructor

    Por tanto, todos los objetos deben ser creados utilizando new quedevuelve una referencia al objeto

    A cambio, el borrado de los objetos se hace automaticamentemediante un recolector de basura (garbage collector)

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 11 / 47

  • Ejercicio 4

    Sustituye las las lneas de escritura del programa Pr2 por esta unica:

    System . out . println ( E l par e s + p ) ;

    Porque puede hacerse esto?

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 12 / 47

  • Cadenas

    El lenguaje Java incluye la clase String para tratar cadenas

    Los objetos de tipo String pueden ser concatenados con losoperadores + y += (y se obtiene una nueva cadena)

    Si, usando estos operadores, se anade un objeto a una cadena, Javatransforma el objeto a su representacion como cadena

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 13 / 47

  • Ejercicio 5

    Al ejecutar java Pr2, obtenemos un mensaje del tipoEl par es Pair@80ac046.

    Cual es el signicado de este mensaje?

    Como se puede ver el contenido del par?

    Ayuda: define una funcionpublic String toString() en la clase Pair.

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 14 / 47

  • Imprimir objetos

    Si una clase tiene definida una funcionString toString(),este procedimiento es el que se utiliza cada vez que se requiere larepresentacion como cadena de un objeto de esa clase.

    Observa que las funciones sin argumentos se declaran f() en vez def(void)

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 15 / 47

  • Sobrecarga

    Java no admite sobrecarga de operadores

    Por ejemplo, la comparacion de objetos debe implementarse medianteun procedimiento booleanoo1.equals(o2)

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 16 / 47

  • Ejercicio 6

    Escribe una funcion para comparar dos objetos de tipo Pair

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 17 / 47

  • Valores de tipo logico

    Observa que se escribe boolean y no bool

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 18 / 47

  • Ejercicio 7

    Anade un constructor a la clase Pair del tipo

    p u b l i c Pair ( i n t first , i n t second ) {t h i s . first = first ;t h i s . second = second ;

    }y una funcion swap que intercambie el contenido de dos pares.

    p u b l i c void swap ( Pair q ) {Pair temp = q ;q = t h i s ;t h i s . first = temp . first ;t h i s . second = temp . second ;

    }Escribe un programa Pr3 que intercambie dos pxeles distintos usando elmetodo swapPorque falla el codigo?

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 19 / 47

  • Parametros

    En el caso de los tipos primitivos, la funcion recibe una copia del valordel argumento

    Sin embargo, en el caso de los objetos, se copia el valor de lareferencia

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 20 / 47

  • Ejercicio 8

    Anade a la clase Pair una funcion que intercambie sus componentes:

    p u b l i c void reflex ( ) {i n t z = first ; first = second ; second = z ;

    }y anade en Pr3 las siguientes lneas:

    Pair p , q ;p = new Pair ( 1 , 2) ;q = p ;q . reflex ( ) ;System . out . print (p ) ;

    Explica el resultado que se obtiene

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 21 / 47

  • Referencias

    Aunque en Java no hay punteros, todas las variables (excepto las detipo primitivo) son referencias

    En particular, la creacion de un objeto mediante new devuelve unareferencia al objeto

    Ademas, las llamadas a una funcion pasan el valor de los parametros,esto es, el valor de las referencias

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 22 / 47

  • Ejercicio 9

    Comprueba cual es el resultado de ejecutar este programa cuando en lallamada java Pr4 1 2 3 ... el numero de enteros es uno, dos, tres,. . .

    c l a s s Pr4 {p u b l i c s t a t i c void main ( String args [ ] ) {

    i n t k , size = args . length ;Integer a [ ] = new Integer [ 2 ] ;

    f o r (k = 0 ; k < size ; ++k ) {a [ k ] = new Integer ( args [ k ] ) ;System . out . println ( a [ + k + ]= + a [ k ] ) ;

    }}

    }Observa tambien como puede transformarse una cadena en un numeroentero

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 23 / 47

  • Clases predefinidas

    En Java, es posible evitar el desbordamiento de vectores utilizando clasespredefinidas como ArrayList

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 24 / 47

  • Ejercicio 10

    Corrige el siguiente programa para evitar el error de compilacion:

    import java . util . ArrayList ;c l a s s Pr5 {

    p u b l i c s t a t i c void main ( String args [ ] ) {i n t k , n , size = args . length ;ArrayList a = new ArrayList ( ) ;

    f o r (k = 0 ; k < size ; ++k ) {a . add (new Integer ( args [ k ] ) ) ;n = a . get (k ) ;System . out . println ( a [ + k + ]= + n ) ;

    }}

    }

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 25 / 47

  • Conversiones de tipo

    La transformacion de un objeto Integer al tipo int y viceversa esautomatica desde la version 1.5 de Java

    En versiones anteriores, haca falta extraer el valor entero del Integeraplicando intValue()

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 26 / 47

  • import

    La inclusion de paquetes o bibliotecas de programas se consiguemediante la sentenciaimport

    semejante al include del preprocesador de C

    Por ejemplo, import java.io.*;permite utilizar todas las clases predefinidas para la entrada y salidade datos.

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 27 / 47

  • Lectura de ficheros

    Es posible leer datos almacenados en un fichero usandoBufferedReader reader = new BufferedReader(new

    FileReader(nombre));del paquete java.io.*

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 28 / 47

  • Ejercicio 11

    Corrige el siguiente programa para evitar los errores de compilacion

    import java . io . ;

    c l a s s Pr6 {p u b l i c s t a t i c void main ( String argv [ ] ) {

    String w ;BufferedReader reader =

    new BufferedReader (new FileReader ( argv [ 0 ] ) ) ;whi le ( reader . ready ( ) ) {

    w = reader . readLine ( ) ;System . out . println (w ) ;

    }}

    }

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 29 / 47

  • Excepciones

    Los errores generados durante la ejecucion deben ser tratados mediantebloques

    t r y{/* unsafe operations */}

    catch ( Exception e ){/* reactions */}

    En caso contrario, la funcion debe anadir una clausulathrows Exception

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 30 / 47

  • Ejercicio 12

    Anade los bloques try y catch necesarios en el programa anterior

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 31 / 47

  • Ejercicio 13

    Modifica el siguiente programa para que construya un ArrayList deenteros a partir de una cadena almacenada en el fichero que se pasa comoargumento al programa (utiliza para ello la clase BufferedReader)

    import java . util . ;

    c l a s s Pr8 {p u b l i c s t a t i c void main ( String args [ ] ) {

    String data = 100 200 300 ;String [ ] token = data . split ( \\ s ) ;

    f o r ( i n t k = 0 ; k < token . length ; ++k )System . out . println ( token [ k ] ) ;

    }}

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 32 / 47

  • Herencia

    La herencia en Java es sencilla:class MyArrayList extends ArrayList

    significa que MyArrayList es una ArrayList, esto es, una clasederivada de la superclase ArrayList

    En cambio:class Int implements Serializable

    item indica que la clase Int es una subclase de la clase virtualSerializable

    El constructor de la clase original puede invocarse mediante unallamada asuper();

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 33 / 47

  • Ejercicio 14

    Construye una clase MyArrayList que extienda la clasejava.util.ArrayList con una funcion void write (StringfileName) que escriba su contenido en un fichero.

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 34 / 47

  • Persistencia

    Todos los objetos derivados de la clase virtual Serializable puedenhacerse persistentes mediante funciones de escritura (writeObject) y delectura (readObject)El almacenamiento, por defecto, es binario

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 35 / 47

  • Ejercicio 15

    Escribe una funcion read(String fileName) para MyArrayList.

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 36 / 47

  • Funciones y clases virtuales

    Las funciones y clases virtuales se llaman abstract

    Las funciones y datos que no se pueden sobreescribir en las clasesderivadas se llaman final

    Las funciones y datos comunes a toda la clase son static

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 37 / 47

  • Modificadores

    Los modificadores public y private tienen el mismo significado queen C++

    Si no se especifica ninguno, el acceso se permite solo a los objetos delmismo paquete (aquellos cuyas clases comienzan con una declaracionpackage nombre; identica)

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 38 / 47

  • Ejercicio 16

    Que ocurre si se guardan dos objetos de la clase Pair en un contenedorcomojava.util.TreeSet?

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 39 / 47

  • Guardar objetos

    Para poder guardar objetos en un contenedor, la clase debe implementar lafuncion compareTo

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 40 / 47

  • Ejercicio 17

    Implementa una funcion public int compareTo(Pair p) para la clasePair

    Que ocurre durante la ejecucion?

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 41 / 47

  • Comparable

    Para que un objeto sea comparable, debe indicarse explcitamente:public class Pair implements Comparable

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 42 / 47

  • Ejercicio 18

    Sustituye el TreeSet por un HashSet como sigue:

    java . util . HashSet map =new java . util . HashSet() ;

    map . add (new Pair ( 0 , 0) ) ;map . add (new Pair ( 0 , 0) ) ;System . out . println ( map . size ( ) ) ;

    Que ocurre?

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 43 / 47

  • HashSet

    La clase HashSet almacena el objeto en la posicion dada por suhashCode y compara los objetos almacenados con la funcion equals

    Por ello, una clase comparable como Pair debe implementar: inthashCode(Pair), boolean equals(Object) y intcompareTo(Pair)

    Importante: dos objetos iguales deben tener el mismo hashCode yvalor 0 de compareTo

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 44 / 47

  • Un ejemplo de implementacion

    p u b l i c boolean equals ( Object o ) {i f (o!= n u l l &&

    t h i s . getClass ( ) == o . getClass ( ) ) {Pair p = ( Pair )o ;return first == p . first &&second == p . second ;

    } e l s e {return f a l s e ;

    }}

    p u b l i c i n t hashCode ( ) {return Integer . valueOf ( first ) . hashCode ( ) +

    31 Integer . valueOf ( second ) . hashCode ( ) ;}

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 45 / 47

  • equals

    Notese que el argumento de equals debe ser de la clase Object.Si, en cambio, se escribe una funcion equals(Pair), esta no serautilizada por HashSet, como puede comprobarse incluyendo algun mensajede salida (por ejemplo a System.err) en la funcion de comparacion.

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 46 / 47

  • Algunos ejercicios de continuacion:

    1 Construye una clase Matrix que permita guardar objetos del tipoT con, al menos, funciones get(int i,int j) y put(int i, intj, T t) y que utilice solo una cantidad de memoria proporcional alnumero de objetos almacenados.

    2 Generaliza la clase Pair para que admita pares de objetos decualquier tipo (Pair).

    F. de Sande Aprende a programar en Java en 2 horas: las diferencias esenciales entre C++ y Java20142015 47 / 47

    PresentacinDe C++ a Java en 16 pasosAlgunas caractersticas de las estructuras de datos estndar