Autor Tema: Ejercicio CU00668B# objetos anónimos java diferencia con objetos con nombre  (Leído 3263 veces)

toni_apr

  • Avanzado
  • ****
  • Mensajes: 498
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
EJERCICIO CU00668B preguntas y respuestas.

Responde a las siguientes preguntas.

(1)¿Se puede acceder a un objeto anónimo contenido en un ArrayList?

(2)¿Se puede inicializar un objeto de una clase que contiene tres atributos de tipo objeto declarando en el constructor que los atributos se inicializan mediante objetos anónimos?


Respuesta (1) Si.

Los objetos dentro de un ArrayList son objetos sin nombre. Y nadie sabe si entraron con nombre o como anónimos. El nombre lo pueden tener antes de introducirlos en el ArrayList, pero una vez dentro, no tienen nombre. La única referencia a un objeto dentro de un ArrayList, es su posición.


Respuesta (2) Si. Ejemplo:

Código: [Seleccionar]
PersonajeMaldito personajeM1, personajeM2, personajeM3; // Declaración de atributos
// inicialización atributos con objetos anónimos de tipo String y MaldadBipolar
personajeM1 = new PersonajeMaldito("Lord Cremor",    new MaldadBipolar("Come corazones",  "Cuelga miserias"));
personajeM2 = new PersonajeMaldito("Lady Westfalia", new MaldadBipolar("Destruye sueños", "Encierra miradas"));
personajeM3 = new PersonajeMaldito("Demon Wii",      new MaldadBipolar("Corta senderos",  "Tuerce destinos"));

// la clase PersonajeMaldito tiene dos atributos uno de tipo String y otro de tipo MaldadBipolar
// la clase MaldadBipolar tiene dos atributos de tipo String

Espero vuestros comentarios. Saludos.
« última modificación: 16 de Julio 2015, 14:11 de Alex Rodríguez »

Mastermind

  • Experto
  • *****
  • Mensajes: 543
    • Ver Perfil
Hola, viendo las respuestas:

Respuesta (1): OK, aunque dentro del arrayList el objeto sigue teniendo nombre si entró con nombre.

Prueba el siguiente código:

Clase Sorteo:

Código: [Seleccionar]
public class Sorteo{

    String denominacion;

    public Sorteo (String denominacion) {
        this.denominacion = denominacion;
    }

    public void setDenominacion (String denom) { this.denominacion = denom; }   

    public String getDenominacion() { return denominacion; }

}


Clase prueba:

Código: [Seleccionar]
import java.util.ArrayList;
public class prueba {

    public static void main( String[] Args) {
        Sorteo sorteo1 = new Sorteo("el sorteo 1");
        Sorteo sorteo2 = new Sorteo("el sorteo 2");

        ArrayList<Sorteo> lista1 = new ArrayList<Sorteo> ();
        lista1.add(sorteo1);
        lista1.add(sorteo2);

        for (Sorteo s: lista1) {
            System.out.println ("Hola : " + s.getDenominacion());
        }

        sorteo1.setDenominacion("el sorteo 55");

        for (Sorteo s: lista1) {
            System.out.println ("Hola2 : " + s.getDenominacion());
        }
       
    }
}

Resultado:

Hola : el sorteo 1
Hola : el sorteo 2
Hola2 : el sorteo 55
Hola2 : el sorteo 2


El objeto sigue con su nombre (referencia) y puede ser manipulado tanto como elemento del ArrayList como como objeto en sí.

De este modo, puedes manipular un elemento de un ArrayList sin acceder a través del arrayList, sino accediendo a través del nombre (referencia) al objeto, si es que el objeto tiene nombre. En caso de no tener nombre, la única forma de acceder a él sí será como elemento del ArrayList.

Saludos
« última modificación: 23 de Septiembre 2014, 11:25 de Alex Rodríguez »

toni_apr

  • Avanzado
  • ****
  • Mensajes: 498
  • Curiosidad, es uno de los pilares del Conocimiento
    • Ver Perfil
Hola Mastermind.
El código que envías me da que pensar. Me has hecho ver cosas en las que no había pensado.

Mi convicción es que, en los objetos con nombre, el nombre solo es un puntero a una dirección de memoria (con el contenido de la variable). Esto hace que dos objetos con la misma identidad apuntan a la misma dirección de memoria (el contenido de la variable).

Dentro del ArrayList, corrígeme si me equivoco, se guarda únicamente los punteros a las direcciones de memoria de cada elemento. Si se guardara también el nombre que tenía el objeto fuera del ArrayList, habría de guardar también el nombre de todos los objetos idénticos.

Reconozco mi error al decir
Citar
La única referencia a un objeto dentro de un ArrayList, es su posición.
Pues independientemente de si un objeto tenía nombre antes de añadirlo a un ArrayList, siempre puedo asignar un elemento del ÄrrayList a un objeto recien creado.

'nombreDeObjeto = nombreArrayList.get(numeroElemento);'

A partir de este momento puedo acceder al elemento por su índice en el ArrayList y por su nombreDeObjeto pues son dos objetos idénticos.

No se si tenemos diferencias en nuestros conceptos, pero para mí la afirmación:
Citar
dentro del arrayList el objeto sigue teniendo nombre si entró con nombre
Me plantea dudas.

Gracias por tus comentarios.
Saludos.
« última modificación: 23 de Septiembre 2014, 11:25 de Alex Rodríguez »

Mastermind

  • Experto
  • *****
  • Mensajes: 543
    • Ver Perfil
Sí, el nombre es una referencia a una dirección de memoria, dentro del ArrayList guardas las referencias a los objetos, no el nombre que tiene fuera, y si tienes una referencia como objeto con nombre y como elemento de un arrayList puedes acceder al objeto de cualquiera de las dos maneras. Lo de que dentro del ArrayList es objeto sigue teniendo nombre me refería a que no por estar en el ArrayList dejar de ser accesible a través del nombre, pero todo es como lo has razonado, no hay diferencias. Saludos
« última modificación: 23 de Septiembre 2014, 11:26 de Alex Rodríguez »

 

Esto es un laboratorio de ideas...
Aprender a programar

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".