Imprimir objetos en Java

Mohammad Irfan 12 octubre 2023
  1. Comprensión de la salida del objeto
  2. Imprimir objeto en Java
  3. Objetos de matrices
  4. ¿Cómo imprimir objetos?
  5. Imprimir objeto de array
  6. Imprimir objeto de array multidimensional
  7. Imprimir objetos de colección en Java
  8. Usando la librería Apache Commons
  9. Resumen
Imprimir objetos en Java

Este tutorial presenta cómo imprimir un objeto en Java y enumera algunos códigos de ejemplo para comprender el tema.

Un objeto es una instancia de una clase y podemos usarlo para acceder a las propiedades y métodos de la clase. Pero si intentamos imprimir un objeto usando el método System.out.println(), es posible que no obtengamos el resultado esperado. A menudo imprimimos las propiedades del objeto para depurar y asegurarnos de que todo funciona bien. En este tutorial, aprenderemos cómo imprimir propiedades de objetos en Java.

Comprensión de la salida del objeto

Acerca de los objetos

  • Tratemos de entender qué sucede cuando imprimimos un objeto. Cuando llamamos al método System.out.print(), entonces se invoca el método toString() de la clase Object.
  • Como sabemos, todas las clases en Java amplían la clase Objeto. Por tanto, el método toString() se puede aplicar a cualquier instancia de cualquier clase.
  • Este método devuelve una cadena compuesta por el nombre de la clase y el código hash del objeto. Estos dos están conectados por el símbolo @.

Imprimir objeto en Java

Creemos una nueva clase e intentemos imprimir sus objetos.

class Student {
  private String studentName;
  private int regNo;
  private Double gpa;
  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s1 = new Student("Justin", 101, 8.81);
    Student s2 = new Student("Jessica", 102, 9.11);
    System.out.println(s1);
    System.out.println(s2);
  }
}

Producción :

Student@7a81197d
Student@5ca881b5

La primera parte de la salida muestra el nombre de la clase (Student en este caso), y la segunda parte muestra un código hash único para el objeto. Obtendremos un código hash diferente cada vez que ejecutemos el código anterior.

Objetos de matrices

un array también es un objeto en Java, y no obtenemos sus elementos cuando intentamos imprimir un array en la consola. Ejecutemos el siguiente código y veamos su salida.

public class Demo {
  public static void main(String[] args) {
    int[] integerArr = {5, 10, 15};
    double[] doubleArr = {5.0, 10.0, 15.0};
    char[] charArr = {'A', 'B', 'C'};
    String[] stringArr = {"Justin", "Jessica"};
    int[][] twoDimArray = {{1, 2, 3}, {4, 5, 6}};
    System.out.println("Integer Array:" + integerArr);
    System.out.println("Double Array:" + doubleArr);
    System.out.println("Char Array:" + charArr);
    System.out.println("String Array:" + stringArr);
    System.out.println("2D Array:" + twoDimArray);
  }
}

Producción :

Integer Array:[I@36baf30c
Double Array:[D@7a81197d
Char Array:[C@5ca881b5
String Array:[Ljava.lang.String;@24d46ca6
2D Array:[[I@4517d9a3
  • Los corchetes indican la dimensión del array. Para el array 1-D, se imprimirá un corchete de apertura única. Para el array 2-D, tenemos dos corchetes.
  • El siguiente carácter después del corchete indica lo que está almacenado en el array. Para el array de enteros, se imprime una I. Para el array de caracteres, se imprime la letra C.
  • La L del array de cadenas indica que el array contiene objetos de una clase. En tales casos, el nombre de la clase se imprime a continuación (java.lang.String en nuestro caso).
  • Después del símbolo @, se imprime el código hash del objeto.

¿Cómo imprimir objetos?

Si queremos imprimir el objeto y sus propiedades en un formato diferente, entonces necesitamos anular el método toString() en nuestra clase. Este método debería devolver una cadena. Anulemos este método en nuestra clase de Estudiantes y entendamos el proceso.

class Student {
  private String studentName;
  private int regNo;
  private Double gpa;
  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  // overriding the toString() method
  @Override
  public String toString() {
    return this.studentName + " " + this.regNo + " " + this.gpa;
  }
}

Ahora, podemos ver el nombre del estudiante, el número de registro y el GPA cuando imprimimos un objeto de esta clase.

public class Demo {
  public static void main(String[] args) {
    Student s1 = new Student("Justin", 101, 8.81);
    System.out.print(s1);
  }
}

Producción :

Justin 101 8.81

Imprimir objeto de array

Necesitamos usar el método Arrays.toString() para ver los elementos presentes en un array. Tenga en cuenta que si tenemos un array de objetos de clase definidos por el usuario, entonces la clase definida por el usuario también debería tener un método toString() anulado. Esto asegurará que las propiedades de la clase se impriman correctamente.

import java.util.Arrays;
class Student {
  private String studentName;
  private int regNo;
  private Double gpa;
  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  // overriding the toString() method
  @Override
  public String toString() {
    return this.studentName + " " + this.regNo + " " + this.gpa;
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s1 = new Student("Justin", 101, 8.81);
    Student s2 = new Student("Jessica", 102, 9.11);
    Student s3 = new Student("Simon", 103, 7.02);

    // Creating Arrays
    Student[] studentArr = {s1, s2, s3};
    int[] intArr = {5, 10, 15};
    double[] doubleArr = {5.0, 10.0, 15.0};
    String[] stringArr = {"Justin", "Jessica"};

    System.out.println("Student Array: " + Arrays.toString(studentArr));
    System.out.println("Intger Array: " + Arrays.toString(intArr));
    System.out.println("Double Array: " + Arrays.toString(doubleArr));
    System.out.println("String Array: " + Arrays.toString(stringArr));
  }
}

Producción :

Student Array: [Justin 101 8.81, Jessica 102 9.11, Simon 103 7.02]
Intger Array: [5, 10, 15]
Double Array: [5.0, 10.0, 15.0]
String Array: [Justin, Jessica]

Imprimir objeto de array multidimensional

Para un array multidimensional, use el método deepToString() en lugar del método toString() y obtenga la salida deseada en la consola.

import java.util.Arrays;
class Student {
  private String studentName;
  private int regNo;
  private Double gpa;

  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  // overriding the toString() method
  @Override
  public String toString() {
    return this.studentName + " " + this.regNo + " " + this.gpa;
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s1 = new Student("Justin", 101, 8.81);
    Student s2 = new Student("Jessica", 102, 9.11);
    Student s3 = new Student("Simon", 103, 7.02);
    Student s4 = new Student("Harry", 104, 8.0);
    Student[][] twoDimStudentArr = {{s1, s2}, {s3, s4}};
    System.out.println("Using toString(): " + Arrays.toString(twoDimStudentArr));
    System.out.println("Using deepToString(): " + Arrays.deepToString(twoDimStudentArr));
  }
}

Producción :

Using toString(): [[LStudent;@7a81197d, [LStudent;@5ca881b5]
Using deepToString(): [[Justin 101 8.81, Jessica 102 9.11], [Simon 103 7.02, Harry 104 8.0]]

Imprimir objetos de colección en Java

Colecciones como Lists, Sets y Maps no necesitan ningún método añadido como Arrays.toString(). Si hemos anulado correctamente el método toString() de nuestra clase, entonces simplemente imprimir la colección nos dará el resultado deseado.

import java.util.ArrayList;
import java.util.HashSet;
class Student {
  private String studentName;
  private int regNo;
  private Double gpa;
  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  // overriding the toString() method
  @Override
  public String toString() {
    return this.studentName + " " + this.regNo + " " + this.gpa;
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s1 = new Student("Justin", 101, 8.81);
    Student s2 = new Student("Jessica", 102, 9.11);
    Student s3 = new Student("Simon", 103, 7.02);

    // Creating an ArrayList
    ArrayList<Student> studentList = new ArrayList<>();
    studentList.add(s1);
    studentList.add(s2);
    studentList.add(s3);
    // Creating a Set
    HashSet<Student> studentSet = new HashSet<>();
    studentSet.add(s1);
    studentSet.add(s2);
    studentSet.add(s3);
    System.out.println("Student List: " + studentList);
    System.out.println("Student Set: " + studentSet);
  }
}

Producción :

Student List: [Justin 101 8.81, Jessica 102 9.11, Simon 103 7.02]
Student Set: [Simon 103 7.02, Justin 101 8.81, Jessica 102 9.11]

Usando la librería Apache Commons

Si está trabajando con la biblioteca Apache commons, utilice la clase ToStringBuilder de la biblioteca Apache Commons para formatear nuestro objeto de diferentes formas. Podemos usar el método reflectionToString() de esta clase.

Simplemente podemos imprimir la clase de objeto y el código hash y los valores establecidos para las propiedades usando este método.

import org.apache.commons.lang3.builder.ToStringBuilder;
class Student {
  private String studentName;
  private int regNo;
  private Double gpa;
  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  @Override
  public String toString() {
    return ToStringBuilder.reflectionToString(this);
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s = new Student("Justin", 101, 8.81);
    System.out.print(s);
  }
}

Producción :

Student@25f38edc[gpa=8.81,regNo=101,studentName=Justin]

Si queremos omitir el código hash, entonces podemos usar la constante SHORT_PREFIX_STYLE. Vea el ejemplo a continuación.

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

class Student {
  private String studentName;
  private int regNo;
  private Double gpa;

  Student(String s, int i, Double d) {
    this.studentName = s;
    this.regNo = i;
    this.gpa = d;
  }
  @Override
  public String toString() {
    return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
  }
}
public class Demo {
  public static void main(String[] args) {
    Student s = new Student("Justin", 101, 8.81);
    System.out.print(s);
  }
}

Producción :

Student[gpa=8.81,regNo=101,studentName=Justin]

Si nuestra clase contiene objetos anidados, podemos usar el método RecursiveToStringStyle() para imprimir objetos.

@Override
public String toString() {
  return ToStringBuilder.reflectionToString(this, new RecursiveToStringStyle());
}

Resumen

La clase Object es la superclase de todas las clases en Java. El método toString(), que se invoca al imprimir un objeto, se implementa en la clase Object. Pero esta implementación no proporciona ninguna información sobre las propiedades de clase definidas por el usuario. Para ver correctamente estas propiedades, necesitamos anular el método toString() de nuestra clase. Para los arrays, podemos usar directamente el método toString() o el deepToString().

Artículo relacionado - Java Object