O operador + concatena Strings se um dos operandos da operação usando + for uma String.
No caso abaixo, se nenhum dos operandos é uma String porque o programa compila e roda sem erros???
public class TestConc {
public static void main (String [] args) {
System.out.println (true + null);
System.out.println (null + null);
}
}
/*
* imprime:
*
* truenull
* nullnull
*
*/
Putz cara, essa é meio embaçado de responder, mas também é bastante interessante…
Eu acho que deve ter alguma coisa relacionada com o método toString(), pois todos os tipos em java herdam de Object, e a classe Object tem o método toString(). Assim, como o true e false são tipos da classe Boolean que implementa o toString(), pode ser que na hora da chamada do println ele chame o toString() do valor true ou false e assim ele se torna uma String, podendo ser concatenada com o null.
Não sei se null também funciona desta maneira. Provavelmente sim…
Não tenho certeza do que eu disse, foi só uma suposição. Se eu estiver errado peço que me corrijam
Um abraço
Franklin
O que acontece é o seguinte…
A Classe String tem algumas particularidades em relação á outros tipos no Java.
Ela tem alguns operadores sobrecarregados. ex. +, +=
Toda vez que se concatena dois objetos, gera-se uma nova String a partir do resultado do metodo toString() deles que ficará disponícel no StringPool da JRE.
Os tipos primitivos são transformados em String, antes de serem concatenados.
entao
String nome = “Oziel”;
String sobrebome;
int idade = 27;
Integer nascimento = new Integer(1975);
String nomeCompleto = nome;
nomeCompleto += sobrenome
System.out.println( nomeCompleto );
String relatorio = nomecCompleto + idade + nascimento;
System.out.println( relatorio );
Bom estudo.
quer dizer então que no código abaixo, a linha //a NÃO dá erro, porque de alguma forma toString() é aplicado sobre null e a linha b dá erro porque o operador + está sendo aplicado sobre dois primitivos???
public class TestConc3 {
public static void main (String [] args) {
System.out.println (3 + null); // a
System.out.println (3 + true); // b
}
}
/*
C:Scopusjava2003certTestConc3.java:4: operator + cannot be applied to int,boolean
System.out.println (3 + true);
^
1 error
*/
Soube nas minhas andanças por outros fóruns (javaranch e jdiscuss):
O método toString() só é chamado automaticamente com dois operandos do operador binário + quando um dos operandos for uma referência para um objeto da classe String. No caso, true + null ou qualquer primitivo + null deveria dar um erro de compilação.
Mais detalhes:
http://developer.java.sun.com/developer/bugParade/bugs/4717193.html
Acho que devo me apressar e fazer minha prova logo e fuçar menos, ou logo já não vou saber mais o que é ou o que deveria ser correto. Ou então desinstalar o jdk 1.4 e voltar ao bom e velho 1.2 …
[quote=“marciolx”]quer dizer então que no código abaixo, a linha //a NÃO dá erro, porque de alguma forma toString() é aplicado sobre null e a linha b dá erro porque o operador + está sendo aplicado sobre dois primitivos???
[code]
public class TestConc3 {
public static void main (String [] args) {
System.out.println (3 + null); // a
System.out.println (3 + true); // b
}
}
/*
C:Scopusjava2003certTestConc3.java:4: operator + cannot be applied to int,boolean
System.out.println (3 + true);
^
1 error
*/
[/code][/quote]
Baixei o novo beta do sdk 1.4.2 e parece que as coisas melhoraram, o compilador apresentou todos os erros e até mais do que eu esperava:
C:Scopusjava2003certTestConc3.java:3: operator + cannot be applied to int,<nulltype>
System.out.println (3 + null); // a
^
C:Scopusjava2003certTestConc3.java:3: reference to println is ambiguous, both method println(char[]) in java.io.PrintStream and method println(java.lang.String) in java.io.PrintStream match
System.out.println (3 + null); // a
^
C:Scopusjava2003certTestConc3.java:4: operator + cannot be applied to int,boolean
System.out.println (3 + true); // b
^
3 errors
Só espero que o novo sdk tenha apenas corrigido os bugs e não acrescentado outros…