Programación

1º DAM/DAW - Curso 2024-2025

User Tools

Site Tools


apuntes:objetos

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
apuntes:objetos [2023/06/04 11:36] – [Ejemplos] Santiago Faciapuntes:objetos [2023/06/04 21:03] (current) – [Ejercicios] Santiago Faci
Line 206: Line 206:
     }     }
 } }
 +</code>
 +
 +===== Cómo trabajar con objetos =====
 +
 +
 +
 +==== Cómo se almacena un objeto en memoria ==== 
 +
 +<figure>
 +{{ reference.png }}
 +<caption>Variable primitiva / Objeto / Referencia a null</caption></figure>
 +
 +<code java>
 +// Variable tipo primitivo
 +int x = 10;
 +</code>
 +
 +<code java>
 +// Objeto declarado (e instanciado)
 +Vehiculo vehiculo = new Vehiculo();
 +</code>
 +
 +<code java>
 +// Objeto declarado (referencia a null)
 +Vehiculo vehiculo;
 +</code>
 +
 +==== Paso por valor / referencia =====
 +
 +<code java>
 +public void cambiar(int x) {
 +  x = 10; 
 +}
 +int y = 20; 
 +cambiar(y); 
 +¿¿y??
 +</code>
 +
 +<code java>
 +public void cambiar(Vehiculo vehiculo) {
 +  vehiculo.marca = 'Ferrari'; 
 +}
 +
 +Vehiculo vehiculo = new Vehiculo('Opel', 'Corsa'); 
 +cambiar(vehiculo);
 +¿¿vehiculo.marca??
 +</code>
 +
 +==== Referencias a null / NullPointerException ====
 +
 +Es uno de los fallos más habituales.
 +
 +Cuando una variable no está haciendo referencia a ningún objeto no puede accederse a ningún atributo o método de la misma puesto que no está haciendo referencia a ninguna zona de memoria.
 +
 +<code java>
 +Vehiculo vehiculo;
 +vehiculo.pintar('rojo'); // NullPointerException
 +</code>
 +
 +<code>
 +Vehiculo vehiculo = new Vehiculo();
 +...
 +vehiculo = null;
 +vehiculo.pintar('verde'); 
 +// NullPointerException
 </code> </code>
  
Line 623: Line 688:
 } }
 </code> </code>
 +
 +=== Limitaciones y características de la herencia en java ===
  
 En cualquier caso, existen una serie de limitaciones o características a tener en cuenta en cuanto al uso de la herencia en Java: En cualquier caso, existen una serie de limitaciones o características a tener en cuenta en cuanto al uso de la herencia en Java:
  
-  * Una clase sólo puede heredar de una clase +  * Para heredar de una clase se utiliza la palabra reservada ''extends'' 
-  * No hay límite en el número de clases que pueden derivar de otra+  * La clase que hereda se conoce como clase heredada o clase hija. La clase de la que se hereda se conoce como clase base o clase padre. 
 +  * Cuando una clase A hereda de una clase B, la clase A adquiere todos los atributos y comportamiento (atributos y métodos) de la clase B (aunque quizás no pueda acceder a algunos de ellos por los modificadores de accesibilidad) 
 +  * En Java, sólo se puede heredar de una clase (sin contar la clase ''Object'' de la que heredan todas las clases de forma implícita). En Java se idearon las interfaces para suplir en parte esta carencia. 
 +  * No hay límite en cuanto al número de clases que pueden heredar de una clase determinada 
 +  * No hay límite en cuanto al nivel de profundidad en el árbol de herencias entre clases
   * No se puede heredar de una clase si ésta ha sido definida como ''final'' (lo que se conoce como una clase final)   * No se puede heredar de una clase si ésta ha sido definida como ''final'' (lo que se conoce como una clase final)
-  * Cuando se hereda de una clase, se hereda todo el código de ella, aunque los modificadores de visibilidad no permitan acceder a algunos atributos o métodos de la clase base directamente +  * Cuando una clase ''Coche'' hereda de una clase ''Vehiculo''un objeto de clase ''Coche'' se puede considerar ahora de tipo Vehículo pero no al revés. 
 +  * Cuando una clase hereda de otra está obligada a implementar constructores apropiados para invocar a los de la clase base
 ===== super ===== ===== super =====
  
Line 636: Line 707:
  
 También puede emplearse para sobrescribir cualquier método en una clase derivada o bien para utilizar el valor de cualquier atributo que haya sido declarado en la clase base. También puede emplearse para sobrescribir cualquier método en una clase derivada o bien para utilizar el valor de cualquier atributo que haya sido declarado en la clase base.
 +
  
 ===== Clases abstractas ===== ===== Clases abstractas =====
Line 850: Line 922:
  
         // Si hay que acceder a atributos/métodos específicos         // Si hay que acceder a atributos/métodos específicos
-        if (vehiculoMotor instanceof Moto) { +        if (vehiculoMotor instanceof Moto moto) {
-            Moto moto = (Moto) vehiculoMotor;+
             // Se puede acceder a la implementación específica del objeto             // Se puede acceder a la implementación específica del objeto
 +            moto . . .
         }         }
-        else if (vehiculoMotor instanceof Lancha) { +        else if (vehiculoMotor instanceof Lancha lancha) {
-            Lancha lancha = (Lancha) vehiculoMotor;+
             // Se puede acceder a la implementación específica del objeto             // Se puede acceder a la implementación específica del objeto
 +            lancha . . .
         }         }
         . . .         . . .
Line 948: Line 1020:
 ====== Ejercicios ====== ====== Ejercicios ======
  
-  - Implementa una clase Java que permita definir la estructura para un eletrodoméstico. Elige hasta 5 atributos de diferentes tipos e implementa los atributos, al menos un constructor, getters y setters y algún método de utilidad para dicha clase. +{{ ejercicio.png}} 
-  - Implementa una clase CuentaBancaria para definir una clase que será usada para la nueva web de una entidad bancaria.+ 
 +  - Desarrolla una clase **CuentaBancaria**, que posea los siguientes atributos y métodos: 
 +    - Saldo 
 +    - Número de cuenta 
 +    - Interés 
 +    - Titular 
 +    - Entidad 
 +    - Ingresar: Permitirá ingresar una cantidad de dinero en la cuenta 
 +    - Ingresar: Permitirá ingresar una cantidad de dinero en la cuenta siempre y cuando el saldo de la misma esté por debajo de una cantidad que se pasará como parámetro 
 +    - Implementa algún constructor 
 +    - Implementa los getters y setters necesarios 
 +    - Añade una clase principal desde la que puedas crear objetos y mostrar la información de los mismos. 
 +    - Invoca también a alguno de los métodos que realizan cambios sobre el estado del objeto para visualizar dichos cambios. 
 +  - Implementa una clase Java que permita definir la estructura para un **eletrodoméstico**. Elige hasta 5 atributos de diferentes tipos e implementa los atributos, al menos un constructor, getters y setters y algún método de utilidad para dicha clase. 
 +  - Implementa una clase **CuentaBancaria** para definir una clase que será usada para la nueva web de una entidad bancaria.
     - Tendrá que tener los siguientes atributos: Número de cuenta, titular, saldo, interes.     - Tendrá que tener los siguientes atributos: Número de cuenta, titular, saldo, interes.
     - El número de cuenta no se podrá modificar     - El número de cuenta no se podrá modificar
     - Debe ser posible realizar las operaciones de ingresar, retirar dinero y otra operación para calcular los intereses generados en un mes determinado     - Debe ser posible realizar las operaciones de ingresar, retirar dinero y otra operación para calcular los intereses generados en un mes determinado
-  - Implementa una clase Trabajador para definir a los trabajadores de una nueva aplicación que quiere desarrollar una empresa para gestionar a su plantilla:+  - Implementa una clase **Trabajador** para definir a los trabajadores de una nueva aplicación que quiere desarrollar una empresa para gestionar a su plantilla:
     - De cada trabajador se almacenará el nombre, apellidos, dni, email, fecha de nacimiento, salario     - De cada trabajador se almacenará el nombre, apellidos, dni, email, fecha de nacimiento, salario
     - Se tiene que poder crear un trabajador inicializando todos los atributos y también indicando sólo nombre y apellidos, ya que habitualmente habrá quién visite la empresa días determinados y necesite una acreditación temporal      - Se tiene que poder crear un trabajador inicializando todos los atributos y también indicando sólo nombre y apellidos, ya que habitualmente habrá quién visite la empresa días determinados y necesite una acreditación temporal 
     - Hay que tener en cuenta que nombre, apellidos y dni nunca se podrán modificar     - Hay que tener en cuenta que nombre, apellidos y dni nunca se podrán modificar
     - Realizar las operaciones necesarias para poder incrementar el salario de un trabajador incrementándolo en una cantidad determinada y también indicando el tanto por ciento de subida que se le aplicará     - Realizar las operaciones necesarias para poder incrementar el salario de un trabajador incrementándolo en una cantidad determinada y también indicando el tanto por ciento de subida que se le aplicará
 +  - Se quieren diseñar ahora las clases para un videojuego de estrategia al estilo **Civilization**. En él los usuarios podrán crear sus propios personajes y construir una ciudad que irá evolucionando para ganar a las de los demás jugadores. De cada jugador se quiere almacenar su nick, nombre, apellidos, email y tiempo de juego (en segundos). De cada personaje se quiere almacenar su nombre, la época a la que pertenece, el nivel y el dinero conseguido hasta el momento. Hay queUna operación que permita añadir kilometros al coche tener en cuenta que cada usuario puede tener un personaje y debe quedar registrado cuál es. Como cada personaje puede crear una ciudad (y debe quedar asi registrado) se guardará, de cada una, el nombre, el nivel, número de habitantes y el tipo de ciudad (aldea, pueblo o ciudad). 
 +    - Se espera que los **jugadores** puedan realizar las siguientes operaciones:
 +      - Una operación para añadir tiempo de juego (Se ejecutará cada vez que termine una partida para incrementar el tiempo empleado)
 +    - De los **personajes** se espera que puedan realizar las siguientes operacones:
 +      - Una operación que permita crear una ciudad indicando el nombre de ésta. El nivel y número de habitantes inicial será 0, y el tipo de ciudad será aldea. La ciudad deberá de quedar vinculada al personaje.
 +    - Para las **ciudades** se necesitarán las siguientes operaciones
 +      - Una operación que permita incrementar el nivel de la ciudad. En esta operación habrá que tener en cuenta que cuando el nivel supere el valor 10 la
 +    - Para **todos los casos**, implementar las clases, atributos, constructores necesarios y las operaciones solicitadas
 +  - El propietario de un **taller** te ha encargado que desarrolles una aplicación para la gestión de su trabajo. Te encuentras en el paso en que debes diseñar e implementar las clases necesarias para desarrollar dicha aplicación. En el taller arreglan Coches y Motos y trabajan varios mecánicos. De los coches quieren almacenar el número de bastidor, la matrı́cula, modelo, color, kilometraje y la capacidad del maletero. De las motos quieren guardar también número de bastidor, matrı́cula, modelo, color y kilometraje, y además quieren saber si una moto tiene o no carenado y el peso de la misma. En ambos casos, para motos y coches se querrá almacenar si están o no reparados. Además, de los mecánicos quieren almacenar el nombre, apellidos, email, especialidad (Coche o Moto) y el número de reparaciones que han hecho desde que trabajan alli. Además, siempre se guardará el vehı́culo en el que está trabajando cada mecánico. 
 +    - En cuanto a las operaciones de los **coches**, se esperan las siguientes:
 +      - Una operación que permita añadir kilometros al coche
 +      - Una operación para pintar el coche de otro color
 +    - De las **motos** se necesitarán estas operaciones:
 +      - Una operación para eliminar el carenado de la moto (hay que tener en cuenta que el peso disminuirá en 2 kg)
 +      - Una operación para pintar la moto de otro color
 +    - Para el caso de los **mecánicos**, las operaciones serán las siguientes
 +      - Una operación que permita reparar cualquier vehı́culo, que marcará el vehı́culo como reparado
 +      - Una operación que permita marcar que un vehı́culo entra al taller, marcándolo como sin reparar, para que quede constancia que hay que trabajar en él
 +      - De alguna forma tendremos que poder asignar un vehı́culo al mecánico, de forma que cuando éste lo repare deje de estarlo 
 +    - Implementar las clases necesarias con sus atributos, los constructores, getters y setters, y las operaciones indicadas
 +  - Ahora te piden diseñar el sistema de clases para una **biblioteca**. Sólo se necesita almacenar la información relativa a **Socios**, **Libros** y **CDs de música**.
 +    - Puede haber varios **tipos de libros (novelas y tebeos) o cds**. De todos ellos se quiere almacenar el isbn, titulo, autor y el año de edición. Es posible que en el momento de dar de alta cualquier elemento no se disponga de la información del autor (habrá que tenerlo en cuenta).
 +    - De las **novelas** además se guardará un resumen del argumento de unas 100 palabras y, en ocasiones, el número de páginas
 +    - De los **cds de música** se querrá almacenar también el número de canciones y la discográfica que lo comercializó.
 +    - De los **tebeos** se quiere guardar un resumen y el personaje principal.
 +    - De los socios guardaremos el número de socio, nombre, apellidos y un email. No siempre se podrá disponer del email por lo que será un dato opcional. Además se quiere guardar en todo momento que libro ha pedido prestado cada usuario, teniendo en cuenta que sólo puede coger un libro al mismo tiempo.
 +    - Hay que tener en cuenta que también existe un tipo especial de **socio (VIP)** que podrá alquilar libros durante más tiempo previo pago con tarjeta de crédito, por lo que guardaremos el número de la misma.
 +    - Se te piden realizar lo siguiente:
 +      - Implementar las clases necesarias para la aplicación
 +      - Implementar los constructores que permitan trabajar con las clases de la forma que se indica
 +      - Implementar operaciones para que los socios puedan alquilar y devolver. Habrá que controlar que no puedan alquilar nada si todavı́a no han devuelto lo que tenı́an alquilado. También hay que tener en cuenta que sólo permitimos el alquiler de cds de música si el socio ha facilitado su dirección de correo electrónico
 +  - Te piden diseñar las clases que permitirán definir el modelo de datos para una aplicación que permita gestionar toda la información de **Parque Zoológico**. Hay que tener en cuenta que puede haber cualquier tipo de animal pero que todos, al fin y al cabo, necesitan los mismos cuidado y tienen el mismo comportamiento, aunque a su manera, que se quiere monitorizar para velar por su bienestar:
 +    - En cuanto a los cuidados, tiene que ser posible: limpiarlos, darles de comer, cambiarlos de estancia y curar cualquier enfermedad que puedan tener
 +    - En cuanto a su comportamiento, todo ellos: comerán, dormirán, se moverán, volarán (los que puedan), pondrán huevos o darán a luz nuevas crías de alguna forma, . . . .
 +    - Debes diseñar, además, el modelo de clases pensando que en cualquier momento puede ser incorporado al Zoo animales de nuevas razas. Intenta definir dicho modelo permitiendo que sea fácil adaptable a esta nueva situación.
 +    - Define:
 +      - Una cuantas clases para una variedad de animales
 +      - Constructores
 +      - Gettes y Setters necesarios
 +      - Una clase principal donde probar el funcionamiento de todo el modelo diseñado
 +  - La cadena de **supermercados CodeAndCokeMarket** te ha contratado para que desarrolles la aplicación que necesitan para gestionar al personal, sus locales y las ventas.
 +    - Hay que tener en cuenta que, en cada **local**, hay un **encargado**, unos cuantos **reponedores** y personal que trabaja en la línea de cajas. Puesto que a veces hay picos de trabajo, a pesar de que existan definidos esos tres perfiles 3 perfiles, todos deben estar preparados para desempeñar cualquier de las funciones, incluso el propio encargado.
 +    - En cuanto a los **locales**, los hay de tres tipos: grandes superficies a las afueras de la ciudad, pequeños locales en el centro y también algunos centros que abren 24 horas. La diferencia entre los tres tipos de locales son el tamaño, la variedad de productos que tienen, el horario y el número de personas que trabajan en ellos.
 +    - En cuanto a los **clientes**, puesto que quieren potenciar la fidelidad de los mismos, siempre se les solicita si quieren hacerse socios de TokioMarket para entregarles una tarjeta de cliente y asi optar a descuentos y promociones varias. En función del gasto mensual que hagan hay 3 perfiles: Socio Bronce, Plata y Oro. La diferencia entre los 3 es que optan a mayores descuentos (el porcentaje que se aplica a los productos). También es cierto que, en función del tipo de socio, pueden tener descuentos en unos u otros productos y además, a los Oro, se les invita a eventos exclusivos.
 +    - Sobre los **productos**, hay varias categorías principales: Hogar, Ocio y Trabajo, pero cada producto puede pertenecer a varias categorias al mismo tiempo
 +    - Define:
 +      - Clases para definir todo el problema
 +      - Constructores, Gettes y Setters para todos
 +      - Una clase principal donde probar el funcionamiento de todo el modelo diseñado
  
 ---- ----
  
 (c) 2019-{{date>%Y}} Santiago Faci (c) 2019-{{date>%Y}} Santiago Faci
apuntes/objetos.1685878574.txt.gz · Last modified: 2023/06/04 11:36 by Santiago Faci