Imprimir objetos em Java
- Compreendendo a Saída do Objeto
- Imprimir objeto em Java
- Objetos Arrays
- Como imprimir objetos?
- Objeto de array de impressão
- Imprimir objeto de array multidimensional
- Imprimir objetos de coleção em Java
- Usando a Biblioteca Apache Commons
- Resumo
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étodotoString()
da classe Object é invocado. - Como sabemos, todas as classes em Java estendem a classe
Object
. Portanto, o métodotoString()
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()
.