Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: Dimebag94 en 26 de Julio 2014, 01:00
-
Buenas!!
Bueno he estado haciendo los ejercicios de Java y me tope con una cuestion extraña. Aqui dejo el codigo:
import java.util.Scanner;
import java.util.Iterator;
public class Main
{
public static void main(String [ ] args)
{
ListaCantantesFamosos objeto=new ListaCantantesFamosos();
Scanner ingresoTeclado=new Scanner(System.in);
CantanteFamoso cantante=new CantanteFamoso();
System.out.print("Ingrese primer cantante extra: ");
System.out.print("\nNombre: ");
cantante.setNombre(ingresoTeclado.nextLine());
System.out.print("Disco con mas ventas: ");
cantante.setDiscoConMasVentas(ingresoTeclado.nextLine());
objeto.añadirObjetoLista(cantante);
System.out.print("Ingrese segundo cantante extra: ");
System.out.print("\nNombre: ");
cantante.setNombre(ingresoTeclado.nextLine());
System.out.print("Disco con mas ventas: ");
cantante.setDiscoConMasVentas(ingresoTeclado.nextLine());
objeto.añadirObjetoLista(cantante);
objeto.leerLista();
}
}
Cuando utilizo este codigo e ingreso los nombres de los cantantes y sus discos, lo que ocurre es que al mostrarlos me muestra ambos objetos iguales al segundo. Pero si modifico el codigo asi:
import java.util.Scanner;
import java.util.Iterator;
public class Main
{
public static void main(String [ ] args)
{
ListaCantantesFamosos objeto=new ListaCantantesFamosos();
Scanner ingresoTeclado=new Scanner(System.in);
CantanteFamoso cantante=new CantanteFamoso();
System.out.print("Ingrese primer cantante extra: ");
System.out.print("\nNombre: ");
cantante.setNombre(ingresoTeclado.nextLine());
System.out.print("Disco con mas ventas: ");
cantante.setDiscoConMasVentas(ingresoTeclado.nextLine());
objeto.añadirObjetoLista(cantante);
[b]cantante=new CantanteFamoso();[/b]
System.out.print("Ingrese segundo cantante extra: ");
System.out.print("\nNombre: ");
cantante.setNombre(ingresoTeclado.nextLine());
System.out.print("Disco con mas ventas: ");
cantante.setDiscoConMasVentas(ingresoTeclado.nextLine());
objeto.añadirObjetoLista(cantante);
objeto.leerLista();
}
}
En negritas coloque la linea que agregue. Hacer esto me parece algo extraño y a mi entender esta mal, pero aun asi funciona bien y no como en el primer ejemplo.
En sintesis en el primer caso uso la misma variable para ambos ingresos, ingreso el primer nombre y el primer disco y los agrego a la lista y luego uso la misma variable e ingreso el segundo nombre y segundo disco y los agrego a la lista, pero al mostrar la lista me muestra ambos objetos iguales al segundo objeto que cargue.
-
Ola como estas, el problema que estas teniendo en el primer caso , que es el de usar el mismo objeto de CantanteFamoso , es que esa variable cantante referencia una direccion de memoria , al insertarle los valores con el Scanner quedan los valores como los insertaste y lo añades al arreglo, entonces al añadir en el espacio 0 del arreglo lo que guarda es la direccion de memoria que referencia "cantante" es por eso que cuando vuelves a hacerle set a esa variable estas haciendo cambio en la direccion de memoria de este y como el arreglo en su primer espacio tiene tambien referenciado a esa misma lo modifica , despues tu le indicas en tu algoritmo que lo añada al arreglo esa misma direccion de memoria, teniendo asi en tu arreglo el espacio 0 y el 1 referenciado a la misma direccion de memoria .
En tu segundo caso lo que haces al darle "new CantanteFamoso()" es creando otro objeto que tendra otra direccion de memoria; lo que has hecho es valido pero no es una buena tecnica de programacion porque usas el mismo alias para el objeto. seria mejor darle CantanteFamoso otrocantante = new CantanteFamoso(); y alli darle los valores. Espero haberte ayudado =) te recomiendo leer otra vez la clase numero 44 del curso aqui el link :
https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=523:la-sentencia-new-invocacion-de-un-constructor-para-crear-objetos-en-java-concepto-y-ejemplos-cu00643b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188
Alli nos explican que el realidad el nombre solo es un alias para el objeto lo importante es el codigo de memoria que se crea al hacerle new y crear asi un objeto =) , byee
-
Gracias solidsnake ahora comprendi mi error.
Lo que aun no termino de comprender es como hacer esta cuestion generica para llevar a cabo el ejercicio. Porque el mismo pide que permita al usuario elegir entre agregar otro cantante o salir del programa, si el usuario decidiera agregar muchos cantantes como podria hacer que el codigo creara tantos objetos del tipo CantanteFamoso que sean diferentes unos de otros?
-
import java.util.Scanner;
import java.util.Iterator;
public class Main
{
public static void main(String [ ] args)
{
ListaCantantesFamosos objeto=new ListaCantantesFamosos();
cargarCantante(objeto);
cargarCantante(objeto);
objeto.leerLista();
}
public static void cargarCantante(ListaCantantesFamosos objeto)
{
CantanteFamoso cantante1=new CantanteFamoso();
Scanner ingresoTeclado=new Scanner(System.in);
System.out.print("Ingrese cantante extra: ");
System.out.print("\nNombre: ");
cantante1.setNombre(ingresoTeclado.nextLine());
System.out.print("Disco con mas ventas: ");
cantante1.setDiscoConMasVentas(ingresoTeclado.nextLine());
objeto.añadirObjetoLista(cantante1);
}
}
Esto fue lo que se me ocurrio para intentar solucionarlo, funciona pero no se si es valido o correcto hacerlo de esta forma.
-
Bueno eso lo que yo hise fue crear una entrada de teclado y mediante un while si el usuario decia s o n , si es si desde un metodo de mi arreglo le daba añadirCantante(Cantante cantante) , en mi caso tengo otro metodo añadirCantante pero sin parametros el cual es un procedimiento que adentro se crea un objeto cantante y lo metia al arreglo =) , en pocas palabras sobrecargaba el medotod añadirCantate uno en el que le paso el cantante y otro en el que lo crea desde el metodo, de esta manera:
public void añadir(CantanteFamoso cantante){
arreglo.add(cantante);
}
public void añadir(){
CantanteFamoso temp = new CantanteFamoso();
Scanner e = new Scanner(System.in);
System.out.println("Ingrese el nombre del cantante : ");
temp.setNombre(e.nextLine());
System.out.println("Ingrese el nombre del disco con mas ventas : ");
temp.setDiscoConMasVentas(e.nextLine());
arreglo.add(temp);
}