Está en la página 1de 47

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


20142015
entre C++ y Java
1 / 47

Java

Java es un lenguaje interpretado, orientado a objetos y especialmente


seguro para la programaci
on de servicios en Internet.
Se puede compilar como un c
odigo intermedio (el llamado bytecode)
que se ejecutara en cualquier sistema que disponga de una maquina
virtual 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 a
traves de una serie de ejercicios muy simples que destacan las
diferencias mas importantes entre ambos lenguajes.

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y Java
2 / 47

Los ejercicios estan dise


nados para ser realizados consecutivamente
Solo despu
es de haber programado una respuesta, debes pinchar en
el numero de ejercicio para compararla con la esperada
Crea un directorio diferente para cada uno de los ejercicios
Mantenga abierto una visualizaci
on 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


20142015
entre C++ y Java
3 / 47

Ficheros

Cada fichero de Java contiene una clase (cuyo nombre coincide con el del
fichero 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


20142015
entre C++ y Java
4 / 47

Ejercicio 1

Escribe un fichero llamado Pr1.java que contenga u


nicamente lo
siguiente:
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 c
odigo: 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


20142015
entre C++ y Java
5 / 47

La funcion main

La funcion main debe pertenecer a una clase y ser del tipo


public static void main (String args[])

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y Java
6 / 47

Ejercicio 2

Modica el programa anterior para que escriba en la pantalla el


mensaje: 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


20142015
entre C++ y Java
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


20142015
entre C++ y Java
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 v o i d main ( String [ ] args ) {
Pair p ;
System . out . print ( E l p a r e s ) ;
System . out . println ( p ) ;
}
}

y otro fichero Pair.java en el que se defina la clase Pixel de puntos


caracterizados 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


20142015
entre C++ y Java
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 a
las clases predefinidas (Boolean, Character, Double, Float, Integer,
Long y String)

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 10
Java
/ 47

Inicializacion

Mientras que los tipos primitivos como int reservan la memoria


automaticamente y se inicializan a cero, la memoria asignada a los
objetos es siempre dinamica y la inicializaci
on se hace mediante un
constructor
Por tanto, todos los objetos deben ser creados utilizando new que
devuelve una referencia al objeto
A cambio, el borrado de los objetos se hace automaticamente
mediante un recolector de basura (garbage collector )

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 11
Java
/ 47

Ejercicio 4

Sustituye las las lneas de escritura del programa Pr2 por esta u
nica:
System . out . println ( E l p a r e s + p ) ;

Porque puede hacerse esto?

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 12
Java
/ 47

Cadenas

El lenguaje Java incluye la clase String para tratar cadenas


Los objetos de tipo String pueden ser concatenados con los
operadores + y += (y se obtiene una nueva cadena)
Si, usando estos operadores, se a
nade un objeto a una cadena, Java
transforma el objeto a su representaci
on como cadena

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 13
Java
/ 47

Ejercicio 5

Al ejecutar java Pr2, obtenemos un mensaje del tipo


El par es Pair@80ac046.
Cual es el signicado de este mensaje?
Como se puede ver el contenido del par?
Ayuda: define una funcion
public String toString() en la clase Pair.

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 14
Java
/ 47

Imprimir objetos

Si una clase tiene definida una funci


on
String toString(),
este procedimiento es el que se utiliza cada vez que se requiere la
representacion como cadena de un objeto de esa clase.
Observa que las funciones sin argumentos se declaran f() en vez de
f(void)

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 15
Java
/ 47

Sobrecarga

Java no admite sobrecarga de operadores


Por ejemplo, la comparaci
on de objetos debe implementarse mediante
un procedimiento booleano
o1.equals(o2)

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 16
Java
/ 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


20142015
entre C++ y 17
Java
/ 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


20142015
entre C++ y 18
Java
/ 47

Ejercicio 7
A
nade 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 v o i d swap ( Pair q ) {
Pair temp = q ;
q = this ;
t h i s . first = temp . first ;
t h i s . second = temp . second ;
}

Escribe un programa Pr3 que intercambie dos pxeles distintos usando el


metodo swap
Porque falla el codigo?
F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 19
Java
/ 47

Parametros

En el caso de los tipos primitivos, la funci


on recibe una copia del valor
del argumento
Sin embargo, en el caso de los objetos, se copia el valor de la
referencia

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 20
Java
/ 47

Ejercicio 8
A
nade a la clase Pair una funci
on que intercambie sus componentes:
p u b l i c v o i d reflex ( ) {
i n t z = first ; first = second ; second = z ;
}

y a
nade 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


20142015
entre C++ y 21
Java
/ 47

Referencias

Aunque en Java no hay punteros, todas las variables (excepto las de


tipo primitivo) son referencias
En particular, la creaci
on de un objeto mediante new devuelve una
referencia al objeto
Ademas, las llamadas a una funci
on 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


20142015
entre C++ y 22
Java
/ 47

Ejercicio 9
Comprueba cual es el resultado de ejecutar este programa cuando en la
llamada java Pr4 1 2 3 ... el n
umero de enteros es uno, dos, tres,. . .
c l a s s Pr4 {
p u b l i c s t a t i c v o i d 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 n


umero
entero

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 23
Java
/ 47

Clases predefinidas

En Java, es posible evitar el desbordamiento de vectores utilizando clases


predefinidas como ArrayList

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 24
Java
/ 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 v o i d 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


20142015
entre C++ y 25
Java
/ 47

Conversiones de tipo

La transformacion de un objeto Integer al tipo int y viceversa es


automatica desde la versi
on 1.5 de Java
En versiones anteriores, haca falta extraer el valor entero del Integer
aplicando intValue()

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 26
Java
/ 47

import

La inclusion de paquetes o bibliotecas de programas se consigue


mediante la sentencia
import
semejante al include del preprocesador de C
Por ejemplo, import java.io.*;
permite utilizar todas las clases predefinidas para la entrada y salida
de datos.

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 27
Java
/ 47

Lectura de ficheros

Es posible leer datos almacenados en un fichero usando


BufferedReader reader = new BufferedReader(new
FileReader(nombre));
del paquete java.io.*

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 28
Java
/ 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 v o i d main ( String argv [ ] ) {
String w ;
BufferedReader reader =
new BufferedReader ( new FileReader ( argv [ 0 ] ) ) ;
w h i l e ( reader . ready ( ) ) {
w = reader . readLine ( ) ;
System . out . println ( w ) ;
}
}
}

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 29
Java
/ 47

Excepciones

Los errores generados durante la ejecuci


on deben ser tratados mediante
bloques
try
{ /* unsafe operations */ }
catch ( Exception e )
{ /* reactions */ }

En caso contrario, la funci


on debe a
nadir una clausula
throws Exception

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 30
Java
/ 47

Ejercicio 12

A
nade los bloques try y catch necesarios en el programa anterior

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 31
Java
/ 47

Ejercicio 13
Modifica el siguiente programa para que construya un ArrayList de
enteros a partir de una cadena almacenada en el fichero que se pasa como
argumento 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 v o i d 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


20142015
entre C++ y 32
Java
/ 47

Herencia

La herencia en Java es sencilla:


class MyArrayList extends ArrayList
significa que MyArrayList es una ArrayList, esto es, una clase
derivada de la superclase ArrayList
En cambio:
class Int implements Serializable
item indica que la clase Int es una subclase de la clase virtual
Serializable
El constructor de la clase original puede invocarse mediante una
llamada a
super();

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 33
Java
/ 47

Ejercicio 14

Construye una clase MyArrayList que extienda la clase


java.util.ArrayList con una funcion void write (String
fileName) que escriba su contenido en un fichero.

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 34
Java
/ 47

Persistencia

Todos los objetos derivados de la clase virtual Serializable pueden


hacerse persistentes mediante funciones de escritura (writeObject) y de
lectura (readObject)
El almacenamiento, por defecto, es binario

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 35
Java
/ 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


20142015
entre C++ y 36
Java
/ 47

Funciones y clases virtuales

Las funciones y clases virtuales se llaman abstract


Las funciones y datos que no se pueden sobreescribir en las clases
derivadas 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


20142015
entre C++ y 37
Java
/ 47

Modificadores

Los modificadores public y private tienen el mismo significado que


en C++
Si no se especifica ninguno, el acceso se permite solo a los objetos del
mismo paquete (aquellos cuyas clases comienzan con una declaracion
package nombre; identica)

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 38
Java
/ 47

Ejercicio 16

Que ocurre si se guardan dos objetos de la clase Pair en un contenedor


como
java.util.TreeSet<Pair>?

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 39
Java
/ 47

Guardar objetos

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


funcion compareTo

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 40
Java
/ 47

Ejercicio 17

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


Pair
Que ocurre durante la ejecuci
on?

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 41
Java
/ 47

Comparable

Para que un objeto sea comparable, debe indicarse explcitamente:


public class Pair implements Comparable<Pair>

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 42
Java
/ 47

Ejercicio 18

Sustituye el TreeSet por un HashSet como sigue:


java . util . HashSet<Pair> map =
new java . util . HashSet<Pair >() ;
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


20142015
entre C++ y 43
Java
/ 47

HashSet

La clase HashSet almacena el objeto en la posicion dada por su


hashCode y compara los objetos almacenados con la funcion equals
Por ello, una clase comparable como Pair debe implementar: int
hashCode(Pair), boolean equals(Object) y int
compareTo(Pair)
Importante: dos objetos iguales deben tener el mismo hashCode y
valor 0 de compareTo

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 44
Java
/ 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 ;
r e t u r n first == p . first &&
second == p . second ;
} else {
return f a l s e ;
}
}
p u b l i c i n t hashCode ( ) {
r e t u r n Integer . valueOf ( first ) . hashCode ( ) +
31 Integer . valueOf ( second ) . hashCode ( ) ;
}

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 45
Java
/ 47

equals

N
otese que el argumento de equals debe ser de la clase Object.
Si, en cambio, se escribe una funci
on equals(Pair<Type>), esta no sera
utilizada por HashSet, como puede comprobarse incluyendo alg
un mensaje
de salida (por ejemplo a System.err) en la funci
on de comparacion.

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 46
Java
/ 47

Algunos ejercicios de continuacion:

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

Generaliza la clase Pair para que admita pares de objetos de


cualquier tipo (Pair<Type>).

F. de Sande

Aprende a programar en Java en 2 horas: las diferencias esenciales


20142015
entre C++ y 47
Java
/ 47

También podría gustarte