1
Aprender a programar desde cero / Java objetos quedan inaccesibles al usar varias veces new en un bucle CU00667B
« en: 04 de Enero 2016, 06:16 »
Bueno, aquí esta mi solución al ejercicio CU00667B del curso de java:
aunque la verdadera razon de comentar aqui en el foro es que tengo una duda en esta parte:
en entradas anteriores explicaban que a la hora de crear objetos se crea tanto el objeto como una variable que hace referencia a la direccion de memoria donde se almacena el objeto y es atraves de esa variable que podemos acceder a los metodos de ese objeto (si no entendi mal).
Entonces mi duda es que basicamente si encerramos ese codigo en un bucle y por ejemplo se ejecuta 5 veces, se crearian 5 objetos pero 1 sola variable referenciadora por lo que solo podria acceder al ultimo objeto que se creo (o por lo menos eso es lo que noto, no se si yo este equivocado) si por ejemplo yo escribiera:
obtendría el valor pero del ultimo objeto y los otros 4 quedaron inaccesibles. Entonces ¿como haría para crear mediante un bucle con una sola linea de codigo tanto el objeto como su correspondiente variable sin hacer esto?:
yo deduzco que si esos objetos se almacenan en una lista o algo asi, se podría acceder a ellos recorriendo esa lista (ya sea con el for each o con Iterator) pero si yo quisiera acceder directamente al objeto quedan inaccesibles.
Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Iterator;
public class ListaCantantes
{
// Variables de instancia / atributos / campos
private ArrayList<CantanteFamoso> listaCantantes;
private String nombre;
/**
* Constructor for objects of class ListaCantantes
*/
public ListaCantantes(String nombre)
{
this.nombre = nombre;
listaCantantes = new ArrayList<CantanteFamoso>();
}
/**
* Métodos
*/
public void addCantante(CantanteFamoso objeto)
{
listaCantantes.add(objeto);
}
public void copiaValores(){
Iterator<CantanteFamoso> copiaLista = listaCantantes.iterator();
int indice = 0;
while(copiaLista.hasNext()){
CantanteFamoso cantante = copiaLista.next();
System.out.println(indice + ") Cantante: " + cantante.getNombre() + " Disco con mas ventas: "
+ cantante.getDisco());
indice +=1;
}
}
public void valoresReales(){
int indice = 0;
for(CantanteFamoso cantante: listaCantantes){
System.out.println(indice + ")" + cantante.getNombre());
indice ++;
}
}
}
Código: [Seleccionar]
import java.util.Scanner;
public class CantanteFamoso
{
// variables de instancia / atributos / campos
private String nombre;
private String disco;
/**
* Constructor
*/
public CantanteFamoso()
{
setNombre();
setDisco();
}
/**
* Métodos
*/
public void setNombre(){
System.out.println("Ingrese nombre");
Scanner entrada = new Scanner(System.in);
nombre = entrada.nextLine();
}
public void setDisco(){
System.out.println("Ingrese Disco");
Scanner entrada = new Scanner(System.in);
disco = entrada.nextLine();
}
public String getNombre(){return nombre;}
public String getDisco(){return disco;}
}
Código: [Seleccionar]
import java.util.Scanner;
public class testIterator
{
public static void main (String[] args){
CantanteFamoso cantante1 = new CantanteFamoso();
CantanteFamoso cantante2 = new CantanteFamoso();
ListaCantantes lista = new ListaCantantes("cantantes Famosos");
lista.addCantante(cantante1);
lista.addCantante(cantante2);
lista.copiaValores();
CantanteFamoso cantante3 = new CantanteFamoso();
lista.addCantante(cantante3);
lista.copiaValores();
boolean opcion = true;
Scanner entrada = new Scanner(System.in);
do{
System.out.println("Desea ingresar mas cantantes S/N");
String valorEntrada = entrada.nextLine();
if(valorEntrada.equalsIgnoreCase("s")){
CantanteFamoso cantante = new CantanteFamoso();
lista.addCantante(cantante);
lista.copiaValores();
}else if(valorEntrada.equalsIgnoreCase("n")){
break;
}else{
boolean error = true;
while(error == true){
System.out.println("Entrada no valida");
System.out.println("Desea ingresar mas cantantes S/N");
valorEntrada = entrada.nextLine();
if(valorEntrada.equalsIgnoreCase("n")){
error = false;
opcion = false;
}else if(valorEntrada.equalsIgnoreCase("s")){
error = false;
CantanteFamoso cantante = new CantanteFamoso();
lista.addCantante(cantante);
lista.copiaValores();
}//CIerre if
}//Cierre while
}//Cierre if
}while(opcion == true);
System.out.println("Fin de la ejecucion");
}//Cierre main
}//Cierre clase
aunque la verdadera razon de comentar aqui en el foro es que tengo una duda en esta parte:
Código: [Seleccionar]
CantanteFamoso cantante = new CantanteFamoso();
en entradas anteriores explicaban que a la hora de crear objetos se crea tanto el objeto como una variable que hace referencia a la direccion de memoria donde se almacena el objeto y es atraves de esa variable que podemos acceder a los metodos de ese objeto (si no entendi mal).
Entonces mi duda es que basicamente si encerramos ese codigo en un bucle y por ejemplo se ejecuta 5 veces, se crearian 5 objetos pero 1 sola variable referenciadora por lo que solo podria acceder al ultimo objeto que se creo (o por lo menos eso es lo que noto, no se si yo este equivocado) si por ejemplo yo escribiera:
Código: [Seleccionar]
cantante.getNombre();
obtendría el valor pero del ultimo objeto y los otros 4 quedaron inaccesibles. Entonces ¿como haría para crear mediante un bucle con una sola linea de codigo tanto el objeto como su correspondiente variable sin hacer esto?:
Código: [Seleccionar]
CantanteFamoso cantante1 = new CantanteFamoso();
CantanteFamoso cantante2 = new CantanteFamoso();
CantanteFamoso cantante3 = new CantanteFamoso();
CantanteFamoso cantante4 = new CantanteFamoso();
CantanteFamoso cantante5 = new CantanteFamoso();
yo deduzco que si esos objetos se almacenan en una lista o algo asi, se podría acceder a ellos recorriendo esa lista (ya sea con el for each o con Iterator) pero si yo quisiera acceder directamente al objeto quedan inaccesibles.