Introducción a Java: Programación POO
Introducción a Java: Programación POO
Fascículo TP
Programación Orientada a Objetos
(Lenguaje Java)
` ann´ee SEIoT/IRS
Para los estudiantes de 2eme
AymenFerjani
[Link]@[Link]
TP5: Impl´
implementación de interfaces y gestión de excepciones 18
Fascículo TP Departamento de Informática
et T´el´ecoms
Programación Orientada a ObjetosNivel: 2eme
`
SEIoT/IRS
1 Notas de clase
1.1 Compilación y ejecución de un programa Java
Antes de comenzar a escribir código Java, es necesario instalar un JDK (Java Development Kit)
kit de desarrollo) para poder compilar y ejecutar nuestro código.
La escritura de un código fuente Java debe hacerse en un archivo con la extensión .java.
la compilación de este último generará otro archivo con la extensión .classet que contiene
pseudo-código. Es este archivo que es interpretado y ejecutado por la máquina virtual de Java (JVM).
La JVM es una parte integral del JDK.
La compilación y la ejecución de un archivo Java se pueden hacer de dos maneras diferentes,
ya sea con un IDE (Entorno de Desarrollo Integrado), o bien con una consola.
Un archivo fuente de Java contiene una o varias clases, pero solo una clase declarada.
publique. El nombre del archivo debe corresponder al nombre de esta clase.
— Si el proyecto desarrollado está compuesto por un solo archivo, entonces este último debe contener
la método principal/main.
— En programación procedural, los métodos son vistos como funciones.
— El método principal siempre debe tener la siguiente firma:
Tipo Significación
carácter Carácter
booleano Bool'een
Observación
— También existen los tipos byte, short y long que son tipos enteros.
— También se encuentra el tipo float que representa un número real.
int[]tab={20,-9,13,100,5};
// recorre y muestra cada elemento del arreglo tab
por(intx: tab) {
[Link](x);
}
2 Ejercicios prácticos
Para cada ejercicio, se creará un nuevo proyecto.
Ejercicio 1
Crear la clase Hello con el siguiente código, luego probarla:
Ejercicio 2
Crear la clase Ex2, luego:
´
1. Escribir el método público int adición(int x, int y, int z) que devuelve la suma de 3
entiersx,yetz.
2. Añadir el método público int max(int x, int y, int z) que retorna el máximo entre
3 enteros x, y, z.
3. Añadir el método público booleano primo(int x) que verifica si x es un número primo.
primer o no.
4. Probar estos 3 métodos de la siguiente manera:
importar [Link];
public class Ex2{
//Definiciones de los métodos de las preguntas 1, 2 y 3
...
public static void main(String[] args) {
Scanner saisie = new Scanner([Link]);
inta, b, c;
[Link]("Donar 3 enteros: ");
a=[Link]();
b=[Link]();
c=[Link]();
Ex2 obj=nuevoEx2();//Creación duna instancia de la clase Ex2
[Link](a+"+"+b+"+"+c+"="+[Link](a, b, c));
[Link]("El máximo de los 3 enteros es " + [Link](a, b, c));
si([Link](a)) {
[Link](a + " es un número primo");
}
else{
[Link](a + " nno es un número primo);
}
}
}
Ejercicio 3
Éscribir un programa que calcule y muestre la suma y el producto de 4 enteros pasados en
argumentos.
Para cada argumento, usar el método predefinido [Link](x) para obtener un
a partir de este argumento.
Ejercicio 4
´
Escribir un programa que permita leer un entero positivo introducido en la línea de comandos
y de mostrarlo en forma binaria.
Objetivos
— Introducción de valores.
1 Notas de curso
1.1 Creación y manipulación de un arreglo de tamaño fijo
La creación de un array de tamaño fijo se realiza mediante la siguiente instrucción:
tipo[]nomTabla=newtipo[NumeroElementos];
Aquí, 'tipo' designa un tipo base o bien una clase. Aquí hay un ejemplo:
1.2 Ejemplo
// Creación e inicialización de un arreglo de 4 reales
double[]tab={12.0,2.6,0.5,100.11};
2 Ejercicios prácticos
Ejercicio 1
Éscribir la clase Año con un método que permita determinar si un año es bisiesto
Una año es bisiesto si se tiene uno de los dos siguientes casos:
El año es divisible por 4 y no divisible por 100.
— El año es divisible por 400.
Ejercicio 2
Éscribir la clase DíaSemana con un método que, a partir de un entero que representa un
día de la semana (entre 1 y 7), muestra el nombre correspondiente de este día.
Ejemplos:
jour = 1 =>Affichage : ”C’est lundi”
jour = 2 =>Affichage : ”C’est mardi”
Ejercicio 3
Éscribir un programa que permita leer 2 argumentos que son un entero positivo (denotado como n) y
una cadena de caracteres, luego muestra esta cadena n veces (en líneas diferentes).
Por ejemplo, si el usuario pasa como argumentos "5" y "Hola", tendremos la visualización que sigue.
vant
Hola1vez
Bonjour2fois
Bonjour3fois
Bonjour4veces
Bonjour5fois
Ejercicio 4
Éscribir la clase Perfecta con un método que toma un entero positivo y indica si este último
es un número perfecto o no. Un número perfecto es igual a la suma de sus divisores propios.
(salvo él mismo).
Ejemplos de nombres perfectos:
6=1+2+3
28 = 1 + 2 + 4 + 7 + 14
496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
Ejercicio 5
Éscribe un programa que calcule y muestre la suma de los enteros pasados como argumento.
Ejercicio 6
Éscribir la clase Par que tenga 2 métodos. El primero permite llenar un arreglo de enteros.
El segundo muestra los elementos pares de un arreglo de enteros.
importar [Link];
clase pública Par{
public void rellenarTab(int[] t)
{/* llenar t con enteros introducidos */}
public void affichagePar(int[] t)
{/* mostrar los elementos pares de t */}
Ejercicio 7
Éscribir la clase Tabayant 3 métodos. El primero permite crear un array de enteros de
talla (`a saisir) y llenarlo. El segundo muestra los elementos de un arreglo de enteros. La
devuelve el elemento más grande de un arreglo de enteros.
importar [Link];
clase pública Tab {
public static int[] creaciónTabla() {
/* [Link] el tamaño del arreglo, creación del arreglo
2. llenar la tabla a partir de enteros ingresados
[Link] esta tabla */}
Ejercicio 8
Éscribir un programa que cree y rellene un array de reales a partir de los argumentos, luego
invierte esta tabla y muestra sus elementos.
Ejercicio 9
Éscribir un programa que capture y complete un arreglo de cadenas de caracteres, luego capture
una cadena e indica si esta cadena se encuentra en el arreglo. En el caso de que la cadena exista,
el programa también deberá mostrar su posición en la tabla.
Nota: Utiliza el método [Link](cadena) para comparar entre dos cadenas.
Ejemplos:
bonjour
[Link](ch2)// devuelve true
[Link](ch3)// devuelve falso
Ejercicio 10
Éscribir un programa que permita ingresar y llenar los elementos de un arreglo.
de enteros, luego realiza el ordenamiento por selección en orden ascendente en este arreglo, y finalmente muestra
el cuadro.
Príncipe :
Para cada elemento tab[i], determinar el índice del menor elemento a la derecha de tab[i]
(más pequeño que tab[i]), luego permutar tab[i] y tab[min]. Si no se encuentra un elemento más
si pequeño quetab[i], entonces ninguna permutación se lleva a cabo.
Objetivos
1 Ejercicios prácticos
Ejercicio 1
Se desea modelar un punto en un plano con un sistema de coordenadas ortonormado.
´
1. Escribir la clase Punto que contenga los atributos necesarios así como un constructor que acepte
des parámetros.
2. Agregar otro constructor sin parámetros que inicialice un punto en la posición (0,0).
3. Para cada atributo, agregar un método accesor (get) para devolver el valor de
el atributo, y un método mutador (set) para modificar el valor del atributo.
4. Añadir el método público void modificarCoord(double x, double y) que
permite modificar las coordenadas de un punto.
´
5. Escribir el método público booleano mismaPosición(Point p) que verifica si un punto tiene las
mes coordenadas que el punto p.
´
6. Escribir el método público booleano esSimétrico(Point p) que verifica si un punto es
simétrico al punto p respecto al origen del sistema de referencia (0,0).
7. Añadir el método público double distance(Point p) que permite calcular y
retornar la distancia entre un punto y el punto p según la siguiente fórmula:
(x−xp )2+ (y−yp )2
p
Utilizar los métodos predefinidos [Link](x, 2) para calcular el cuadrado de un x y [Link](x)
para la raíz cuadrada de un x.
8. En el mismo paquete, crear la clase TestPoint que contenga el método main para
probar los métodos de la clase Punto:
clase pública TestPoint
{
public static void main(String[] args)
{
Punto p1=nuevoPunto(5,3);
Punto p2=newPoint();
[Link]("p1("+[Link]()+","+[Link]()+")");
[Link]("p2("+[Link]()+","+[Link]()+")");
[Link](5,10);
[Link]("p2("+[Link]()+","+[Link]()+")");
si()
[Link]("p1 y p2 n"no tienen la misma posición);
Punto p3=nuevoPunto(-5,-3);
[Link]("p3("+[Link]()+","+[Link]()+")");
si([Link]étrico(p3))
[Link]("p1 y p3 son simétricos");
[Link]("La distancia entre p1 y p2 es " + [Link](p2));
}
}
Ejercicio 2
Se desea modelar una fecha caracterizada por un día, un mes y un año.
´
1. Escribir la clase Fecha con los atributos necesarios así como un constructor que
inicializa una fecha.
2. Para cada atributo, agregar un método accesador (get) para devolver el valor de
el atributo y un método mutador (set) para modificar el valor del atributo.
3. Redefinir la método public String toString() que retorna una fecha en la forma:
día/mes/año
4. Añadir el método privado booleano annéeBissextile() que verifique si el año de una fecha
¿Es año bisiesto o no? Un año es bisiesto en los siguientes casos:
— Ella es divisible por 4 y no por 100.
— Es divisible por 400.
5. Añadir el método privado int nombreJoursDuMois() que devuelve el número de días
del mes (ejemplo: mes = 1⇒número de días = 31). Usar el método anterior.
´
6. Escribir el método público booleano estValide() que permite verificar si una fecha es válida.
correcto o no. Usar el método anterior.
7. Añadir el método público booleano másReciente(Date d) que indica si una fecha es
más reciente que la fecha de.
8. En el mismo paquete, crear la clase TestDate que contenga el método main para probar
los métodos de la clase Date:
clase pública TestDate
{
public static void main(String[] args)
{
Fecha d1=nuevaFecha(28,2,2018);
si([Link]())
[Link](d1 + " es válido");
Fecha d2=newFecha(30,2,2017);
si(![Link]())
[Link](d2+" nno es válido);
Fecha d3=newDate(17,10,2020);
si([Link](d1))
[Link](d3 + " es más reciente que " + d1);
}
}
Ejercicio 3
Se desea modelar una pila de enteros almacenada en forma de un arreglo.
1. Definir la clase Pileayant como atributos un entero taille (la taille de la pile), un
otro entero denominado tailleMax (la tamaño máximo de la pila, una constante) y un array
de enteros nombrem.
2. Añadir un constructor, que tome un parámetro entero llamado, que inicialice tamaño a cero
tamañoMax`an, luego crea el array con el tamaño tamañoMax.
3. Añadir el método de acceso público int getTaille() que permite devolver el tamaño de
la pila.
´
4. Escribir el método público booleano estVide() que indica si la pila está vacía o no.
5. Agregar el método público booleano estPleine() que indica si la pila está llena o no.
6. Agregar el método public void a fficher() que muestra los elementos de la pila.
´
7. Escribir el método público void empilar(int x) que añade x al final de la pila e incrementa
retire 1 si la pila no está llena. Mostrar un mensaje si la pila ya está llena.
´
8. Escribir el método público void depilar() que depile el último elemento (basta con
decrementar la talla de 1) si la pila no está vacía. Mostrar un mensaje si la pila ya está
vide.
9. En el mismo paquete, definir la clase TestPile con el método main y probar los
métodos de la clase Pila.
Ejercicio 4
Se desea modelar una lista enlazada compuesta por varios nodos donde cada nodo
contiene un entero.
´
1. Escribir la claseNoeud teniendo como atributos un entero y una referencia sobre el nodo
siguiente nombrado siguiente(tipoNoeud).
2. Agregar un constructor a la clase Nodo, que tome un parámetro entero, que inicialice val
a la valeur del parámetro. La referencia siguiente apuntará a nulo.
3. Añadir métodos accesores y mutadores a la clase Nodo que permiten recuperar
y modificar los atributos de esta clase.
4. Agregar, en el mismo paquete, la clase Lista con como atributos una referencia sobre la
Cabeza de lista llamada etete(tipoNoeud) y un entero taille que es el tamaño de esta lista.
5. Agregar un constructor a la clase Lista, sin parámetro, que inicialice la referencia cabecera
.orecaèlliattellunà
6. Agregar métodos accesores y mutadores a la clase Lista que permitan recuperar la
cabeza y la talla y de modificar únicamente la cabeza.
7. Añadir el método público booleano estáVacio() que indica si la lista está vacía o no.
8. Añadir el método público void mostrar() que recorre la lista y muestra los valores de
sus nodos.
9. Añadir el método público void agregarEntero(int val) que añade un nodo, que tiene el
valor entero, al final de la lista e incrementado en 1.
10. Escribir ´ el método público void eliminarEntero(int val) que elimina el primer nodo
rencontré depuis la tête ayant la valeur val, et décrémenté à l'aide de 1 si ce nœud a été
encontrado.
11. En el mismo paquete, agregar la clase TestListe que contiene el método main con el
código siguiente:
Liste lst=newListe();
[Link](15);
[Link](-9);
[Link](5);
[Link](-26);
[Link](42);
[Link]();
[Link]("Supresión de -26 luego 15:");
[Link](-26);
[Link](15);
[Link]();
[Link]("Añadiendo 103:");
[Link](103);
[Link]();
[Link]("La lista contiene " + [Link]() + " nodos");
— Utilización de la herencia.
— Comprender el polimorfismo.
Comprender la utilidad de una clase abstracta.
— Creación y uso de una tabla dinámica.
Hay que tener en cuenta que esta clase no permite crear arreglos de tipos primitivos.
Para remediar esta falta, se pueden usar las clases envolventes.
Método Rol
agregar(Objecte) Agrega el objeto al final de la tabla.
1.4 Ejemplo
// Importar la clase ArrayList al principio del archivo, justo después del paquete
importar [Link];
...
ArrayList<String>tab=new ArrayList<>();
[Link]("Hola");
[Link]("Hola");
[Link](0,"Coucou");// añade al inicio del array
Adiós
[Link]("Gracias");
2 Ejercicios prácticos
Ejercicio 1
Una empresa desea gestionar la lista de sus empleados con una aplicación Java. Hay
principalmente dos tipos de empleados: los ejecutivos y los trabajadores.
1. Sabiendo que un empleado se describe por su matrícula, su nombre, su edad y su salario, definir
la clase Empleado que tiene un constructor con parámetros que inicializa todos sus atributos.
2. Añadir un atributo entero estático número inicializado a 0 y que será incrementado en 1
cada vez que se crea un empleado.
3. Agregar los métodos getEdad, getSalario y setSalario, así como el método estático
obtenerNombre
4. Redefinir el método public toString que retorna la información de un empleado según
esta forma:
matrícula
E10268 Ahmed SASSI, 34 años, 1200 dt
5. Definir, en el mismo paquete, la clase Ouvrier sabiendo que un obrero tiene los mismos
propiedades de un empleado. Agregar un constructor con parámetros que inicializa los valores
de atributos.
6. Definir, en el mismo paquete, la clase Cadre sabiendo que, además de las propiedades de un
empleado, cada directivo tiene una función. Agregar un constructor con parámetros que
inicializar los valores de los atributos.
7. Redefinir el método toString en la clase Ouvrier añadiendo la palabra "Ouvrier" a la
fin de la chaîne retournée. Exemple:
E10270 Mounir DRIDI, 36 años, 900 dt, Obrero
9. La empresa ha decidido aumentar los salarios de sus empleados según esta fórmula:
— Para los trabajadores, un aumento de 100 dt.
— Para los marcos:
— Un aumento de 200 dt si la edad es inferior a 35 años.
— Un aumento de 300 dt si la edad está entre 35 años y 45 años.
— Un aumento de 400 dt para los demás.
Declarar el método abstracto público aumentar en la clase Empleado. Así, la
La clase Empleado se convertirá en abstracta, y el método aumentar deberá estar definido en
las clases Ouvrier y Cadre.
10. Con el fin de probar estas clases y sus métodos, crear, en el mismo paquete, la clase
TestEmpleado teniendo el método main con el siguiente código:
Empleá[]lista=newEmpleá[5];
liste[0] =newCadre("E10268","Ahmed SASSI",34,1200,"Analyste");
liste[1] =newCadre("E10269","Ridha DRIDI",46,1350,"Comptable");
liste[2] = newOuvrier("E10270", "Mounir DRIDI", 36, 900);
newOuvrier("E10271","Alia ARBI",29,850);
liste[4] =newCadre("E10272","Amal TOUATI",38,1850,"Directeur RH");
Ejercicio 2
Se quiere modelar los conceptos vehículo, coche y avión.
1. Definir la clase Vehículo que tiene como atributos información válida para todo tipo
de vehículo: su modelo, su año de compra, su precio de compra y su precio actual.
2. Agregar un constructor con 3 parámetros (modelo, año de compra y precio de compra) que
inicializa todos estos atributos. El precio actual se fijará al precio de compra.
3. Redefinir el método toString que retorna la información de un vehículo según la forma
siguiente:
modelo
Peugeot 206, 2005, 16000 dt, 12000 dt
6. Definir, en el mismo paquete, la clase Avion que también hereda de Vehiculo y que tiene
los atributos adicionales siguientes:
nombre de pasajeros
horas de vuelo
Añadir un constructor con parámetros que inicialice todos los atributos. Aquí también, el
el precio corriente se fijará al precio de compra.
7. Redefinir el método toString en la clase Coche añadiendo la información correspondiente
a la voiturea la fin de la chaîne retournée. Exemple:
PEUGEOT206
11. Con el fin de probar estas clases y sus métodos, crear, en el mismo paquete, la clase
Prueba de vehículo con el método main con el siguiente código:
ArrayList<Vehículo>tab=new ArrayList<>();
[Link](newVoiture("PEUGEOT 206",2005,20000,4,5,200000));
[Link](newVoiture("SUZUKI SWIFT",2016,30000,4,4,38000));
[Link](newVoiture("FIAT 500",2010,20000,4,4,150000));
agregar(nuevoAvión("CESSNA CITATION II", 1982, 4000000, 9, 15300));
[Link](nuevoAvion("DAHER-SOCATA TBM 700",2001,3500000,5,18000));
1 Ejercicio práctico
Queremos implementar el siguiente diagrama de clases:
(pReele + pImaginaire*i)
(5.2 + 3.6*i)
Reel r1=newReel(9.0);
Reel r2=newReel(-2.1);
intenta{
[Link]("La raíz cuadrada de " + r1 + " es " + [Link]());
}
catch(Exception e) {
[Link]([Link]());
}
intentar{