HOWTO · Java

Imprimir objetos em Java

Este post é sobre como 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().