Porque quando imprimir um resultado emJava temos que usar o + antes e depois da variavel?
Manda um exemplo dessa situação.
Por favor, coloque o seu código!
public String detalhes()
{
return "Livro{" + "titulo=" + titulo + ", autor=" + autor + "\n, totPaginas=" + totPaginas + ", pagAtual=" + pagAtual + "\n, aberto=" + aberto + ", leitor=" + leitor.getNome() +", idade=" + leitor.getIdade() +" \n, sexo="+ leitor.getSexo()+ '}';
}
Chama-se Concatenação de String
Leitura Obrigatória:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.1
Obrigado.
Entendi. Antes de responder, vou te explicar algumas coisas.
Em C++, os operadores da linguagem (+, -, /, %, *, <<, >>, etc) servem para qualquer coisa. Você pode por exemplo, somar um objeto da classe Carro, com um objeto da classe Moto, contanto que você escreva a chamada sobrecarga de operadores (ou operator overloading). Você simplesmente escreve uma função, tipo assim:
Veiculo operator+(Moto& moto, Carro& carro) {
...
}
E pronto, a mágica está feita. Podemos somar motos com carros e obter um veículo de resultado. Isso também serve para strings. Se você soma duas Strings em C++, o resultado é uma nova string, com o conteúdo das duas que foram chamadas. Por isso, o operador + concatenta strings.
Quando o Java foi criado, foi tomada uma decisão: é proibido fazer sobrecarga de operadores. Não sei explicar o motivo (por ignorância mesmo, nunca fui atrás de saber), mas essa foi a decisão tomada. Operadores servem apenas para tipos primitivos numéricos e booleano. Não tem como somar objetos (como Moto e Carro) em Java com o operador de soma.
Mas pera aí: Strings são objetos. Porque é que somar duas Strings funciona?
A classe String é um caso excepcional. O projetistas da linguagem abriram uma exceção para a regra de que é proibido fazer sobrecarga de operadores. Contudo, não é realmente uma sobrecarga que acontece. Não existe uma função secreta que recebe duas Strings e retorna a concatenação.
O que acontece, por baixo dos panos, é o seguinte. Quando você soma Strings, dessa forma:
String hello = "Hello, " + "world!";
O compilador transforma esse código em:
String hello = new StringBuilder().append("Hello, ").append("world!").toString();
A classe StringBuilder faz o trabalho de concatenar as Strings, através da utilização de arrays de caracteres. Dá uma olhadinha na implementação se estiver curioso: AbstractStringBuilder e StringBuilder.
Existe mas é hard-coded/inacessível pelo usuário. Em C++ se o operador for inline o compilador também não vai gerar uma chamada de função, que é o mesmo que acontece na implementação Java.
Sim, existe mas é inacessível mesmo, e acontece apenas nos casos de números, como int + int e float + float.
Mas para o caso de Strings, não é sobrecarga. O compilador literalmente troca os + por um StringBuilder.
Nesse post o cara mostra o bytecode gerado e comprova isso.
É só syntax sugar. Não existe um operador + (uma função mesmo) que concatena as Strings.
Colega, você não entendeu meu post anterior. Eu sei o bytecode que é gerado, é análogo ao que é gerado em C++. Isso só quer dizer que o compilador fez inlining do código. Mas claro, a sobrecarga de operador no caso do Java é hardcoded no compilador, só é bom deixar claro que pra existir sobrecarga não precisa ter um chamada de metodo, basta um operador realizar mais de uma operação. Mesmo no caso de um metodo com sobrecarga o compilador poderia decidir fazer inline do mesmo. Uma coisa não tem a ver com a outra.
Olhando pela pergunta e vendo as respostas do @lvbarbosa e do @Kronal, me lembrei das aulas de assembly, na faculdade (para o processador do mega drive, arquitetura RISC): registrador 0 diz: ULA, some!
Sim, tem razão.