Bueno.....
Creo que he corregido los fallos que me decías.
El iterator lo he entendido (más o menos). "CantanteFamoso tmp", es crear una variable que almacena los atributos del objeto CantanteFamoso (como "String tmp", que también es una variable de un objeto)... ¿Es así?..... ¿Verdad?

Cuelgo de nuevo todo, para mejor seguimiento.
Como siempre, muchas gracias.
/**
/**
* Write a description of class TestCantantes3 here.
*
* @author (David Martinez)
* @version (1.0)
*/
public class TestCantantesYDiscos // Inicio de clase.
{
public TestCantantesYDiscos() // Constructor sin parametros.
{
}
public static void main (String []args) // Inicio del main.
{
CantanteFamoso objCantante = new CantanteFamoso(); // Creamos un objeto "objCantante" de la clase CantanteFamoso sin parametros (vacío)..
ListaCantantesFamosos listaCantantes = new ListaCantantesFamosos (); // Creamos un objeto "listaCantantes" de la clase ListaCantantesFamosos
VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes(); // Creamos objeto "muestraEnPantalla" de la clase VisualizadorDeMensajes.
RegistroTeclado teclado = new RegistroTeclado(); // Creamos objeto "teclado" de la clase RegistroTeclado
listaCantantes.addCantante (new CantanteFamoso ("Michael Jackson","Thriller")); // Añadimos con metodo de ArrayList, un nuevo objeto CantanteFamoso , con parametros
listaCantantes.addCantante (new CantanteFamoso ("El último de la fila","Astronomía razonable")); // ¿ Porque no, (new objCantante ("El ultimo de la fila","Astonomía razonable")); ?
muestraEnPantalla.encabezadoDeLista("inicial"); // Muestra en pantalla mensaje con parametro que indica si es lista "inicial" o "actualizada".
listaCantantes.listadoCompleto();// Metodo de ListaCantantesFamosos que recorre con Iterator y muestra los datos de la lista.
int respuesta = 0; // Reinicializamos variable que controlará el while (1= s, 2 = n, 0 = otra letra).
while (respuesta !=2) // repetir es 2 cuando se contesta n a "volver a introducir"
{
muestraEnPantalla.solicitudDeDatos ("los datos","cantante"); // Metodo que muestra en pantalla que introduzcamos los "dato" del "tipo".
String nombreCantante = teclado.solicitudEntradaTeclado(); // Almacena en "nombreCantante" lo registrado en el metodo solicitudEntradaTeclado.
muestraEnPantalla.solicitudDeDisco();
String nombreDisco = teclado.solicitudEntradaTeclado(); // Metodo que muestra en pantalla que introduzcamos el nombre del disco.
listaCantantes.addCantante(new CantanteFamoso (nombreCantante,nombreDisco)); // Añade el nuevo cantante y disco a la lista con el metodo añadeDatos.
muestraEnPantalla.encabezadoDeLista("actualizada"); // Muestra en pantalla mensaje con parametro que indica si es lista "inicial" o "actualizada".
listaCantantes.listadoCompleto(); // Metodo de ListaCantantes que recorre y muestra los datos de la lista.
muestraEnPantalla.volverAIntoducirDatos("datos","cantante"); // Muestra en pantalla si se quieren introducir más datos.
do{ // Bucle que se repite, mientras "respuesta = 0".
String siONo = teclado.solicitudEntradaTeclado(); // Se vuelve a socilitar la introdución de datos.
if (siONo.equalsIgnoreCase("s")) { respuesta = 1;} // si se recibe "s" respuesta = 1 (Se introducen más datos.
else if (siONo.equalsIgnoreCase("n")){ respuesta = 2;} // Si se recibe "n" respuesta = 2 (No se introducen más datos.
else {
muestraEnPantalla.entradaIncorrecta(); // Si no es ni "s" ni "n", Se muestra mensaje aclaratorio.
respuesta=0;
}
} while (respuesta==0); // Fin de Do-While.
} // Fin de While.
} // Fin del main.
} // Fin de la clase.
/**
* Clase que crea el objeto CantanteFamoso y realiza consultas en sus datos.
*
* @author (David Martínez)
* @version (1.0)
*/
public class CantanteFamoso // Declaramos los atributos de la clase CantanteFamoso.
{
private String nombre;
private String discoConMasVentas;
public CantanteFamoso() // Constructor que inicializa los atributos a datos vacíos.
{
this.nombre = "";
this.discoConMasVentas = "";
}
public CantanteFamoso(String nombre,String discoMasVendido) // Constructor que inicializa los campos recibiendo parametros tipo Strings
{
this.nombre = nombre;
this.discoConMasVentas = discoMasVendido;
}
public String consultaCantante() { return this.nombre; } // Metodo que devuelve String con el atributo nombre.
public String consultaDisco() { return discoConMasVentas; } // Metodo que devuelve String con el atributo discoConMasVentas.
public void setCantante(String nombreCantante){ this.nombre = nombreCantante;} // Método para establecer atributo nombre
public void setCancion(String cancionMasVendida){ this.discoConMasVentas = cancionMasVendida;} // Metodo para establecer atributo discoConMasVentas.
}
import java.util.ArrayList;
import java.util.Iterator;
/**
* Write a description of class ListaNombres here.
*
* @author (David Martínez)
* @version (a version number or a date)
*/
public class ListaCantantesFamosos
{
private ArrayList <CantanteFamoso> listaCantantesFamosos;
VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes();
public ListaCantantesFamosos () // Constructor, Crea ArrayList con un objeto CantanteFamoso.
{
listaCantantesFamosos = new ArrayList <CantanteFamoso>();
} // Cierre del constructor.
public void addCantante (CantanteFamoso datos) // Añade al ArrayList el nombre introducido.
{
listaCantantesFamosos.add (datos);
} // Cierre del metodo.
public void listadoCompleto()
{
Iterator <CantanteFamoso> copiaDeLista = listaCantantesFamosos.iterator();
CantanteFamoso tmp;
while (copiaDeLista.hasNext()){
tmp = copiaDeLista.next();
muestraEnPantalla.listaCompleta(tmp.consultaCantante(),tmp.consultaDisco());
}
}
}
/**
* Clase que muestra los mensajes por pantalla.
*
* @author (David Martínez)
* @version (a version number or a date)
*/
public class VisualizadorDeMensajes
{
public VisualizadorDeMensajes()
{
}
public void solicitudDeDatos(String dato,String tipo) // Metodo para mostrar mensaje de introducción de datos
{
System.out.println("\nPor favor, introduzca " + dato + " de " + tipo +".");
}
public void solicitudDeDisco() // Muestra la solicitud de introducir Disco.
{
System.out.println("Introduzca su disco más vendido:");
}
public void volverAIntoducirDatos(String dato,String tipo) // Muestra la pregunta de seguir introduciendo datos.
{
System.out.println("¿Desea introducir "+ dato + " de otro/a " + tipo +"? (S/N): ");
}
public void entradaIncorrecta() // Muestra que hay que introducir o S o N.
{
System.out.println("Por favor, responda (S/N): ");
}
public void encabezadoDeLista(String tipo) // Muestra el encabezado de la lista.
{
System.out.println("La lista " + tipo + " contiene los siguientes datos:" );
}
public void listaPosicionYCantante (int posicion,String nombre) // Muestra el dato de ArrayList de situado en "posicion" y "nombre"
{
System.out.println("En posicion: " + posicion + " - " + nombre );
}
public void listaCompleta(String nombre,String disco) // Muestra los atributos recibidos por Iterator de la clase ListaCantantesFamosos.
{
System.out.println("Cantante: " + nombre.toUpperCase() + " Disco con más ventas: " + disco.toUpperCase() );
}
}
import java.util.Scanner;
/**
* Write a description of class RegistroTeclado here.
*
* @author (David Martínez)
* @version (a version number or a date)
*/
public class RegistroTeclado
{
String teclado; // Variable para crear objeto Scanner.
VisualizadorDeMensajes muestraEnPantalla = new VisualizadorDeMensajes();
public RegistroTeclado() // El constructor llama al metodo que crea el objeto Scanner
{
}
public String solicitudEntradaTeclado() // Metodo que crea el objeto Scanner.
{
Scanner teclado = new Scanner (System.in);
String registroTeclado = teclado.nextLine();
return registroTeclado; // Devuelve el texto introducido como String
}
}