Imprimir objetos em Java

Mohammad Irfan 12 outubro 2023
  1. Compreendendo a Saída do Objeto
  2. Imprimir objeto em Java
  3. Objetos Arrays
  4. Como imprimir objetos?
  5. Objeto de array de impressão
  6. Imprimir objeto de array multidimensional
  7. Imprimir objetos de coleção em Java
  8. Usando a Biblioteca Apache Commons
  9. Resumo
Imprimir objetos em Java

Este tutorial apresenta como imprimir um objeto em Java e lista alguns códigos de exemplo para entender o tópico.

Um objeto é uma instância de uma classe e podemos usá-lo para acessar as propriedades e métodos da classe. Mas se tentarmos imprimir um objeto usando o método System.out.println(), podemos não obter a saída esperada. Freqüentemente, imprimimos as propriedades do objeto para depuração e para ter certeza de que tudo está funcionando bem. Neste tutorial, aprenderemos como imprimir propriedades de objetos em Java.

Compreendendo a Saída do Objeto

Sobre Objetos

  • Vamos tentar entender o que acontece quando imprimimos um objeto. Quando chamamos o método System.out.print(), o método toString() da classe Object é invocado.
  • Como sabemos, todas as classes em Java estendem a classe Object. Portanto, o método toString() pode ser aplicado a qualquer instância de qualquer classe.
  • Este método retorna uma string que é composta pelo nome da classe e o código hash do objeto. Esses dois estão conectados pelo símbolo @.

Imprimir objeto em Java

Vamos criar uma nova classe e tentar imprimir seus 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);
  }
}

Produção:

Student@7a81197d
Student@5ca881b5

A primeira parte da saída mostra o nome da classe (Student neste caso) e a segunda parte mostra um código hash exclusivo para o objeto. Obteremos códigos hash diferentes cada vez que executarmos o código acima.

Objetos Arrays

Um array também é um objeto em Java e não obtemos seus elementos ao tentar imprimir um array no console. Vamos executar o código a seguir e ver sua saída.

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);
  }
}

Produção:

Integer Array:[I@36baf30c
Double Array:[D@7a81197d
Char Array:[C@5ca881b5
String Array:[Ljava.lang.String;@24d46ca6
2D Array:[[I@4517d9a3
  • Os colchetes denotam a dimensão do array. Para 1-D-array, um único colchete de abertura será impresso. Para o array 2-D, temos dois colchetes.
  • O próximo caractere após o colchete denota o que está armazenado na matriz. Para a matriz de inteiros, um I é impresso. Para a matriz char, a letra C é impressa.
  • O L para o array string denota que o array contém objetos de uma classe. Nesses casos, o nome da classe é impresso a seguir (java.lang.String em nosso caso).
  • Após o símbolo @, o código hash do objeto é impresso.

Como imprimir objetos?

Se quisermos imprimir o objeto e suas propriedades em um formato diferente, precisamos substituir o método toString() em nossa classe. Este método deve retornar uma string. Vamos substituir esse método em nossa classe de aluno e entender o processo.

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;
  }
}

Agora, podemos ver o nome do aluno, número de registro e GPA quando imprimimos um objeto desta classe.

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

Produção:

Justin 101 8.81

Objeto de array de impressão

Precisamos usar o método Arrays.toString() para visualizar os elementos presentes em um array. Observe que se tivermos um array de objetos de classe definidos pelo usuário, então a classe definida pelo usuário também deve ter um método toString() sobrescrito. Isso garantirá que as propriedades da classe sejam impressas corretamente.

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));
  }
}

Produção:

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 array multidimensional, use o método deepToString() em vez do método toString() e obtenha a saída desejada para o console.

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));
  }
}

Produção:

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 coleção em Java

Coleções como Lists, Sets e Maps não precisam de nenhum método adicionado como Arrays.toString(). Se tivermos substituído corretamente o método toString() de nossa classe, simplesmente imprimir a coleção nos dará a saída desejada.

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);
  }
}

Produção:

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 a Biblioteca Apache Commons

Se você estiver trabalhando com a biblioteca Apache commons, use a classe ToStringBuilder da biblioteca Apache Commons para formatar nosso objeto de maneiras diferentes. Podemos usar o método reflectionToString() desta classe.

Podemos simplesmente imprimir a classe de objeto e o código hash e os valores definidos para as propriedades 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);
  }
}

Produção:

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

Se quisermos omitir o hashcode, podemos usar a constante SHORT_PREFIX_STYLE. Veja o exemplo abaixo.

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);
  }
}

Produção:

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

Se nossa classe contém objetos aninhados, podemos usar o método RecursiveToStringStyle() para imprimir objetos.

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

Resumo

A classe Object é a superclasse de todas as classes em Java. O método toString(), que é invocado ao imprimir um objeto, é implementado na classe Object. Mas essa implementação não fornece nenhuma informação sobre as propriedades de classe definidas pelo usuário. Para visualizar adequadamente essas propriedades, precisamos sobrescrever o método toString() de nossa classe. Para matrizes, podemos usar diretamente o método toString() ou deepToString().

Artigo relacionado - Java Object