Listado completo de tutoriales
94 - Clase Object y sobrescritura del método toString |
En Java por defecto toda clase hereda de 'Object' si no especificamos un 'extends'.
La clase Object tiene entre otros un método llamado 'toString', por defecto retorna el nombre de la clase que se ha instanciado y la dirección de memoria del mismo. Veamos con un ejemplo dicha información.
public class Persona { private String nombre; private int edad; public Persona(String nombre, int edad) { this.nombre = nombre; this.edad = edad; } public String retornarNombre() { return nombre; } public void fijarNombre(String nombre) { this.nombre = nombre; } public int retornarEdad() { return edad; } public void fijarEdad(int edad) { this.edad = edad; } public static void main(String[] ar) { Persona persona1 = new Persona("Juan", 33); System.out.println(persona1.toString()); } }
No indicamos el nombre de la clase que hereda 'Persona':
public class Persona {
Pero el compilador de Java reformula la clase con la siguiente sintaxis:
public class Persona extends Object {
Luego significa que la clase 'Persona' hereda todos los métodos de la clase 'Object' y uno de ellos se llama 'toString'.
Cuando creamos un objeto de la clase 'Persona' luego podemos llamar al método 'toString' que es un método heredado:
Persona persona1 = new Persona("Juan", 33); System.out.println(persona1.toString());
El resultado es:
Es muy común sobreescribir el método 'toString' en nuestras clases para que nos provea una información más significativa. Modifiquemos la clase Persona sobreescribiendo el método toString:
public class Persona { private String nombre; private int edad; public Persona(String nombre, int edad) { this.nombre = nombre; this.edad = edad; } public String retornarNombre() { return nombre; } public void fijarNombre(String nombre) { this.nombre = nombre; } public int retornarEdad() { return edad; } public void fijarEdad(int edad) { this.edad = edad; } public String toString() { return "Nombre:" + nombre + "- Edad:" + edad; } public static void main(String[] ar) { Persona persona1 = new Persona("Juan", 33); System.out.println(persona1.toString()); } }
Hemos sobreescrito el método 'toString' para la clase 'Persona', el String a retornar dependerá de las necesidades de nuestra aplicación:
public String toString() { return "Nombre:" + nombre + "- Edad:" + edad; }
Ahora cuando llamamos al método 'toString' a partir de una instancia de la clase 'Persona' se ejecutará el método implementado por nosotros:
System.out.println(persona1.toString());
Si queremos por ejemplo que el método 'toString' retorne también el String que genera la clase 'Object' debemos modificar nuestro código con la siguiente sintaxis:
public String toString() { return super.toString()+" - Nombre:" + nombre + "- Edad:" + edad; }
Cuando pasamos un objeto al método 'println' y no indicamos el nombre del método, éste accede directamente al método 'toString'. Es común utilizar la sintaxis:
System.out.println(persona1);
Tenemos como resultado:
En la librería estándar de Java gran cantidad de clases sobreescriben el método 'toString' brindando una información acorde a su objetivo. Veamos un ejemplo del String que retorna la clase ArrayList.
import java.util.ArrayList; public class PruebaArrayList { public static void main(String[] ar) { ArrayList<Integer> lista1 = new ArrayList<Integer>(); lista1.add(70); lista1.add(56); lista1.add(345); lista1.add(344); System.out.println(lista1.toString()); } }
Nos retorna un String con los elementos del arreglo separados por coma y los caracteres de corchete al principio y al final:
No olvidar que obtenemos el mismo resultado escribiendo:
System.out.println(lista1);
Si queremos ver como está codificado el método toString de cualquier clase en Eclipse podemos presionar la tecla 'Control' y hacer clic con la flecha del mouse sobre el nombre del método:
Se nos abre el código fuente de su implementación:
public class Bolillero { private int[] vec; public Bolillero() { vec = new int[50]; generar(); } public void generar() { for (int f = 0; f < vec.length; f++) { vec[f] = 1 + (int) (Math.random() * 50); for (int k = 0; k < f; k++) if (vec[f] == vec[k]) { f--; break; } } } public String toString() { String cad = "["; for (int f = 0; f < vec.length; f++) cad += vec[f] + " "; cad += "]"; return cad; } public static void main(String[] ar) { Bolillero bolillero1 = new Bolillero(); System.out.println(bolillero1); } }