Estou com uma dúvida. Explico ela abaixo do programa…
public class ArrayTeste{
int arranjo[];
ArrayTeste(){
char a[] = new char[] {'a','b', 'c', 'd'};
String s = new String(a);
System.out.println(a);
System.out.println(s);
}
public static void main(String []args){
new ArrayTeste();
}
}
Quando imprimo objetos com System.out.println, o Java o transforma implicitamente em string, mostrando na tela uma representação textual do objeto. Esperava a impressão de um códígo único quando fiz System.out.println(a);, pois a é um objeto [é um arranjo, então é um objeto]. Porém, o que é impresso são os dados do arranjo, como ocorre na impressão da string s.
O que eu esperava que ocorresse somente ocorre se eu explicitamente fizer a.toString(). Por que não está sendo impresso uma representação textual do arranjo a?
Cara você declara um array de caracteres a e atribui seus devidos valores
char a[] = new char[] {'a','b', 'c', 'd'};
(Hey java, cria um vetor a[n posições] e atribua a ela os seguintes valores: abcd)
Logo após você instancia uma Strings e passa para ela todo conteúdo do vetor a “abcd”
String s = new String(a);
(Hey java, crie uma String s e passe todos os meus caracteres ( vetor de a) para s)
ou seja, você tem um vetor de caracteres (também String) e atribui os valores para outro, ao imprimir, obviamente o java irá mostrar os valores contidos em cada objetvo…
Acho que a dúvida dele é por que que em um código assim: [code] public static void main(String[] args){
char a[] = new char[] {‘a’,‘b’,‘c’,‘d’};
int b[] = new int[] {1, 2, 3, 4};
System.out.println(a);
System.out.println(b);
}[/code] quando imprimimos [b]a[/b] a saída é [b]'abcd'[/b] e quando imprimimos [b]b[/b] a saída é algo como [b][I@19821f[/b]
A especificação do Java não diz nada sobre esse comportamento: http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf
Nesse caso, podemos então assumir que é porque alguém na Oracle sobrescreveu o método toString() do char[] para se comportar dessa forma.
Por padrão, o toString() de objetos se comportam colocando o nome da classe, que no caso do array de ints [I, seguido de @, seguido do hashCode em hexadecimal.
Como isso não faz parte da especificação, seria um erro confiar no toString() para transformar char[] em Strings.
Se precisar fazer isso, use o construtor da classe String.
[quote=ViniGodoy]A especificação do Java não diz nada sobre esse comportamento: http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf
Nesse caso, podemos então assumir que é porque alguém na Oracle sobrescreveu o método toString() do char[] para se comportar dessa forma.
Por padrão, o toString() de objetos se comportam colocando o nome da classe, que no caso do array de ints [I, seguido de @, seguido do hashCode em hexadecimal.
Como isso não faz parte da especificação, seria um erro confiar no toString() para transformar char[] em Strings.
Se precisar fazer isso, use o construtor da classe String.[/quote]
Vini, a minha dúvida é que quando imprimimos um objeto, o que é impresso é uma representação desse objeto em forma de texto, como você descreveu. Eu não tenho que chamar explicitamento toString() para impressão dessa representação. Contudo, ao imprimir um arranjo, foi impresso os seus valores e não a sua representação textual. Quando coloquei toString(), a representação textual apareceu.
Se o método toString() tivesse sido sobrescrito, a sua chamada explícita deveria ter imprimido o conteúdo do arranjo. Isso não ocorre, como já disse.
char a[] = {'a','b','c','d'};
char b[] = new char[] {'a','b', 'c', 'd'};
String s = new String(a);
System.out.println(b);
System.out.println(s);
System.out.println(b.toString());
As saída são:
abcd
[C@1004901
abcd
Quando você manda um objeto ser impresso o Java obtém a representação textual dele chamando o método toString() mesmo que você não tenha feito isso explicitamente.
Acontece que as classes tem o direito de imprimir o que quiserem no toString. Por que o conteúdo de um char[] não seria uma boa representação textual desse array?
Há outras classes em Java com o toString() sobrescrito como ArrayList e StringBuilder. Você verá nelas o nesmo comportamenro.
[quote=ViniGodoy]Quando você manda um objeto ser impresso o Java obtém a representação textual dele chamando o método toString() mesmo que você não tenha feito isso explicitamente.
Acontece que as classes tem o direito de imprimir o que quiserem no toString. Por que o conteúdo de um char[] não seria uma boa representação textual desse array?
Há outras classes em Java com o toString() sobrescrito como ArrayList e StringBuilder. Você verá nelas o nesmo comportamenro.[/quote]
Sim, qualquer classe pode sobrescrever o método toString para quando o seu objeto o chamar, imprimir o que desejar. Com o seu exemplo do ArrayList, ela com certeza sobrescreveu o método toString(). Tanto o fez que tanto a sua chamada implícita quanto a sua chamada explícita imprimiu os valores do vetor.
Já em arranjos, a chamada explícita a toString() imprime a representação textual, com [@… e a implícita, os seus valores. Esperava uma convergência. Por isso não entendo. Ou imprime os valores ou a representação.
Atenção - new String (char[]) não chama implicitamente toString.
É isso que você está confundindo, não?
[code] public static void main(String[] args){
char a[] = {‘a’,‘b’,‘c’,‘d’};
System.out.println(a); // Imprime 'abcd'
System.out.println(a.toString()); // Imprime [C@19821f
}[/code] Por que os resultados diferentes?
Simplesmente não tem a ver com o toString(), e sim com o método println da classe PrintStream
Leia a diferença sobre quando ele recebe um array de char.
[quote=digaoneves][code] public static void main(String[] args){
char a[] = {‘a’,‘b’,‘c’,‘d’};
System.out.println(a); // Imprime 'abcd'
System.out.println(a.toString()); // Imprime [C@19821f
}[/code] Por que os resultados diferentes?
Simplesmente não tem a ver com o toString(), e sim com o método println da classe PrintStream
Leia a diferença sobre quando ele recebe um array de char.[/quote]
Valeu, digao!
O println se comporta diferente quando mando um arranjo de caracteres. Arranjos são objetos. Assim, se mando um arranjo de int, a impressão é a representação textual desse objeto. Já enviando um arranjo de char, o comportamento muda, imprimindo os seus valores.
Ah… claro. O Digão matou a charada. Existe um println que recebe um char[]. Nesse caso é esse método que faz a impressão do conteúdo do char[].