p1 intro java2h
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